單片機(jī)課程設(shè)計(jì)6_第1頁
已閱讀1頁,還剩25頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  課程設(shè)計(jì)任務(wù)書</b></p><p>  學(xué)院___________專業(yè)____________班級________姓名_________</p><p>  課程設(shè)計(jì)題目:______________________________________</p><p>  課程設(shè)計(jì)主要參考資料:</p>

2、<p>  (1)_____________________________________________________</p><p>  (2)_____________________________________________________</p><p>  (3)______________________________________________

3、_______</p><p>  (4)_____________________________________________________</p><p>  ________________________________________________________</p><p>  課程設(shè)計(jì)應(yīng)解決的主要問題:</p><p&g

4、t;  (1)_____________________________________________________</p><p>  (2)_____________________________________________________</p><p>  (3)_____________________________________________________&l

5、t;/p><p>  (4)_____________________________________________________</p><p>  ________________________________________________________</p><p>  課程設(shè)計(jì)相關(guān)附件(如:圖紙、軟件等):</p><p> 

6、 (1)_____________________________________________________</p><p>  (2)_____________________________________________________</p><p>  (3)_____________________________________________________</

7、p><p>  (4)_____________________________________________________</p><p>  ________________________________________________________</p><p>  課程設(shè)計(jì)開始日期:_____________________ </p>

8、<p>  課程設(shè)計(jì)完成日期:_____________________</p><p>  指導(dǎo)老師簽字:_______________指導(dǎo)老師對課程設(shè)計(jì)的評語</p><p>  指導(dǎo)老師簽字:__________</p><p>  ___年____月___日 </p><p>  主要器件與軟件介紹:</p>

9、<p><b>  單片機(jī)介紹:</b></p><p>  單片微型計(jì)算機(jī)簡稱單片機(jī),是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的縮寫MCU表示單片機(jī),它最早是被用在工業(yè)控制領(lǐng)域。單片機(jī)由芯片內(nèi)僅有CPU的專用處理器發(fā)展而來。最早的設(shè)計(jì)理念是通過將大量外圍設(shè)備和CPU集成在一個(gè)芯片中,使計(jì)算機(jī)系統(tǒng)更小,更容易集成進(jìn)復(fù)雜的而對體積要求嚴(yán)格的控

10、制設(shè)備當(dāng)中。INTEL的Z80是最早按照這種思想設(shè)計(jì)出的處理器;</p><p>  單片機(jī)有40個(gè)引腳,功能大致可以分為4個(gè)種類:電源、時(shí)鐘、控制和I/O引腳。</p><p><b> ?、烹娫矗?lt;/b></p><p>  VCC - 芯片電源,接+5V;</p><p>  VSS - 接地端;</p>

11、;<p>  ⑵時(shí)鐘:XTAL1、XTAL2—晶體</p><p>  振蕩電路反相輸入端和輸出端;</p><p>  ⑶控制:控制線一共有4根:</p><p>  ALE/PROG:地址所存允許</p><p>  /片內(nèi)EPROM編程脈沖</p><p>  PSEN:外ROM讀選通信號</

12、p><p>  RST/VPD:復(fù)位/備用電源</p><p>  EA/Vpp:內(nèi)外ROM選擇/</p><p>  片內(nèi)EPROM編程電源</p><p><b>  ⑷I/O引腳:</b></p><p>  80C51共有4個(gè)8位并行I/O端口:</p><p>  P

13、0、P1、P2、P3口,共32個(gè)引腳。</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 定時(shí)計(jì)數(shù)器0</p><p>  P35 T1 定時(shí)計(jì)數(shù)器1</p><p>  P36 WR 外部數(shù)據(jù)存儲器寫選通(低電平有效)</p>&

15、lt;p>  P37 RD 外部數(shù)據(jù)存儲器讀選通(低電平有效)</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>  行輸入數(shù)據(jù),然后并行輸</p><p>  出。數(shù)據(jù)通過兩個(gè)輸入端</p><p>  (DSA 或 DSB)之一串行

