單片機c語言課程設(shè)計--基于單片機的電子鐘設(shè)計_第1頁
已閱讀1頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  《單品機原理及應用》課程設(shè)計</p><p>  基于單片機的電子鐘設(shè)計</p><p>  院 系 : 物理電氣信息工程學院 </p><p>  基于單片機的電子鐘設(shè)計</p><p><b>  一、設(shè)計任務</b></p><p>  1)、鞏固《單片機原理及應

2、用》課程所學的有關(guān)知識。</p><p>  2)、通過硬件設(shè)計、軟件設(shè)計,使學生掌握用單片機組成應用系統(tǒng)的方法,提高軟件設(shè)計能力。</p><p>  3)、掌握單片機的定時/計數(shù)器的編程和使用方法。進一步熟悉單片機功能部件的應用。</p><p>  二、設(shè)計要求及工作原理說明</p><p>  要求自己做出原理圖設(shè)計。并且要擴展一片8

3、255芯片作顯示接口,分別輸出段碼和位碼;用P1口中的兩根口線作功能鍵??衫盟膫€LED分時顯示當前時間和日歷。兩個按鍵的功能:A鍵用于調(diào)時,范圍0~23,0為 24點,每按一次時加1;B鍵用于調(diào)分,范圍0~59,0為60分,每按一次分加1。 </p><p>  單片機程序設(shè)計、調(diào)試。</p><p>  本課題采用單片機內(nèi)部定時器,用軟件對其進行秒、分、時的計數(shù),單片機無法產(chǎn)生1s的定

4、時時間,但是可以用硬件定時和軟件計數(shù)相結(jié)合的方法實現(xiàn),采用中斷方式,即通過中斷服務程序進行計數(shù)器溢出次數(shù)的累計,把定時器/計數(shù)器設(shè)定為62.5ms,計數(shù)溢出16次就可以得到1s,計60次為1分,60分計60次則為1小時,然后通過數(shù)碼管動態(tài)刷新顯示出來,再設(shè)四個按鍵進行時間的調(diào)整,一個鍵用作啟動/調(diào)整鍵,其余三個分別用于時、分、秒的調(diào)整。</p><p>  三、數(shù)字電子鐘硬件系統(tǒng)的設(shè)計</p>&l

5、t;p>  3.1 硬件總體設(shè)計</p><p>  硬件系統(tǒng)總體設(shè)計如圖1所示。</p><p>  圖1 硬件系統(tǒng)總體設(shè)計</p><p>  3.2 數(shù)字電子鐘硬件系統(tǒng)主要模塊功能簡要介紹</p><p>  (1) 功能芯片:本次設(shè)計采用AT89C51芯片,低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flas

6、h 存儲器。256字節(jié)RAM, 32 位I/O 口線,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。價格較低,能滿足本次設(shè)計的要求。</p><p> ?。?) 電源和復位模塊:AT89C51需5V電壓,所以可以采用USB接口的5V電源對其供電,復位電路可采用上電復位、按鍵電平復位、按鍵脈沖復位3種,本次采用按鍵電平復位。如電路原理圖中的電源和復位模塊。</p><p>  (3) 顯示模塊:

7、該模塊由8位8段共陽極數(shù)碼管組成,由8個PNP型三極管分別驅(qū)動其發(fā)光,從左至右位控分別接于單片機的P2.7-P2.0中上,段控a-dP接于單片機的P0.0-P0.7口上,使用動態(tài)顯示從右向左循環(huán)點亮每一位數(shù)碼管。如電路原理圖中的數(shù)碼管電路。</p><p>  (4) 鍵盤模塊:鍵盤由4個獨立式按鍵組成,S0-S4鍵分別接在單片機的P1.0-P1.4口,并由上拉電阻上拉使其成為電位為高。如電路原理圖中的獨立鍵盤

8、模塊。</p><p>  (5) 時鐘模塊:為了保證同步工作方式的思想,單片機必須有時鐘信號,以使其系統(tǒng)在時鐘信號的控制下按時序協(xié)調(diào)工作。如電路原理圖中的晶振電路。</p><p>  3.3 數(shù)字電子鐘電路原理圖</p><p>  2.31數(shù)字電子鐘電路原理圖</p><p>  3.4 數(shù)字電子鐘元器件清單</p>

9、<p>  數(shù)字電子鐘元器件清單</p><p>  四、 數(shù)字電子鐘軟件系統(tǒng)的設(shè)計</p><p>  4.1 數(shù)字電子鐘軟件系統(tǒng)主要模塊功能簡要介紹</p><p> ?。?) 主程序:主程序的主要功能是進行定時器/計數(shù)器,顯示緩沖區(qū)的初始化,顯示,以及判斷是否有功能鍵按下,判斷按下的鍵并調(diào)相應的鍵功能程序。</p><p>

