51單片機(jī)電子時(shí)鐘課程設(shè)計(jì)_第1頁
已閱讀1頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  摘 要</b></p><p>  近年來隨著計(jì)算機(jī)在社會領(lǐng)域的滲透和大規(guī)模集成電路的發(fā)展,單片機(jī)的應(yīng)用正在不斷地走向深入,由于它具有功能強(qiáng),體積小,功耗低,價(jià)格便宜,工作可靠,使用方便等特點(diǎn),因此特別適合于與控制有關(guān)的系統(tǒng),越來越廣泛地應(yīng)用于自動控制,智能化儀器,儀表,數(shù)據(jù)采集,軍工產(chǎn)品以及家用電器等各個(gè)領(lǐng)域,單片機(jī)往往是作為一個(gè)核心部件來使用,在根據(jù)具體硬

2、件結(jié)構(gòu),以及針對具體應(yīng)用對象特點(diǎn)的軟件結(jié)合,以作完善。</p><p>  本次設(shè)計(jì)中以單片機(jī)的發(fā)展過程和發(fā)展方向?yàn)楸尘?,介紹了單片機(jī)的輸入輸出的工作原理和操作方法,中斷的工作原理和操作方法,74HC573驅(qū)動器的工作原理和與數(shù)碼管連接的方法。</p><p>  本次做的數(shù)字鐘是以單片機(jī)(STC89C52)為核心,結(jié)合相關(guān)的元器件(共陰極LED數(shù)碼管、驅(qū)動器74HC573等),再配以相應(yīng)

3、的軟件,是它具有時(shí),分,秒顯示的功能,并且時(shí),分,秒還可以調(diào)整。此次設(shè)計(jì)電子數(shù)字鐘是為了了解電子數(shù)字鐘的原理,從而學(xué)會制作電子數(shù)字鐘。而且通過電子數(shù)字鐘的制作進(jìn)一步的了解各種在制作中用到的中小規(guī)模集成電路的作用及實(shí)用方法。通過它可以進(jìn)一步學(xué)習(xí)與掌握單片機(jī)原理與使用方法。</p><p>  關(guān)鍵詞:單片機(jī) STC89C52 共陰極LED數(shù)碼顯示器 74HC573驅(qū)動器</p><p&

4、gt;<b>  一.設(shè)計(jì)目的</b></p><p>  1、實(shí)現(xiàn)時(shí)鐘的基本功能</p><p>  2、能夠手動對時(shí)間的調(diào)整</p><p><b>  3、實(shí)現(xiàn)跑秒功能</b></p><p><b>  二.?dāng)?shù)字鐘基本原理</b></p><p>

5、;  它是利用單片機(jī)的內(nèi)部的定時(shí)/計(jì)數(shù)器工作與定時(shí)方式,對機(jī)器周期計(jì)數(shù)形成基準(zhǔn)時(shí)間(如10ms)然后用另外一個(gè)計(jì)數(shù)器或軟件計(jì)數(shù)的形式對基準(zhǔn)時(shí)間進(jìn)行計(jì)數(shù)形成秒(如對10ms計(jì)數(shù)100次),“秒”計(jì)數(shù)60次形成“分”,“分”計(jì)數(shù)60次形成“時(shí)”,“時(shí)”計(jì)數(shù)24次形成“天”并清零,然后通過譯碼器,數(shù)碼管把他們的內(nèi)容在相應(yīng)的位置顯示出來。在具體的設(shè)計(jì)時(shí)定時(shí)器采用中斷方式工作,對時(shí)鐘的形成在終中斷序中實(shí)現(xiàn),在主程序只是對定時(shí)/計(jì)數(shù)器的定義初始化,