17、</p><p>  輸入;任一輸入端可以用</p><p>  作高電平使能端,控制另</p><p>  一輸入端的數(shù)據(jù)輸入。兩</p><p>  個(gè)輸入端或者連接在一起</p><p>  ,或者把不用的輸入端接</p><p>  高電平,一定不要懸空。</p><

18、p><b>  數(shù)碼管介紹:</b></p><p>  按發(fā)光二極管單元連接方</p><p>  式分為共陽極數(shù)碼管和共</p><p>  陰極數(shù)碼管。共陽數(shù)碼管</p><p>  是指將所有發(fā)光二極管的</p><p>  陽極接到一起形成公共陽</p><p&

19、gt;  極(COM)的數(shù)碼管。共陽</p><p>  數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共</p><p>  極COM接到+5V,當(dāng)某</p><p>  一字段發(fā)光二極管的陰極</p><p>  為低電平時(shí),相應(yīng)字段就</p><p>  點(diǎn)亮。當(dāng)某一字段的陰極</p><p>  為高電平時(shí),相應(yīng)

20、字段就</p><p>  不亮。。共陰數(shù)碼管是指</p><p>  將所有發(fā)光二極管的陰極</p><p>  接到一起形成公共陰極(C</p><p>  OM)的數(shù)碼管。共陰數(shù)碼</p><p>  管在應(yīng)用時(shí)應(yīng)將公共極C</p><p>  OM接到地線GND上,</p>

21、<p>  當(dāng)某一字段發(fā)光二極管</p><p>  的陽極為高電平時(shí),相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陽極為低電平時(shí),相應(yīng)字段就不亮。</p><p>  Keil uVision2 軟件介紹:</p><p>  Keil uVision2是美國Keil Software公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),使用接近于傳統(tǒng)C語言的語法來開發(fā),

22、與匯編相比,C語言在功能上、結(jié)構(gòu)上、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用,而且大大的提高了工作效率和項(xiàng)目開發(fā)周期, 他還能嵌入?yún)R編,您可以在關(guān)鍵的位置嵌入,使程序達(dá)到接近于匯編的工作效率。</p><p>  Keil C51軟件提供豐富的庫函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows界面,使愛好者在很短的時(shí)間內(nèi)就能學(xué)會使用keil c51來開發(fā)您的單片機(jī)應(yīng)用程序;</p><p

23、>  Proteus7 軟件介紹:</p><p>  Proteus軟件是英國Labcenter electronics公司出版的EDA工具軟件。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機(jī)及外圍器件。它是目前最好的仿真單片機(jī)及外圍器件的工具。雖然目前國內(nèi)推廣剛起步,但已受到單片機(jī)愛好者、從事單片機(jī)教學(xué)的教師、致力于單片機(jī)開發(fā)應(yīng)用的科技工作者的青睞。Proteus是世界上著名的EDA工具,從原理

24、圖、代碼調(diào)試到單片機(jī)與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計(jì),真正實(shí)現(xiàn)了從概念到產(chǎn)品的完整設(shè)計(jì)。</p><p>  是目前世界上唯一將電路仿真軟件、PCB設(shè)計(jì)軟件和虛擬模型仿真軟件三合一的設(shè)計(jì)平臺,其處理器模型支持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是應(yīng)用于Windows9X/2000/NT操作系統(tǒng)下的EDA設(shè)計(jì)軟件,采用設(shè)計(jì)庫管理模式,可以進(jìn)行聯(lián)網(wǎng)設(shè)計(jì),具有很強(qiáng)的數(shù)據(jù)交換能力和開放性及3D模擬功能,是一個(gè)32位的設(shè)計(jì)軟件,可以完成電路原理圖設(shè)計(jì),印制電路板設(shè)計(jì)和可編程邏輯器件設(shè)

26、計(jì)等工作,可以設(shè)計(jì)32個(gè)信號層,16個(gè)電源--地層和16個(gè)機(jī)加工層。⑴電路工程設(shè)計(jì)部分:</p><p> ?、?電路原理設(shè)計(jì)部分:電路原理設(shè)計(jì)部分包括電路圖編輯器(簡稱SCH)、電路圖零件庫編輯器(簡稱Schlib編輯器)和各種文本編輯器。</p><p> ?、?印刷電路板設(shè)計(jì)系統(tǒng):印刷電路板設(shè)計(jì)系統(tǒng)包括電路板編輯器(簡稱PCB編輯器)、零件封裝編輯器(簡稱PCBLib編輯器)和電路