10、 ?。?) 鍵功能程序:鍵功能程序的主要功能是執(zhí)行對應的功能,Menu鍵為啟動/調(diào)整鍵,第一次按下則由待機狀態(tài)進入運行狀態(tài)啟動時鐘,從00-00-00開始顯示,然后按下為奇數(shù)則暫停,進入調(diào)時狀態(tài),按下Sec鍵則秒加1,按下Min鍵則分加1,按下Hour鍵則時加1;若按下為偶數(shù)則進入時鐘運行狀態(tài)。</p><p> ?。?) 中斷服務程序:中斷服務程序的主要功能是進行計時操作,程序開始先判斷計數(shù)溢出是否滿了16次,

11、若不滿16次則表明沒有達到最小計時單位秒,則中斷返回;若滿16次表明已達到最小計時單位秒,則程序斷續(xù)向下執(zhí)行,進行分和時的計時。</p><p>  (4) 顯示子程序:顯示程序的主要功能是將顯示緩沖區(qū)的段控碼正確的顯示在數(shù)碼管上,采用動態(tài)顯示,從右向左循環(huán)點亮每一位數(shù)碼管。</p><p> ?。?) 鍵掃子程序:鍵掃子程序的主要功能是判斷是否有鍵按下,是哪個鍵按下,并將鍵值保存在20H

12、中。</p><p>  4.2 數(shù)字電子鐘軟件系統(tǒng)原理流程框圖</p><p><b>  主程序</b></p><p>  計時中斷 顯示 鍵盤掃描子程序 </p><p>  子程序 子程序</p><p>  定

13、時 延時 時分秒</p><p>  子程序 子程序 設(shè)定程序</p><p><b>  4.3軟件流程圖</b></p><p>  4.3.1控制地址列表</p><p>  4.3.2軟

14、件子程序流程圖</p><p>  計時子程序流程框圖 顯示子程序流程框圖</p><p>  4.4數(shù)字電子鐘軟件系統(tǒng)程序清單</p><p>  #include<reg52.h></p><p>  #include<intrins.h></p&g

15、t;<p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, // 數(shù)碼管為共陽</p><p>  0x92,0x82,0xf8,0x80,0x90,0x

16、bf};//P2口為低則選通</p><p>  uchar data key_temp=0xff; //關(guān)中斷和定時器</p><p>  uchar data key_save=0xff,c=0;</p><p>  uchar hour=0,min=0,sec=0,t,num,temp; //使程序初始化,時

17、間清</p><p><b>  零 </b></p><p>  uchar data dis[8];</p><p>  void init();</p><p>  void delay(uint);</p><p>  void key_scan();</p><

18、;p>  void main()</p><p>  { init();</p><p>  TR0=1; //啟動定時器0,開始定時</p><p>  TR1=1; //啟動定時器1,</p><p>  temp=0x7f; //

19、給temp賦值在送給P2口</p><p><b>  P2=temp;</b></p><p><b>  num=7;</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><

20、p>  key_temp=P3; //鍵值在P3口,讀入鍵值</p><p>  if(key_temp==0xfe) </p><p><b>  { c++;</b></p><p>  TR0=0; //關(guān)閉T0 </p><p>  if(c==2)

21、 </p><p><b>  {</b></p><p><b>  TR0=1;</b></p><p><b>  c=0;</b></p><p><b>  }</b></p><p><b&

22、gt;  }</b></p><p><b>  if(c==1)</b></p><p><b>  {</b></p><p>  if(key_temp!=key_save) //鍵值改變 //</p><p><b>  {</b></p>

23、;<p>  key_save=key_temp; //保存鍵值</p><p>  key_scan();</p><p><b>  }</b></p><p><b>  }}</b></p><p><b>  }</b></p>

24、<p>  void time1() interrupt 3 //主函數(shù),利用定時器1,初值為1000 </p><p>  { TH1=(65536-1000)/256;</p><p>  TL1=(65536-1000)%256;</p><p>  dis[0]=hour/10; //時計數(shù)器個位賦給dis[0]</p

25、><p>  dis[1]=hour%10; //時計數(shù)器個位賦給dis[1]</p><p>  dis[2]=10; // dis[2]為“-”段碼的偏移量 </p><p>  dis[3]=min/10;</p><p>  dis[4]=min%10;</p><p>

26、;  dis[5]=10;</p><p>  dis[6]=sec/10;</p><p>  dis[7]=sec%10;</p><p>  P0=0xff; //消隱</p><p>  temp=_crol_(temp,1);</p><p><b>  P2=temp;</b&g

27、t;</p><p>  P0=table[dis[num]];</p><p>  if(num==0)</p><p><b>  num=8;</b></p><p><b>  num--;</b></p><p><b>  }</b><

28、/p><p>  void time0() interrupt 1 //中斷服務程序</p><p>  {TH0=(65536-50000)/256; //設(shè)置計數(shù)初值</p><p>  TL0=(65536-50000)%256;</p><p><b>  t++;</b>

