版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課程設計任務書</b></p><p> 學院___________專業(yè)____________班級________姓名_________</p><p> 課程設計題目:______________________________________</p><p> 課程設計主要參考資料:</p>
2、<p> (1)_____________________________________________________</p><p> (2)_____________________________________________________</p><p> (3)______________________________________________
3、_______</p><p> (4)_____________________________________________________</p><p> ________________________________________________________</p><p> 課程設計應解決的主要問題:</p><p&g
4、t; (1)_____________________________________________________</p><p> (2)_____________________________________________________</p><p> (3)_____________________________________________________&l
5、t;/p><p> (4)_____________________________________________________</p><p> ________________________________________________________</p><p> 課程設計相關附件(如:圖紙、軟件等):</p><p>
6、 (1)_____________________________________________________</p><p> (2)_____________________________________________________</p><p> (3)_____________________________________________________</
7、p><p> (4)_____________________________________________________</p><p> ________________________________________________________</p><p> 課程設計開始日期:_____________________ </p>
8、<p> 課程設計完成日期:_____________________</p><p> 指導老師簽字:_______________指導老師對課程設計的評語</p><p> 指導老師簽字:__________</p><p> ___年____月___日 </p><p> 主要器件與軟件介紹:</p>
9、<p><b> 單片機介紹:</b></p><p> 單片微型計算機簡稱單片機,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的縮寫MCU表示單片機,它最早是被用在工業(yè)控制領域。單片機由芯片內僅有CPU的專用處理器發(fā)展而來。最早的設計理念是通過將大量外圍設備和CPU集成在一個芯片中,使計算機系統(tǒng)更小,更容易集成進復雜的而對體積要求嚴格的控
10、制設備當中。INTEL的Z80是最早按照這種思想設計出的處理器;</p><p> 單片機有40個引腳,功能大致可以分為4個種類:電源、時鐘、控制和I/O引腳。</p><p><b> ⑴電源:</b></p><p> VCC - 芯片電源,接+5V;</p><p> VSS - 接地端;</p>
11、;<p> ?、茣r鐘:XTAL1、XTAL2—晶體</p><p> 振蕩電路反相輸入端和輸出端;</p><p> ?、强刂疲嚎刂凭€一共有4根:</p><p> ALE/PROG:地址所存允許</p><p> /片內EPROM編程脈沖</p><p> PSEN:外ROM讀選通信號</
12、p><p> RST/VPD:復位/備用電源</p><p> EA/Vpp:內外ROM選擇/</p><p> 片內EPROM編程電源</p><p><b> ?、菼/O引腳:</b></p><p> 80C51共有4個8位并行I/O端口:</p><p> P
13、0、P1、P2、P3口,共32個引腳。</p><p> P3口還具有第二功能,用于特殊</p><p> 信號輸入輸出和控制信號(屬控制總線)</p><p><b> P3口第二功能:</b></p><p> P30 RXD 串行輸入口</p><p> P31 TXD 串行輸出口
14、</p><p> P32 INT0 外部中斷0(低電平有效)</p><p> P33 INT1 外部中斷1(低電平有效)</p><p> P34 T0 定時計數器0</p><p> P35 T1 定時計數器1</p><p> P36 WR 外部數據存儲器寫選通(低電平有效)</p>&
15、lt;p> P37 RD 外部數據存儲器讀選通(低電平有效)</p><p> 74HC164介紹:</p><p> 8位串入、并出移位寄存器</p><p> 74HC164、74HCT164 是高</p><p> 速硅門 CMOS 器件,與低</p><p> 功耗肖特基型 TTL (LSTT
16、L</p><p> ) 器件的引腳兼容。74HC</p><p> 164、74HCT164 是 8 位邊</p><p> 沿觸發(fā)式移位寄存器,串</p><p> 行輸入數據,然后并行輸</p><p> 出。數據通過兩個輸入端</p><p> ?。―SA 或 DSB)之一串行
17、</p><p> 輸入;任一輸入端可以用</p><p> 作高電平使能端,控制另</p><p> 一輸入端的數據輸入。兩</p><p> 個輸入端或者連接在一起</p><p> ,或者把不用的輸入端接</p><p> 高電平,一定不要懸空。</p><
18、p><b> 數碼管介紹:</b></p><p> 按發(fā)光二極管單元連接方</p><p> 式分為共陽極數碼管和共</p><p> 陰極數碼管。共陽數碼管</p><p> 是指將所有發(fā)光二極管的</p><p> 陽極接到一起形成公共陽</p><p&
19、gt; 極(COM)的數碼管。共陽</p><p> 數碼管在應用時應將公共</p><p> 極COM接到+5V,當某</p><p> 一字段發(fā)光二極管的陰極</p><p> 為低電平時,相應字段就</p><p> 點亮。當某一字段的陰極</p><p> 為高電平時,相應
20、字段就</p><p> 不亮。。共陰數碼管是指</p><p> 將所有發(fā)光二極管的陰極</p><p> 接到一起形成公共陰極(C</p><p> OM)的數碼管。共陰數碼</p><p> 管在應用時應將公共極C</p><p> OM接到地線GND上,</p>
21、<p> 當某一字段發(fā)光二極管</p><p> 的陽極為高電平時,相應字段就點亮。當某一字段的陽極為低電平時,相應字段就不亮。</p><p> Keil uVision2 軟件介紹:</p><p> Keil uVision2是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng),使用接近于傳統(tǒng)C語言的語法來開發(fā),
22、與匯編相比,C語言在功能上、結構上、可讀性、可維護性上有明顯的優(yōu)勢,因而易學易用,而且大大的提高了工作效率和項目開發(fā)周期, 他還能嵌入匯編,您可以在關鍵的位置嵌入,使程序達到接近于匯編的工作效率。</p><p> Keil C51軟件提供豐富的庫函數和功能強大的集成開發(fā)調試工具,全Windows界面,使愛好者在很短的時間內就能學會使用keil c51來開發(fā)您的單片機應用程序;</p><p
23、> Proteus7 軟件介紹:</p><p> Proteus軟件是英國Labcenter electronics公司出版的EDA工具軟件。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。它是目前最好的仿真單片機及外圍器件的工具。雖然目前國內推廣剛起步,但已受到單片機愛好者、從事單片機教學的教師、致力于單片機開發(fā)應用的科技工作者的青睞。Proteus是世界上著名的EDA工具,從原理
24、圖、代碼調試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設計,真正實現了從概念到產品的完整設計。</p><p> 是目前世界上唯一將電路仿真軟件、PCB設計軟件和虛擬模型仿真軟件三合一的設計平臺,其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即將增加Cortex和DSP系列處理器,并持續(xù)增加其他系列處理器模型。
25、在編譯方面,它也支持IAR、Keil和MPLAB等多種編譯器。</p><p> Protel 99 SE 介紹:</p><p> Protel99SE是應用于Windows9X/2000/NT操作系統(tǒng)下的EDA設計軟件,采用設計庫管理模式,可以進行聯網設計,具有很強的數據交換能力和開放性及3D模擬功能,是一個32位的設計軟件,可以完成電路原理圖設計,印制電路板設計和可編程邏輯器件設
26、計等工作,可以設計32個信號層,16個電源--地層和16個機加工層。⑴電路工程設計部分:</p><p> ?、?電路原理設計部分:電路原理設計部分包括電路圖編輯器(簡稱SCH)、電路圖零件庫編輯器(簡稱Schlib編輯器)和各種文本編輯器。</p><p> ② 印刷電路板設計系統(tǒng):印刷電路板設計系統(tǒng)包括電路板編輯器(簡稱PCB編輯器)、零件封裝編輯器(簡稱PCBLib編輯器)和電路
27、板組件管理器。</p><p> ③ 自動布線系統(tǒng):自動布線系統(tǒng)包含一個基于形狀的無柵格自動布線器,用于印刷電路板的自動布線,以實現PCB設計的自動化。</p><p> ⑵電路仿真與PLD部分:</p><p> ?、?電路模擬仿真系統(tǒng):電路模擬仿真系統(tǒng)包含一個數字/模擬信號仿真器,可提供連續(xù)的數字信號和模擬信號,以便對電路原理圖進行信號模擬仿真從而驗證其正確
28、性與可行性。</p><p> 可編程邏輯設計系統(tǒng):可編程邏輯系統(tǒng)包含一個有語法功能的文本編輯器和一個波形編輯器。主要功能是對邏輯電路進行分析、綜合;觀察信號的波形。利用PLD系統(tǒng)可以最大限度的精簡邏輯部件,使數字電路設計達到最簡化。</p><p> 高級信號完整性分析系統(tǒng):高級信號完整性分析系統(tǒng)提供了一個精確的信號完整性模擬器,可用來分析PCB設計、檢查電路設計參數、實驗超調量、阻
29、抗和信號諧波要求等。</p><p><b> 二、設計步驟:</b></p><p> 1.protel使用:</p><p><b> ?、女嬙韴D:</b></p><p><b> ?、龠x組件:</b></p><p> 選出單片機、74H
30、C164、去耦電容、瓷片電容、數碼管、穩(wěn)壓管、電解電容、按鍵。</p><p><b> ?、陔娐窐嬙欤?lt;/b></p><p> 三個按鍵,一個模式鍵、一個加鍵、一個減鍵,分別接入單片機的p1.2、p1.1、p1.0,設置串口發(fā)送波特率,RXD送到A、B,TXD送到CP,當做時鐘用,其中</p><p> 74HC164與數碼管相連得準確
31、,否則會亂碼。注意,因為購買器件</p><p> 時,按鍵是4腿的,所以</p><p> 畫原理圖時盡量與實物圖</p><p> 一致,更改按鍵如右圖:</p><p><b> 電路連線:如圖</b></p><p> ?、飘嫲鎴D:先編號(TOOLS->Annotate…),
32、再生成網標文件(Design->Create Netlist…),再打開.PCB文件,導入剛生成的網表文件(Design->Load Nets…),再手工布局布線,同時注意規(guī)則,如電源線加粗之類的地方,另外在正確連線的基礎上,盡量美觀。</p><p> 另外其三維俯視圖如下圖:</p><p> 然后送至生產PCB板的廠家生產板子,購買器件,焊接,燒寫程序,調試程序,直至
33、完成設計要求。</p><p> 2.Keil uVision2 使用:</p><p> ?、判陆üこ?,保存之后并選擇相關單片機類型,如下圖:</p><p> 下圖選擇ATMEL公司的AT89從C51系列單片機類型:</p><p> ?、铺砑游募?選擇Target 1->Source Group 1,右擊選擇Add File
34、s to Group ‘Source Group 1’如圖:</p><p> ?、浅绦蛘{試:程序對p1.0、</p><p> p1.1、p1.2口在reg51.h中定義,否則會出錯。編譯結果:</p><p> 3.Proteus使用:</p><p> ?、女嬙韴D:選器件,51單片機、74HC164、LED、氣段數碼管、穩(wěn)壓管、電
35、容(因為由于Proteus仿真功能強大,仿真時復位電路不需加,電阻都不用加,但在Proutel中畫原理圖和PCB都加上用于實際電路焊接,復位時顯示11年1月1日,這是編程決定的,在后續(xù)程序中提到,這里不贅述。),先顯示下圖:</p><p> ⑵仿真:添加hww.hex文件到單片機中,并設置成6MHZ,開始運行:</p><p> 接下來立即就顯示11年1號1日:</p>
36、<p> 大概過0.5秒的接下來顯示12點整:</p><p> 下來顯示的時分秒就不截圖了,截年月日這關鍵圖:</p><p> 多截圖,以提供動態(tài)顯示的效果:(當對日先加到3號)</p><p> 再按減,慢慢減到1號:</p><p> 但是減到1號后,就不再減,只是閃爍(原因在特別注意中有解釋):</p&g
37、t;<p> 再按加,因為當前是1月,加到31號后就為2月1號:</p><p> 因為11年(不是閏年)的2月份只有28天,故之后就為3月1號:</p><p> 再調年數,看看閏年的2月份是否是29天:</p><p> 如上圖所示,完全正確;</p><p> 再調,看看4月份,是否為30天:</p>
38、<p><b> 如圖完全正確;</b></p><p> 看看時分秒、年月日進位情況,為了把所有的數碼管都用上,故設置成99年12月31號23點59分59秒:</p><p> 再過一秒就是00年1月1號00點00分00秒:</p><p> 以上圖都說明這些時分秒年月日顯示及進位都沒問題,證明程序沒問題,滿足設計要求。
39、</p><p><b> 程序說明:</b></p><p> ?、倍x變量(簡要變量):</p><p> ?、棚@示緩沖區(qū)unsigned char DispBuf[6];</p><p> ?、平Y構體變量Time、Calendar,其中成員分別為Hour、Min、Sec和Yea、Mon、Day,用于顯示;<
40、/p><p><b> ?、菢酥疚?lt;/b></p><p> Flag2、Flag1、Flag0,分別對應p1.0、p1.1、p1.2口的標志位;</p><p> Flag_Time、Flag_Calendar對應用于顯示時分秒還是年月日;</p><p> Flash_flag、DisPlay_Back對應閃爍顯示
41、和緩沖區(qū)備份</p><p> LEDCode[]、ErrorLEDCode[]分別對應正確和錯誤版圖的要顯示的十個數0到9;</p><p> ⒉定義函數(簡單函數):</p><p> ?、?年月日顯示函數:說明:不管閏年還是不閏年也好,1、3、5、7、8、10、12月份都是31天,而4、6、9、11都是30天,用switch語句多路分支,只有2月份當閏年時
42、是29天,否則為28天,這時候要進行判斷;</p><p> void test_calendar(void)</p><p> { switch(Calendar.Mon)</p><p><b> {case 1:</b></p><p><b> case 3:</b></p&g
43、t;<p><b> case 5:</b></p><p><b> case 7:</b></p><p><b> case 8:</b></p><p><b> case 10:</b></p><p><b>
44、 case 12:</b></p><p> {if(Calendar.Day>=31)</p><p> {Calendar.Day=1;</p><p> Calendar.Mon++;}</p><p> else if(Calendar.Day<=30)</p><p> {C
45、alendar.Day++;}</p><p><b> }break;</b></p><p><b> case 2:{</b></p><p> if(((Calendar.Yea+2000)%4)==0)</p><p> {if(Calendar.Day>=29)</p
46、><p> {Calendar.Day=1;</p><p> Calendar.Mon++;}</p><p> else if(Calendar.Day<=28)</p><p> {Calendar.Day++;}</p><p><b> }</b></p>&l
47、t;p><b> else</b></p><p> {if(Calendar.Day>=28)</p><p> {Calendar.Day=1;</p><p> Calendar.Mon++;}</p><p> else if(Calendar.Day<=27)</p>
48、<p> {Calendar.Day++;}</p><p><b> }</b></p><p><b> }break;</b></p><p><b> case 4:</b></p><p><b> case 6:</b>&l
49、t;/p><p><b> case 9:</b></p><p> case 11:{ if(Calendar.Day>=30)</p><p> {Calendar.Day=1;</p><p> Calendar.Mon++;}</p><p> else if(Calendar
50、.Day<=29)</p><p> {Calendar.Day++;}</p><p> } break; </p><p><b> } </b></p><p> if(Calendar.Mon>=13)</p><p> {Calendar.Mo
51、n=1;</p><p> Calendar.Yea++;};</p><p><b> }</b></p><p><b> ?、程貏e說明:</b></p><p> ⑴調表時只有機械地加減,并不考慮進位和借位;</p><p> ?、圃陲@示年月日時,四個LED燈均不
52、亮,以便和時分秒區(qū)分;</p><p> ?、前醇訙p時,只需要按一下即可實現調多下的功能(因為按鍵畢竟靈活有限,這樣每秒增或減即人性化又科學化,又方便簡單)</p><p> ?、让總€數碼管發(fā)生變化時(肉眼看到的表面現象)只在每半秒跳動,這樣肉眼很容易分別,看起來也美觀大方,不別扭;</p><p> ?、商頃r,對時分秒調時,加減情況只與對應的管有關聯,故需對其他
53、位管調時,再按一下增或減;</p><p> ?、蕸]有按鍵按下時,故顯示時分秒,當模式鍵按一下對秒(同時可以按下其它兩鍵進行調表)操作,再按一下是分,下一次是時,再按一下就顯示年月日,再按模式鍵就對日(同時可以按下其它兩鍵進行調表)操作,再按一下是月,下一次是年,最后一次就回到顯示時分秒;各位都正常進位,完全正確;</p><p> ?、吮境绦蚰曛荒茱@示兩位,故最多只能顯示0到99,默認為
54、2000年到2099年,根據閏年規(guī)則,能被100或400整除的,或者是不能被100整除,但能被4整除的也是閏年,其2月份是28天,不是閏年就是29天,這些由(Proteus)上圖來示意演示;</p><p> ?、陶{年月日時,減操作(對日)能減,但當減到1號時,號就不再減,只是閃爍(這由內部函數test_calendar()加加,而到調表函數case 5中是減減,故不能實現減,只能閃爍)而加操作可以使號數增加,還
55、可以使月增加,甚至年增加;</p><p><b> 三、程序清單:</b></p><p> #include<reg51.h></p><p> #include<stdio.h></p><p> unsigned char DispBuf[6]; //顯示緩沖區(qū)<
56、/p><p> struct //設定時間結構體</p><p> {unsigned char Hour;</p><p> unsigned char Min;</p><p> unsigned char Sec; </p><p><b> }Ti
57、me; </b></p><p> struct //設定時間結構體</p><p> {unsigned char Yea;</p><p> unsigned char Mon;</p><p> unsigned char Day; </p><p&
58、gt; }Calendar; </p><p> unsigned char point=0;</p><p> unsigned char Flag0=0;</p><p> unsigned char Flag_Time=0;</p><p> unsigned char Flag_Calendar=0;</p>
59、<p> unsigned char Flag1=0;</p><p> unsigned char Flag2=0;</p><p> unsigned char T0_Int_Times=0; //中斷次數計數變量</p><p> unsigned char Flash_flag=0; //閃爍標志,每半秒閃爍</p
60、><p> unsigned char DisPlay_Back=0; //顯示緩沖區(qū)更新備份,如果顯示緩沖區(qū)更新則跟閃爍標志不一致</p><p> code unsigned char LEDCode[]={0x01,0xd7,0x22,0x82,0xc4,0x88,0x08,</p><p> 0xc1,0x00,0x80,0xff}; //數碼
61、管顯示代碼</p><p> code unsigned char ErrorLEDCode[]={0x01,0xe7,0x12,0x82,0xc4,</p><p> 0x88,0x08,0xc1,0x00,0x80};//繪制錯誤圖紙的數碼管顯示代碼</p><p> //***************************************
62、***</p><p> // 年月日顯示函數</p><p> //*******************************************</p><p> void test_calendar(void)</p><p><b> {</b></p><p> swi
63、tch(Calendar.Mon)</p><p><b> {case 1:</b></p><p><b> case 3:</b></p><p><b> case 5:</b></p><p><b> case 7:</b></p
64、><p><b> case 8:</b></p><p><b> case 10:</b></p><p><b> case 12:</b></p><p> {if(Calendar.Day>=31)</p><p> {Calend
65、ar.Day=1;</p><p> Calendar.Mon++;}</p><p> else if(Calendar.Day<=30)</p><p> {Calendar.Day++;}</p><p><b> }break;</b></p><p><b>
66、case 2:{</b></p><p> if(((Calendar.Yea+2000)%4)==0)</p><p> {if(Calendar.Day>=29)</p><p> {Calendar.Day=1;</p><p> Calendar.Mon++;}</p><p> e
67、lse if(Calendar.Day<=28)</p><p> {Calendar.Day++;}</p><p><b> }</b></p><p><b> else</b></p><p> {if(Calendar.Day>=28)</p><p
68、> {Calendar.Day=1;</p><p> Calendar.Mon++;}</p><p> else if(Calendar.Day<=27)</p><p> {Calendar.Day++;}</p><p><b> }</b></p><p><
69、b> }break;</b></p><p><b> case 4:</b></p><p><b> case 6:</b></p><p><b> case 9:</b></p><p> case 11:{ if(Calendar.Day&
70、gt;=30)</p><p> {Calendar.Day=1;</p><p> Calendar.Mon++;}</p><p> else if(Calendar.Day<=29)</p><p> {Calendar.Day++;}</p><p> } break; &l
71、t;/p><p><b> } </b></p><p> if(Calendar.Mon>=13)</p><p> {Calendar.Mon=1;</p><p> Calendar.Yea++;};}</p><p> //**************************
72、*****************//***************************************************</p><p> // Ini 初始化代碼</p><p> // 設定50ms中斷一次,注:在Fosc=6MHZ情況下</p><p> //*****************************
73、***********************</p><p> void Ini(void)</p><p><b> { </b></p><p> Time.Sec=0;</p><p> Time.Min=0;</p><p> Time.Hour=12;</p>
74、<p> Calendar.Yea=11;</p><p> Calendar.Mon=01;</p><p> Calendar.Day=01;</p><p> TH0=(65536-25000)/256;</p><p> TL0=(65536-25000)%256;</p><p>
75、TMOD=0x01;</p><p><b> TR0=1;</b></p><p><b> ET0=1;</b></p><p><b> EA=1;</b></p><p><b> }</b></p><p> /
76、/*****************************************************</p><p> // 把顯示緩沖區(qū)的內容發(fā)到74HC164</p><p> //***************************************************** </p><p> void DisPla
77、yBuf(void)</p><p><b> {</b></p><p> unsigned char i;</p><p> for(i=0;i<6;i++)</p><p><b> {</b></p><p> SBUF=DispBuf[i];<
78、/p><p> while(TI==0); //等待發(fā)送完畢</p><p> TI=0; //把發(fā)送完標志清掉以備下次再用 </p><p><b> };</b></p><p><b> }</b></p><p> /
79、/****************************************************** </p><p> // 定時器中斷</p><p> //******************************************************</p><p> void T0_Int(void)
80、interrupt 1 using 1</p><p><b> {</b></p><p> TH0=(65536-25000)/256; //定時器裝填</p><p> TL0=(65536-25000)%256;</p><p> T0_Int_Times++; //中斷次數加<
81、;/p><p> if(T0_Int_Times>=10) //每半秒更新閃爍標志</p><p> {Flash_flag =1;}</p><p><b> else</b></p><p> {Flash_flag =0;};</p><p> if(T0_Int_Tim
82、es>=20)//如果中斷20次為1秒的時間開始更新時、分、秒</p><p><b> {</b></p><p> T0_Int_Times=0;</p><p> Time.Sec++;</p><p> if(Time.Sec>=60)</p><p> {Time.
83、Sec=0;</p><p> Time.Min++;</p><p> if(Time.Min>=60)</p><p> {Time.Min=0;</p><p> Time.Hour++;</p><p> if(Time.Hour>=24)</p><p> {T
84、ime.Hour=0;</p><p> test_calendar(); </p><p> } </p><p><b> }</b></p><p><b> } </b></p><p><b> }</b><
85、;/p><p><b> }</b></p><p> //*******************************************</p><p> // 把時間轉換為可以顯示的代碼</p><p> //*******************************************
86、</p><p> void ChangeToDispCode_Calendar(void)</p><p> {DispBuf[0]=LEDCode[Calendar.Yea/10];</p><p> DispBuf[1]=LEDCode[Calendar.Yea%10]; </p><p> DispBuf[2]=LEDC
87、ode[Calendar.Mon/10];</p><p> DispBuf[3]=LEDCode[Calendar.Mon%10];</p><p> DispBuf[4]=ErrorLEDCode[Calendar.Day/10];</p><p> DispBuf[5]=LEDCode[Calendar.Day%10];}</p><
88、p> void ChangeToDispCode_Time(void)</p><p> {DispBuf[0]=LEDCode[Time.Hour/10];</p><p> DispBuf[1]=LEDCode[Time.Hour%10]; </p><p> DispBuf[2]=LEDCode[Time.Min/10];</p&g
89、t;<p> DispBuf[3]=LEDCode[Time.Min%10];</p><p> DispBuf[4]=ErrorLEDCode[Time.Sec/10];</p><p> DispBuf[5]=LEDCode[Time.Sec%10];}</p><p> //********************************
90、***********</p><p> // 主程序</p><p> //*******************************************</p><p> void main (void)</p><p><b> {</b></p><p>
91、; unsigned int j;</p><p> Ini(); //初始化</p><p> ChangeToDispCode_Calendar();</p><p> DispBuf[2]=DispBuf[2]|0x10; //雙點熄滅</p><p> DispBuf[4]
92、=DispBuf[4]|0x20;</p><p> DisPlayBuf();</p><p> for(j=0;j<=32000;j++); //延時</p><p> Flag_Time=1; //顯示時分秒</p><p><b> for(;;)</b></p
93、><p> {if(p1_2==0) //掃描模式鍵有無按下</p><p><b> {Flag0=0;</b></p><p><b> Flag1=0;</b></p><p><b> Flag2=1;</b></p><p&
94、gt; for(j=0;j<=20000;j++);</p><p><b> if(p1_2)</b></p><p> {point=(point+1)%8;} //模式累加以供作多路選擇</p><p><b> }</b></p><p> else if(p1_
95、1==0) //"+"鍵掃描,增</p><p> {for(j=0;j<=20000;j++);</p><p><b> if(p1_1)</b></p><p> {Flag1=1; //若有"+",則把"-"置零</p
96、><p><b> Flag0=0;}</b></p><p><b> }</b></p><p> else if(p1_0==0) //"-"鍵掃描,減</p><p> {for(j=0;j<=20000;j++);</p><
97、;p><b> if(p1_0)</b></p><p> {Flag0=1; //若有"-",則把"+?置零</p><p><b> Flag1=0;}</b></p><p><b> }</b></p><p> el
98、se if(Flag2) //模式多路選擇</p><p> {switch(point) </p><p><b> {case 1:</b></p><p><b> case 2:</b></p><p> case 3:{Flag_Time=1;</p&
99、gt;<p> Flag_Calendar=0;</p><p><b> }break;</b></p><p> case 4: {Flag_Calendar=1; //模式4用來顯示年月日</p><p> Flag_Time=0;</p><p> ChangeToDispCode_Cal
100、endar();</p><p> DispBuf[2]=DispBuf[2]|0x10; //雙點熄滅</p><p> DispBuf[4]=DispBuf[4]|0x20;</p><p> DisPlayBuf();</p><p><b> }break;</b></p><p&g
101、t;<b> case 5:</b></p><p><b> case 6:</b></p><p> case 7: {Flag_Calendar=1;</p><p> Flag_Time=0;</p><p><b> }break;</b></p>
102、;<p> default:{Flag_Time=1; //否則就僅僅顯示時分秒自動計時</p><p> Flag_Calendar=0;</p><p><b> point=0;</b></p><p><b> Flag0=0;</b></p><p><b&g
103、t; Flag1=0;</b></p><p><b> }break;</b></p><p><b> }</b></p><p> Flag2=0;} </p><p><b> else </b></p><p> {if
104、(DisPlay_Back!=Flash_flag) //是否顯示?</p><p> {DisPlay_Back=Flash_flag; //顯示過后要半秒后再?</p><p> if(Flag_Time)</p><p> {ChangeToDispCode_Time(); //轉化時分秒為可顯示代碼 </p><p> if(
105、Flash_flag) //更新雙點閃爍</p><p> {DispBuf[2]=DispBuf[2]|0x10; //雙點熄滅</p><p> DispBuf[4]=DispBuf[4]|0x20;</p><p> if(point>0)</p><p> {switch(point%4)<
106、/p><p> {case 1:{DispBuf[5]=0x0ff;//使對應的數碼管滅,以達到閃爍效果</p><p> DispBuf[4]=LEDCode[10];}break;</p><p> case 2:{DispBuf[3]=LEDCode[10];</p><p> DispBuf[2]=LEDCode[10];}bre
107、ak;</p><p> case 3:{DispBuf[1]=LEDCode[10];</p><p> DispBuf[0]=LEDCode[10];}break;</p><p><b> }</b></p><p><b> } </b></p><p>&
108、lt;b> }</b></p><p> else if(Flash_flag==0)</p><p> {switch (point)</p><p> {case 1: {if(Flag1) //通過"+""-"來調表</p><p> {Time.Sec=(Time.
109、Sec+1)%60;}</p><p> else if (Flag0) {Time.Sec=(Time.Sec+60-1)%60;}}break;</p><p> case 2: {if(Flag1) {Time.Min=(Time.Min+1)%60;}</p><p> else if (F
110、lag0) {Time.Min=(Time.Min+60-1)%60;}}break;</p><p> case 3: {if(Flag1)</p><p> {if( Time.Hour>=23)</p><p> {Time.Hour=0; Calendar.Day+
111、+;}</p><p> else {Time.Hour++;}</p><p><b> }</b></p><p> else if (Flag0) {Time.Hour=(Time.Hour+24-1)%24;}</p><p>&
112、lt;b> }break;</b></p><p><b> } </b></p><p> DispBuf[2]=DispBuf[2]&0xef; //點亮雙點</p><p> DispBuf[4]=DispBuf[4]&0xdf;};} </p><p> if(Fl
113、ag_Calendar)</p><p> {ChangeToDispCode_Calendar(); //轉化年月日為可顯示代碼 </p><p> DispBuf[2]=DispBuf[2]|0x10; //雙點熄滅,使</p><p> DispBuf[4]=DispBuf[4]|0x20;</p><p> if(Flash
114、_flag) //更新雙點閃爍</p><p> {if(point>0)</p><p> {switch(point%4)</p><p> {case 1: {DispBuf[5]=0x0ff;</p><p> DispBuf[4]=LEDCode[10]; }break;</p>&
115、lt;p> case 2: {DispBuf[3]=LEDCode[10];</p><p> DispBuf[2]=LEDCode[10];}break;</p><p> case 3: {DispBuf[1]=LEDCode[10];</p><p> DispBuf[0]=LEDCode[10];}break;</p><p
116、><b> }</b></p><p><b> } </b></p><p><b> }</b></p><p><b> else </b></p><p> {switch(point)</p><p>
117、 {case 5: </p><p> {if(Flag1)</p><p> { test_calendar(); }</p><p> else if(Flag0)</p><p> {if(Calendar.Day==1)</p><p> { test_calendar();</p>
118、<p> Calendar.Day--;} </p><p><b> else</b></p><p> {Calendar.Day--;}</p><p><b> } }break;</b></p><p><b> case 6:</b></p
119、><p> {if(Flag1)</p><p> {if(Calendar.Mon>=12)</p><p> {Calendar.Mon=1;</p><p> Calendar.Yea++;}</p><p><b> else</b></p><p>
120、 {Calendar.Mon++;}}</p><p> else if (Flag0)</p><p> {if(Calendar.Mon==1)</p><p> {Calendar.Mon=12;}</p><p><b> else</b></p><p> {Calendar.
121、Mon--;}}</p><p><b> }break;</b></p><p> case 7:{if(Flag1) {Calendar.Yea=(Calendar.Yea+1)%100;}</p><p> else if (Flag0) {Calendar.Yea=
122、(Calendar.Yea+100-1)%100;}</p><p><b> }break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><
123、p> DisPlayBuf();</p><p><b> } </b></p><p><b> }</b></p><p><b> }</b></p><p> } </p><p><b>
124、設計心得:</b></p><p><b> ⒈問題總結:</b></p><p> ?、疟敬握n程設計過程中,遇到很多問題,C語言學得不夠扎實,比如一些簡單的if 、else if語句混用,導致程序得不到想要的結果;</p><p> ⑵慮的不全面,有些東西丟三落四,事先沒有好好想想,現在回想,如果當初在紙上面寫清楚了,這樣在K
125、eil uVision2 中調試快得多;</p><p> ?、前l(fā)現自己耐心不夠,很浮躁,一時得不出理想的結果就亂了,這以后得改改,否則會壞事;</p><p><b> ?、仓R匯總:</b></p><p> ?、艈纹瑱C知識:定時器中斷、串行口通訊、74HC164串行移位、C語言編程中if 、else if和switch語句、Keil uV
126、ision2安裝及程序調試、Proteus安裝及軟件仿真、Protel 99 SE安裝及畫原理圖、版圖、封裝庫、元件焊接技術、使用燒寫器;</p><p><b> ?、撤此?</b></p><p> 通過這次單片機課程設計,自己發(fā)現了一些缺點與不足,比如編程技術與風格不好,導致程序可讀性不高、效率不高,心理素質不高,調試了一段時間之后就亂了頭緒,然后就在電腦前機
127、械地點擊,不知道在做什么,辦事效率低,在這種情況下要勇于暫時放棄,去放松一下,這樣效果會更加;有時候一個很小的問題卻使我浪費了幾個小時,然而其他同學的一句話就有可能很簡單地解決了,所以有時候學習交流是很有必要的;不過這次課程設計完全是自己獨立完成的,這就是最大值得欣慰的地方,不過,自己應該多學學uC/OS,這樣就可以用操作系統(tǒng)來實現電子鐘功能了,不僅僅是操作系統(tǒng)知識的考察,同時也是對自己掌握知識的磨練,自己學了并不就是懂了,懂了并不就是
128、會了,會了并不就是成了,所以說,自己只有花更多的時間學好單片機、SOPC、數電、模電等重要專業(yè)課的知識,自己才能做出更好的產品。</p><p><b> 五、參考文獻:</b></p><p> ?、?張毅坤 陳善久 裘雪紅 單片微型計算機原理及應用2008年5月 </p><p> 西安電子科技大學出版社</p>&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設計-單片機課程設計---電子時鐘
- 單片機課程設計
- 單片機課程設計
- 單片機課程設計
- 單片機課程設計
- 單片機課程設計--單片機串行通訊
- 單片機秒表單片機課程設計
- 單片機課程設計
- 單片機課程設計---單片機數字時鐘
- 單片機課程設計--單片機控制步進電機
- 單片機課程設計-單片機控制步進電機
- 單片機課程設計---單片機籃球計分器
- 單片機課程設計報告---單片機數字時鐘
- 單片機課程設計---單片機原理及應用
- 基于單片機的秒表設計單片機課程設計
- 單片機課程設計--單片機控制各種器件
- 單片機課程設計---單片機數字時鐘.doc
- 單片機課程設計報告---單片機秒表系統(tǒng)設計
- 單片機課程設計---單片機病房呼叫系統(tǒng)
- 單片機課程設計--單片機轉速測量系統(tǒng)
評論
0/150
提交評論