27、板組件管理器。</p><p>  ③ 自動(dòng)布線系統(tǒng):自動(dòng)布線系統(tǒng)包含一個(gè)基于形狀的無柵格自動(dòng)布線器,用于印刷電路板的自動(dòng)布線,以實(shí)現(xiàn)PCB設(shè)計(jì)的自動(dòng)化。</p><p> ?、齐娐贩抡媾cPLD部分:</p><p>  ① 電路模擬仿真系統(tǒng):電路模擬仿真系統(tǒng)包含一個(gè)數(shù)字/模擬信號仿真器,可提供連續(xù)的數(shù)字信號和模擬信號,以便對電路原理圖進(jìn)行信號模擬仿真從而驗(yàn)證其正確

28、性與可行性。</p><p>  可編程邏輯設(shè)計(jì)系統(tǒng):可編程邏輯系統(tǒng)包含一個(gè)有語法功能的文本編輯器和一個(gè)波形編輯器。主要功能是對邏輯電路進(jìn)行分析、綜合;觀察信號的波形。利用PLD系統(tǒng)可以最大限度的精簡邏輯部件,使數(shù)字電路設(shè)計(jì)達(dá)到最簡化。</p><p>  高級信號完整性分析系統(tǒng):高級信號完整性分析系統(tǒng)提供了一個(gè)精確的信號完整性模擬器,可用來分析PCB設(shè)計(jì)、檢查電路設(shè)計(jì)參數(shù)、實(shí)驗(yàn)超調(diào)量、阻

29、抗和信號諧波要求等。</p><p><b>  二、設(shè)計(jì)步驟:</b></p><p>  1.protel使用:</p><p><b> ?、女嬙韴D:</b></p><p><b> ?、龠x組件:</b></p><p>  選出單片機(jī)、74H

30、C164、去耦電容、瓷片電容、數(shù)碼管、穩(wěn)壓管、電解電容、按鍵。</p><p><b> ?、陔娐窐?gòu)造:</b></p><p>  三個(gè)按鍵,一個(gè)模式鍵、一個(gè)加鍵、一個(gè)減鍵,分別接入單片機(jī)的p1.2、p1.1、p1.0,設(shè)置串口發(fā)送波特率,RXD送到A、B,TXD送到CP,當(dāng)做時(shí)鐘用,其中</p><p>  74HC164與數(shù)碼管相連得準(zhǔn)確

31、,否則會亂碼。注意,因?yàn)橘徺I器件</p><p>  時(shí),按鍵是4腿的,所以</p><p>  畫原理圖時(shí)盡量與實(shí)物圖</p><p>  一致,更改按鍵如右圖:</p><p><b>  電路連線:如圖</b></p><p> ?、飘嫲鎴D:先編號(TOOLS->Annotate…),

32、再生成網(wǎng)標(biāo)文件(Design->Create Netlist…),再打開.PCB文件,導(dǎo)入剛生成的網(wǎng)表文件(Design->Load Nets…),再手工布局布線,同時(shí)注意規(guī)則,如電源線加粗之類的地方,另外在正確連線的基礎(chǔ)上,盡量美觀。</p><p>  另外其三維俯視圖如下圖:</p><p>  然后送至生產(chǎn)PCB板的廠家生產(chǎn)板子,購買器件,焊接,燒寫程序,調(diào)試程序,直至

33、完成設(shè)計(jì)要求。</p><p>  2.Keil uVision2 使用:</p><p> ?、判陆üこ?,保存之后并選擇相關(guān)單片機(jī)類型,如下圖:</p><p>  下圖選擇ATMEL公司的AT89從C51系列單片機(jī)類型:</p><p> ?、铺砑游募?選擇Target 1->Source Group 1,右擊選擇Add File