6、調(diào)用顯示程序和控制程序的初始化。另外為了使用的方便,也設(shè)計(jì)了按鍵,可以通過按鍵對時(shí)分秒進(jìn)行調(diào)整,這樣程序就加了按鍵程序。</p><p>  三.單片機(jī)數(shù)字時(shí)鐘的程序設(shè)計(jì)</p><p><b>  3.1主程序</b></p><p>  主程序是先開始,系統(tǒng)初始化、定時(shí)器初始化,脈沖基時(shí)開始跑秒后進(jìn)行按鍵檢測。若沒有按鍵設(shè)置,顯示當(dāng)前時(shí)間;

7、若有按鈕按下,按鍵調(diào)時(shí),檢測完后,</p><p>  就可以顯示更新后的時(shí)間。</p><p><b>  主程序流程:</b></p><p>  3.2定時(shí)中斷(走時(shí))子程序流程</p><p>  定時(shí)器中斷時(shí),先檢測50ms脈沖是否計(jì)數(shù)20次,計(jì)數(shù)到20次,秒就加1;</p><p> 

8、 如果沒計(jì)滿60,就返回顯示時(shí)間,如果秒計(jì)滿60秒,就清零秒,給分加1;檢測分鐘,如果沒計(jì)滿60,繼續(xù)計(jì)時(shí),返回顯示時(shí)間,如果滿60,就清零分鐘,給小時(shí)加1;檢測小時(shí),如果沒計(jì)滿24,就繼續(xù)計(jì)時(shí),返回顯示時(shí)間,如果計(jì)滿24,就清零,給秒加1,顯示時(shí)間。</p><p>  3.3按鍵掃描子程序:</p><p>  按鍵調(diào)試程序,是檢測是否有按鍵按下:</p><p&g

9、t;  如果小時(shí) 增加鍵/減小鍵 按下,就給小時(shí) 加1/減1</p><p>  如果分鐘 增加鍵/減小鍵 按下,就給分鐘 加1/減1</p><p>  如果秒 增加鍵/減小鍵 按下,就給秒 加1/減1</p><p>  如果顯示鍵(key7)按下,則顯示當(dāng)前時(shí)間</p><p><b>  3.4程序代碼</b&

10、gt;</p><p>  #include<reg52.h></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char </p><p>  sbit dula=P2^0;//段選</p><p>  sbit w

11、ela=P2^1;//位選</p><p>  sbit key1=P1^0;</p><p>  sbit key2=P1^1;</p><p>  sbit key3=P1^2;</p><p>  sbit key4=P1^3;</p><p>  sbit key5=P1^4;</p><p

12、>  sbit key6=P1^5;</p><p>  sbit key7=P1^6;</p><p>  sbit key8=P1^7;</p><p>  char flag=0;</p><p>  int num1=0,num2,shi,shih,shil,fen,fenh,fenl,miao,miaoh,miaol,p,ph

13、,pl;</p><p>  void delayms(uint z)</p><p><b>  {</b></p><p><b>  uint x,y;</b></p><p>  for(x=z;x>0;x--)</p><p>  for(y=110;y>

14、;0;y--);</p><p><b>  }</b></p><p>  uchar code table[]={0x3f,0x06,0x5b,0x4f,</p><p>  0x66,0x6d,0x7d,0x07,</p><p>  0x7f,0x6f,0x77,0x7c,</p><p>

15、;  0x39,0x5e,0x79,0x71}; //共陰</p><p>  void diaplay(int shih,int shil,int fenh,int fenl,int miaoh,int miaol,int ph,int pl)//動態(tài)顯示</p><p><b>  {</b></p><p><b>  dula

16、=1;</b></p><p>  P0=table[ph];</p><p><b>  dula=0;</b></p><p><b>  P0=0xff;</b></p><p><b>  wela=1;</b></p><p>  

17、P0=0xbf;//1011 1111</p><p><b>  wela=0;</b></p><p>  delayms(1);</p><p><b>  dula=1;</b></p><p>  P0=table[pl];</p><p><b>  d

18、ula=0;</b></p><p><b>  P0=0xff;</b></p><p><b>  wela=1;</b></p><p>  P0=0x7f;// 0111 1111</p><p><b>  wela=0;</b></p>&