29、;</p><p><b>  if(t==20)</b></p><p>  {sec++; //秒計數(shù)器加一</p><p><b>  t=0;</b></p><p>  if(sec==60) //秒計數(shù)器值到60</p><

30、;p>  {sec=0; //秒計數(shù)器清零 </p><p>  min++; //分計數(shù)器加一(進為60S=1m)</p><p>  if(min==60) //分計數(shù)值到60</p><p>  {min=0; //分計數(shù)清零</p><p>  hour++;

31、 //時計數(shù)加一 </p><p>  if(hour==24) //時計數(shù)到24 </p><p><b>  {</b></p><p>  hour=0; //時計數(shù)器清零</p><p><b>  }</b></p>&

32、lt;p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void key_scan()</p><p>&l

33、t;b>  {</b></p><p>  if(key_save==0xfd) // P1口鍵值</p><p>  {if(hour==23)</p><p><b>  hour=0;</b></p><p><b>  else</b></

34、p><p><b>  hour++;}</b></p><p>  if(key_save==0xfb) </p><p>  {if(min==59)</p><p><b>  min=0;</b></p><p><b>  else</b>&

35、lt;/p><p><b>  min++;}</b></p><p>  if(key_save==0xf7) // 秒的計時口, 判斷秒若不為59則加1,為59時轉(zhuǎn)為零 </p><p>  {if(sec==59)</p><p><b>  sec=0;<

36、;/b></p><p><b>  else</b></p><p><b>  sec++;}</b></p><p><b>  }</b></p><p>  void init() </p><p>  { hour=0;

37、 //時,分,秒為零</p><p><b>  min=0;</b></p><p><b>  sec=0;</b></p><p>  EA=1; //開中斷,允許T0,T1中斷</p><p><b>  ET0=1;</b></p>

38、;<p><b>  ET1=1;</b></p><p>  TMOD=0x11; //使定時器1,0都工作在方式1 </p><p>  TH0=(65536-50000)/256; </p><p>  TL0=(65536-50000)%256;</p><p>  TH1=(6553

39、6-1000)/256;</p><p>  TL1=(65536-1000)%256;</p><p><b>  }</b></p><p>  五、誤差分析設(shè)計結(jié)論</p><p>  5.1 數(shù)字電子鐘的誤差分析</p><p>  雖說采用軟件方式來產(chǎn)生1s的基本時間,然而定時器/計數(shù)器

40、本身不能產(chǎn)生標準的1s定時,產(chǎn)生一個標準時間之后進行循環(huán)計數(shù)得到1s,但CPU執(zhí)行代碼需要1-2μs的時間,因此產(chǎn)生的1s,1分,1小時,都會略大于標準的時間。此外,單片機也易受外界環(huán)境的影響,比如溫度、濕度等干擾。故應該讓單片機工作在適宜的環(huán)境下,同時采用實時時鐘芯片,這樣能將誤差降低到最小。</p><p><b>  5.2設(shè)計心得</b></p><p>  

41、現(xiàn)在來回想單片機的課程設(shè)計,有許多感觸,從最開始接觸單片機和C語言,到現(xiàn)在能獨立完成一個課程設(shè)計,我必須得感謝老師的諄諄教導和辛勤付出,是老師給了我動力。在匯編編程時,書本上的很多知識又學的很不扎實,程序基本語句理解不夠透徹,導致編一個簡單程序都需要大量時間且過于復雜,真是耗時耗力耗單片機內(nèi)存。 也深刻理解了只有踏實講課本上的每一句程序讀懂,多讀程序,多看程序,才能更好的編程序。雖然本程序不是我自己編寫的,但還是給了我很多知識,應用到的

42、計時,中斷都是我們上課時講的重點。應用protues將實際結(jié)果運行出來,由于數(shù)字電子鐘的設(shè)計由于采用的是用硬件定時和軟件計數(shù)的方式產(chǎn)生的1s,而忽略了CPU執(zhí)行指令所需的時間,故時鐘顯示不是很精確。本次的課程設(shè)計讓我學到了很多知識,相信以后自己有能力編寫一個更加準確的電子鐘。</p><p><b>  參考文獻:</b></p><p>  [1] 單品機原理及應用

43、, 西安電子科技大學出版社</p><p>  [2] 單片機的C語言應用程序設(shè)計,華中科技大學出版社</p><p>  [3] 模擬電子技術(shù).高等教育出版社</p><p>  [4] 電路分析基礎(chǔ).清華大學出版社</p><p><b>  致 謝</b></p><p>  本次單片機的

44、C語言應用程序課程設(shè)計能夠順利的完成,是小組各組員團結(jié)努力和**老師的指導下完成的。正是因為*老師那一絲不茍、剛正不阿的態(tài)度才使我們有了做課程設(shè)計的動力。感謝老師的助我們開拓解決問題思路,精心點撥、熱忱鼓勵。老師一絲不茍的作風,嚴謹求實的態(tài)度,踏踏實實的精神,不僅授我以文,而且教我做人,是授以終生受益無窮之道。對*老師的感激之情是無法用言語表達的。</p><p>  還有感謝學校對我們此次課程設(shè)計的大力支持,在

溫馨提示

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

評論

0/150

提交評論