34、s to Group ‘Source Group 1’如圖:</p><p>  ⑶程序調(diào)試:程序?qū)1.0、</p><p>  p1.1、p1.2口在reg51.h中定義,否則會出錯(cuò)。編譯結(jié)果:</p><p>  3.Proteus使用:</p><p> ?、女嬙韴D:選器件,51單片機(jī)、74HC164、LED、氣段數(shù)碼管、穩(wěn)壓管、電

35、容(因?yàn)橛捎赑roteus仿真功能強(qiáng)大,仿真時(shí)復(fù)位電路不需加,電阻都不用加,但在Proutel中畫原理圖和PCB都加上用于實(shí)際電路焊接,復(fù)位時(shí)顯示11年1月1日,這是編程決定的,在后續(xù)程序中提到,這里不贅述。),先顯示下圖:</p><p> ?、品抡妫禾砑觝ww.hex文件到單片機(jī)中,并設(shè)置成6MHZ,開始運(yùn)行:</p><p>  接下來立即就顯示11年1號1日:</p>

36、<p>  大概過0.5秒的接下來顯示12點(diǎn)整:</p><p>  下來顯示的時(shí)分秒就不截圖了,截年月日這關(guān)鍵圖:</p><p>  多截圖,以提供動(dòng)態(tài)顯示的效果:(當(dāng)對日先加到3號)</p><p>  再按減,慢慢減到1號:</p><p>  但是減到1號后,就不再減,只是閃爍(原因在特別注意中有解釋):</p&g

37、t;<p>  再按加,因?yàn)楫?dāng)前是1月,加到31號后就為2月1號:</p><p>  因?yàn)?1年(不是閏年)的2月份只有28天,故之后就為3月1號:</p><p>  再調(diào)年數(shù),看看閏年的2月份是否是29天:</p><p>  如上圖所示,完全正確;</p><p>  再調(diào),看看4月份,是否為30天:</p>

38、<p><b>  如圖完全正確;</b></p><p>  看看時(shí)分秒、年月日進(jìn)位情況,為了把所有的數(shù)碼管都用上,故設(shè)置成99年12月31號23點(diǎn)59分59秒:</p><p>  再過一秒就是00年1月1號00點(diǎn)00分00秒:</p><p>  以上圖都說明這些時(shí)分秒年月日顯示及進(jìn)位都沒問題,證明程序沒問題,滿足設(shè)計(jì)要求。

39、</p><p><b>  程序說明:</b></p><p>  ⒈定義變量(簡要變量):</p><p>  ⑴顯示緩沖區(qū)unsigned char DispBuf[6];</p><p> ?、平Y(jié)構(gòu)體變量Time、Calendar,其中成員分別為Hour、Min、Sec和Yea、Mon、Day,用于顯示;<

40、/p><p><b>  ⑶標(biāo)志位</b></p><p>  Flag2、Flag1、Flag0,分別對應(yīng)p1.0、p1.1、p1.2口的標(biāo)志位;</p><p>  Flag_Time、Flag_Calendar對應(yīng)用于顯示時(shí)分秒還是年月日;</p><p>  Flash_flag、DisPlay_Back對應(yīng)閃爍顯示

41、和緩沖區(qū)備份</p><p>  LEDCode[]、ErrorLEDCode[]分別對應(yīng)正確和錯(cuò)誤版圖的要顯示的十個(gè)數(shù)0到9;</p><p> ?、捕x函數(shù)(簡單函數(shù)):</p><p> ?、?年月日顯示函數(shù):說明:不管閏年還是不閏年也好,1、3、5、7、8、10、12月份都是31天,而4、6、9、11都是30天,用switch語句多路分支,只有2月份當(dāng)閏年時(shí)