19、lt;p>  delayms(1);</p><p><b>  dula=1;</b></p><p>  P0=table[miaol];</p><p><b>  dula=0;</b></p><p><b>  P0=0xff;</b></p>

20、<p><b>  wela=1;</b></p><p>  P0=0xdf;//1101 1111</p><p><b>  wela=0;</b></p><p>  delayms(1);</p><p><b>  dula=1;</b></p>

21、;<p>  P0=table[miaoh];</p><p><b>  dula=0;</b></p><p><b>  P0=0xff;</b></p><p><b>  wela=1;</b></p><p>  P0=0xef;//1110 1111

22、</p><p><b>  wela=0;</b></p><p>  delayms(1);</p><p><b>  dula=1;</b></p><p>  P0=table[fenl];</p><p><b>  dula=0;</b>&

23、lt;/p><p><b>  P0=0xff;</b></p><p><b>  wela=1;</b></p><p>  P0=0xf7;//1111 0111</p><p><b>  wela=0;</b></p><p>  delayms(

24、1);</p><p><b>  dula=1;</b></p><p>  P0=table[fenh];</p><p><b>  dula=0;</b></p><p><b>  P0=0xff;</b></p><p><b> 

25、 wela=1;</b></p><p>  P0=0xfb;//1111 1011</p><p><b>  wela=0;</b></p><p><b>  dula=1;</b></p><p>  P0=table[shil];</p><p><

26、;b>  dula=0;</b></p><p><b>  P0=0xff;</b></p><p>  delayms(1);</p><p><b>  wela=1;</b></p><p>  P0=0xfd;//1111 1101</p><p>

27、;<b>  wela=0;</b></p><p>  delayms(1);</p><p><b>  dula=1;</b></p><p>  P0=table[shih];</p><p><b>  dula=0;</b></p><p>

28、<b>  P0=0xff;</b></p><p><b>  wela=1;</b></p><p>  P0=0xfe;//1111 1110</p><p><b>  wela=0;</b></p><p>  delayms(1);</p><p

29、><b>  }</b></p><p>  void keyscan()//鍵盤掃描</p><p><b>  {</b></p><p>  if(key1==0)</p><p><b>  {</b></p><p>  delayms(

30、10);</p><p>  if(key1==0)</p><p><b>  {</b></p><p>  shi++;shih=shi/10;shil=shi%10;</p><p>  if(shi==24) shi=0;</p><p>  while(!key1); </p&g

31、t;<p><b>  }</b></p><p><b>  }</b></p><p>  if(key2==0)</p><p><b>  {</b></p><p>  delayms(10);</p><p>  if(key2

32、==0)</p><p><b>  {</b></p><p>  shi--;if(shi<0) shi=23;</p><p>  shih=shi/10;shil=shi%10;</p><p>  if(shi==0) shi=24;</p><p>  while(!key2);

33、 </p><p><b>  }</b></p><p><b>  }</b></p><p>  if(key3==0)</p><p><b>  {</b></p><p>  delayms(10);</p><p>

34、  if(key3==0)</p><p><b>  {</b></p><p>  fen++;fenh=fen/10;fenl=fen%10;</p><p>  if(fen==60) fen=0;</p><p>  while(!key3);</p><p><b>  }&

35、lt;/b></p><p><b>  }</b></p><p>  if(key4==0)</p><p><b>  {</b></p><p>  delayms(10);</p><p>  if(key4==0)</p><p>&

36、lt;b>  {</b></p><p>  fen--;if(fen<0) fen=59;</p><p>  fenh=fen/10;fenl=fen%10;</p><p>  if(fen==0) fen=60;while(!key4);</p><p><b>  }</b></p

37、><p><b>  }</b></p><p>  if(key5==0)</p><p><b>  {</b></p><p>  delayms(10);</p><p>  if(key5==0)</p><p><b>  {<

38、/b></p><p>  miao++;miaoh=miaoh/10;miaol=miao%10;</p><p>  if(miao==60) miao=0;while(!key5);</p><p><b>  }</b></p><p><b>  }</b></p>&