42、是29天,否則為28天,這時(shí)候要進(jìn)行判斷;</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>  ⒊特別說明:</b></p><p> ?、耪{(diào)表時(shí)只有機(jī)械地加減,并不考慮進(jìn)位和借位;</p><p>  ⑵在顯示年月日時(shí),四個(gè)LED燈均不

52、亮,以便和時(shí)分秒?yún)^(qū)分;</p><p> ?、前醇訙p時(shí),只需要按一下即可實(shí)現(xiàn)調(diào)多下的功能(因?yàn)榘存I畢竟靈活有限,這樣每秒增或減即人性化又科學(xué)化,又方便簡單)</p><p>  ⑷每個(gè)數(shù)碼管發(fā)生變化時(shí)(肉眼看到的表面現(xiàn)象)只在每半秒跳動(dòng),這樣肉眼很容易分別,看起來也美觀大方,不別扭;</p><p> ?、商頃r(shí),對時(shí)分秒調(diào)時(shí),加減情況只與對應(yīng)的管有關(guān)聯(lián),故需對其他

53、位管調(diào)時(shí),再按一下增或減;</p><p>  ⑹沒有按鍵按下時(shí),故顯示時(shí)分秒,當(dāng)模式鍵按一下對秒(同時(shí)可以按下其它兩鍵進(jìn)行調(diào)表)操作,再按一下是分,下一次是時(shí),再按一下就顯示年月日,再按模式鍵就對日(同時(shí)可以按下其它兩鍵進(jìn)行調(diào)表)操作,再按一下是月,下一次是年,最后一次就回到顯示時(shí)分秒;各位都正常進(jìn)位,完全正確;</p><p> ?、吮境绦蚰曛荒茱@示兩位,故最多只能顯示0到99,默認(rèn)為