39、lt;p>  if(key6==0)</p><p><b>  {</b></p><p>  delayms(10);</p><p>  if(key6==0)</p><p><b>  {</b></p><p>  miao--;if(miao<0)

40、miao=59;</p><p>  miaoh=miaoh/10;miaol=miao%10;</p><p>  if(miao==0) miao=60;while(!key6);</p><p><b>  }</b></p><p><b>  }</b></p><p&

41、gt;  if(key7==0)</p><p><b>  { </b></p><p>  delayms(10); </p><p>  if(key7==0)</p><p><b>  {</b></p><p>  while(key7==0);</p

42、><p>  if(flag==1)</p><p><b>  flag=0;</b></p><p><b>  else</b></p><p><b>  flag=1;</b></p><p><b>  }</b></

43、p><p><b>  }</b></p><p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p>  TMOD=0x01;//工作方式0</p><p> 

44、 TH0=(65536-9174)/256;//裝初值,11.0592晶振定時(shí)1ms為9174</p><p>  TL0=(65536-9174)%256;//機(jī)器周期為12*(1/11059200)=1.09us</p><p>  //N=1ms/1.09us=9174</p><p><b>  EA=1;</b></p>

45、<p><b>  ET0=1;</b></p><p><b>  TR0=1;</b></p><p>  while(1) </p><p><b>  {</b></p><p>  keyscan();</p><p>  

46、if(flag==1)</p><p><b>  { </b></p><p>  dula=1;</p><p>  diaplay();</p><p><b>  dula=0;</b></p><p>  delayms(2);</p>&

47、lt;p><b>  wela=1;</b></p><p><b>  P0=0x00;</b></p><p><b>  wela=0;</b></p><p><b>  }</b></p><p><b>  else</b

48、></p><p>  diaplay(shih,shil,fenh,fenl,miaoh,miaol,ph,pl);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void T0_time() interrupt 1</p>

49、<p><b>  {</b></p><p>  TH0=(65536-9174)/256;</p><p>  TL0=(65536-9174)%256;</p><p><b>  num1++;</b></p><p>  if(num1==1)//跑秒</p>

50、<p><b>  {</b></p><p>  num1=0;p++;</p><p><b>  ph=p/10;</b></p><p><b>  pl=p%10;</b></p><p>  if(p==100) p=0,miao++;</p>

51、<p>  if(miao==60)miao=0,fen++;</p><p>  miaoh=miao/10;</p><p>  miaol=miao%10;</p><p>  if(fen==60)fen=0,shi++;</p><p>  fenh=fen/10;</p><p>  f

52、enl=fen%10;</p><p>  if(shi==24)shi=0;</p><p>  shih=shi/10;</p><p>  shil=shi%10;</p><p><b>  }</b></p><p><b>  }</b></p>

53、<p><b>  四、心得體會</b></p><p>  首先要感謝張老師對程序的指導(dǎo)與調(diào)試,特別是學(xué)到了對按鍵消抖的處理方法,按照按鍵上升沿的特點(diǎn)對按鍵進(jìn)行消抖,還有就是對程序整體設(shè)計(jì)思路的提高,讓主要的功能分成幾個(gè)部分來進(jìn)行判斷,而不是全部都放在一些想要實(shí)現(xiàn)的子程序中根據(jù)自己的意愿來實(shí)現(xiàn),要對程序整體的首先要考慮的成熟和完善。這次的課程設(shè)計(jì),總體的來說對于一個(gè)程序的設(shè)計(jì)

54、的能力有了更大的提高,一個(gè)再簡單的程序,牽扯到的知識是方方面面的,所以對綜合能力也有一定的要求。以下是設(shè)計(jì)各個(gè)模塊時(shí)想到的考慮到的方面,分類進(jìn)行描述。</p><p>  1、硬件配置:從開始的晚上向大四借到的51單片機(jī)開始,這個(gè)單片機(jī)板子是沒有用過的,于是要來了開發(fā)板電路圖,了解單片機(jī)的GPIO,然后結(jié)合電路圖開始構(gòu)思,根據(jù)設(shè)計(jì)要求,所需開發(fā)板上的硬件有:51芯片、數(shù)碼管、驅(qū)動數(shù)碼管的74HC573的兩塊芯片&

55、lt;/p><p>  然后看開發(fā)板電路圖對GPIO進(jìn)行配置,根據(jù)電路圖,首先用杜邦線將PO口的8位與573口想接,然后對兩片573的上拉使能端(即段選、位選)進(jìn)行配置、截至單片機(jī)P2^0口和P2^1口</p><p><b>  2、設(shè)計(jì)思路:</b></p><p>  利用單片機(jī)的計(jì)數(shù)器,產(chǎn)生出相當(dāng)準(zhǔn)確的時(shí)間模值,可以通過累加進(jìn)位的辦法產(chǎn)生,

56、跑秒級時(shí)間、秒、分、時(shí)</p><p><b>  顯示時(shí)間</b></p><p>  然后設(shè)計(jì)按鍵、可以對時(shí)間的時(shí)、分、秒,來調(diào)整時(shí)間</p><p>  其次,跑秒,與時(shí)間顯示設(shè)計(jì)在一起,當(dāng)跑秒記到最大值然后向秒進(jìn)位,并且設(shè)置停止鍵顯示當(dāng)前時(shí)間,可實(shí)現(xiàn)跑秒的功能</p><p>  最后是如何顯示當(dāng)前的時(shí)間,注意到

57、鎖存器的配置功能,硬件電路本身OE=0,當(dāng)LE=1,Q=D時(shí),顯示值為當(dāng)前值,可實(shí)現(xiàn)動態(tài)顯示功能。當(dāng)LE=0,Q=Q*時(shí),當(dāng)前的顯示值只與最后一次所存的數(shù)據(jù)有關(guān),可以實(shí)現(xiàn)按鍵按下,靜態(tài)顯示的功能</p><p>  74HC573功能圖:</p><p>  3、軟件編寫、調(diào)試:</p><p>  軟件的編寫、調(diào)試需要keil和STC-ISP V31兩個(gè)軟件來實(shí)

58、現(xiàn),一個(gè)程序的編寫,是對一個(gè)個(gè)功能逐個(gè)實(shí)現(xiàn),各個(gè)擊破來編寫的,編寫程序的時(shí)候,需要編寫之后生成hex文件,查看自己編寫是所要達(dá)到顯示的狀態(tài),與單片機(jī)程序下載進(jìn)去之后所顯示的狀態(tài),是否一致,若不一致,則應(yīng)回過頭來,檢查硬件的配置管腳,也可用萬用表示波器來檢測的狀態(tài),反復(fù)調(diào)試反復(fù)驗(yàn)證,會得到自己構(gòu)思讓單片機(jī)按照自己所想,所顯示的結(jié)果。一個(gè)程序是不可能一次性編寫成功的,即使顯示功能完好,還有很大的不足可以提高,例如可以再對程序資源的使用進(jìn)行優(yōu)

59、化,對程序的編寫進(jìn)行注釋改寫,使程序更為易懂、熟練</p><p><b>  4、改進(jìn)</b></p><p>  程序設(shè)計(jì)時(shí)欠考慮工作在方式0,仍需改進(jìn)的使單片機(jī)工作在方式2</p><p>  附錄1:開發(fā)板硬件電路圖</p><p>  用杜邦線將P0口依次與數(shù)碼管J2口相接,J2兩個(gè)接口接至P2^0和P2^1構(gòu)

溫馨提示

  • 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

提交評論