54、2000年到2099年,根據(jù)閏年規(guī)則,能被100或400整除的,或者是不能被100整除,但能被4整除的也是閏年,其2月份是28天,不是閏年就是29天,這些由(Proteus)上圖來示意演示;</p><p> ?、陶{(diào)年月日時(shí),減操作(對日)能減,但當(dāng)減到1號時(shí),號就不再減,只是閃爍(這由內(nèi)部函數(shù)test_calendar()加加,而到調(diào)表函數(shù)case 5中是減減,故不能實(shí)現(xiàn)減,只能閃爍)而加操作可以使號數(shù)增加,還

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 //設(shè)定時(shí)間結(jié)構(gòu)體</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 //設(shè)定時(shí)間結(jié)構(gòu)體</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; //中斷次數(shù)計(jì)數(shù)變量</p><p>  unsigned char Flash_flag=0; //閃爍標(biāo)志,每半秒閃爍</p

60、><p>  unsigned char DisPlay_Back=0; //顯示緩沖區(qū)更新備份,如果顯示緩沖區(qū)更新則跟閃爍標(biāo)志不一致</p><p>  code unsigned char LEDCode[]={0x01,0xd7,0x22,0x82,0xc4,0x88,0x08,</p><p>  0xc1,0x00,0x80,0xff}; //數(shù)碼

61、管顯示代碼</p><p>  code unsigned char ErrorLEDCode[]={0x01,0xe7,0x12,0x82,0xc4,</p><p>  0x88,0x08,0xc1,0x00,0x80};//繪制錯(cuò)誤圖紙的數(shù)碼管顯示代碼</p><p>  //***************************************

62、***</p><p>  // 年月日顯示函數(shù)</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>  // 設(shè)定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ū)的內(nèi)容發(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ā)送完標(biāo)志清掉以備下次再用 </p><p><b>  };</b></p><p><b>  }</b></p><p>  /

79、/****************************************************** </p><p>  // 定時(shí)器中斷</p><p>  //******************************************************</p><p>  void T0_Int(void)

80、interrupt 1 using 1</p><p><b>  {</b></p><p>  TH0=(65536-25000)/256; //定時(shí)器裝填</p><p>  TL0=(65536-25000)%256;</p><p>  T0_Int_Times++; //中斷次數(shù)加<

81、;/p><p>  if(T0_Int_Times>=10) //每半秒更新閃爍標(biāo)志</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秒的時(shí)間開始更新時(shí)、分、秒</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>  // 把時(shí)間轉(zhuǎn)換為可以顯示的代碼</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; //雙點(diǎn)熄滅</p><p>  DispBuf[4]

92、=DispBuf[4]|0x20;</p><p>  DisPlayBuf();</p><p>  for(j=0;j<=32000;j++); //延時(shí)</p><p>  Flag_Time=1; //顯示時(shí)分秒</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; //雙點(diǎn)熄滅</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; //否則就僅僅顯示時(shí)分秒自動(dòng)計(jì)時(shí)</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(); //轉(zhuǎn)化時(shí)分秒為可顯示代碼 </p><p>  if(

105、Flash_flag) //更新雙點(diǎn)閃爍</p><p>  {DispBuf[2]=DispBuf[2]|0x10; //雙點(diǎn)熄滅</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;//使對應(yīng)的數(shù)碼管滅,以達(dá)到閃爍效果</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) //通過"+""-"來調(diào)表</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; //點(diǎn)亮雙點(diǎn)</p><p>  DispBuf[4]=DispBuf[4]&0xdf;};} </p><p>  if(Fl

113、ag_Calendar)</p><p>  {ChangeToDispCode_Calendar(); //轉(zhuǎn)化年月日為可顯示代碼 </p><p>  DispBuf[2]=DispBuf[2]|0x10; //雙點(diǎn)熄滅,使</p><p>  DispBuf[4]=DispBuf[4]|0x20;</p><p>  if(Flash

114、_flag) //更新雙點(diǎn)閃爍</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、設(shè)計(jì)心得:</b></p><p><b>  ⒈問題總結(jié):</b></p><p> ?、疟敬握n程設(shè)計(jì)過程中,遇到很多問題,C語言學(xué)得不夠扎實(shí),比如一些簡單的if 、else if語句混用,導(dǎo)致程序得不到想要的結(jié)果;</p><p> ?、茟]的不全面,有些東西丟三落四,事先沒有好好想想,現(xiàn)在回想,如果當(dāng)初在紙上面寫清楚了,這樣在K

125、eil uVision2 中調(diào)試快得多;</p><p>  ⑶發(fā)現(xiàn)自己耐心不夠,很浮躁,一時(shí)得不出理想的結(jié)果就亂了,這以后得改改,否則會壞事;</p><p><b>  ⒉知識匯總:</b></p><p> ?、艈纹瑱C(jī)知識:定時(shí)器中斷、串行口通訊、74HC164串行移位、C語言編程中if 、else if和switch語句、Keil uV

126、ision2安裝及程序調(diào)試、Proteus安裝及軟件仿真、Protel 99 SE安裝及畫原理圖、版圖、封裝庫、元件焊接技術(shù)、使用燒寫器;</p><p><b> ?、撤此?</b></p><p>  通過這次單片機(jī)課程設(shè)計(jì),自己發(fā)現(xiàn)了一些缺點(diǎn)與不足,比如編程技術(shù)與風(fēng)格不好,導(dǎo)致程序可讀性不高、效率不高,心理素質(zhì)不高,調(diào)試了一段時(shí)間之后就亂了頭緒,然后就在電腦前機(jī)

127、械地點(diǎn)擊,不知道在做什么,辦事效率低,在這種情況下要勇于暫時(shí)放棄,去放松一下,這樣效果會更加;有時(shí)候一個(gè)很小的問題卻使我浪費(fèi)了幾個(gè)小時(shí),然而其他同學(xué)的一句話就有可能很簡單地解決了,所以有時(shí)候?qū)W習(xí)交流是很有必要的;不過這次課程設(shè)計(jì)完全是自己獨(dú)立完成的,這就是最大值得欣慰的地方,不過,自己應(yīng)該多學(xué)學(xué)uC/OS,這樣就可以用操作系統(tǒng)來實(shí)現(xiàn)電子鐘功能了,不僅僅是操作系統(tǒng)知識的考察,同時(shí)也是對自己掌握知識的磨練,自己學(xué)了并不就是懂了,懂了并不就是

128、會了,會了并不就是成了,所以說,自己只有花更多的時(shí)間學(xué)好單片機(jī)、SOPC、數(shù)電、模電等重要專業(yè)課的知識,自己才能做出更好的產(chǎn)品。</p><p><b>  五、參考文獻(xiàn):</b></p><p> ?、?張毅坤 陳善久 裘雪紅 單片微型計(jì)算機(jī)原理及應(yīng)用2008年5月 </p><p>  西安電子科技大學(xué)出版社</p>&l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論