課程設(shè)計--基于at89c51的99秒倒計時器設(shè)計_第1頁
已閱讀1頁,還剩15頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  目錄</b></p><p>  課程設(shè)計的目的和要求.........................1</p><p>  題目.........................................1</p><p>  主要器件說明.................................

2、1</p><p>  電路設(shè)計框圖.................................7</p><p>  各部分電路...................................8</p><p>  程序.........................................10</p><p>  心

3、得體會.....................................16</p><p>  參考文獻(xiàn).....................................16</p><p>  一、課程設(shè)計目的和要求</p><p><b>  目的:</b></p><p> ?。?)培養(yǎng)學(xué)生綜合運(yùn)

4、用所學(xué)理論知識分析和解決實際問題的能力。</p><p>  (2)鍛煉學(xué)生的獨立工作能力,也是對前期理論與實踐教學(xué)效果的檢驗。</p><p> ?。?)通過課程設(shè)計使學(xué)生深入理解單片機(jī)的基本原理,硬件結(jié)構(gòu)和工作原理。掌握程序的編制方法和程序調(diào)試的方法,掌握常用接口的設(shè)計及使用。掌握一般接口的擴(kuò)展方法及接口的調(diào)試過程。為學(xué)生將來在電子信息工程、測試計量技術(shù)及儀器、通信工程、電子科學(xué)與技術(shù)

5、及其他領(lǐng)域應(yīng)用單片機(jī)技術(shù)打下良好基礎(chǔ)及應(yīng)用實踐能力。</p><p><b>  2.要求:</b></p><p>  本課程設(shè)計重視培養(yǎng)并提高學(xué)生創(chuàng)新設(shè)計能力、理論與實際相結(jié)合的綜合素質(zhì)、單片機(jī)系統(tǒng)硬件設(shè)計能力,軟件編程技巧,軟硬件聯(lián)合調(diào)試技巧及技能等實踐能力。</p><p>  (1)選題要求:滿足課程設(shè)計的教學(xué)目的與要求,使學(xué)生得到全

6、面的綜合訓(xùn)練,題目難度和工作量應(yīng)適合學(xué)生的知識和能力狀況。</p><p> ?。?)學(xué)生根據(jù)課程實際任務(wù)書的要求合理地安排設(shè)計進(jìn)度,</p><p> ?。?)學(xué)生對自己課程設(shè)計的題目,應(yīng)概念清楚,設(shè)計方案合理,硬件設(shè)計正確,程序編制正確合理,調(diào)試結(jié)果符合設(shè)計要求,課程設(shè)計報告書撰寫規(guī)范。</p><p><b>  題目</b></p

7、><p>  實現(xiàn)最長99S的倒計時功能;利用數(shù)碼管或液晶屏顯示數(shù)字;利用按鍵可以設(shè)置倒計時時間;設(shè)置倒計時開始啟動鍵;時間到,聲(光)報警,示意倒計時時間到。</p><p>  三、所需主要器件說明</p><p>  AT89C51單片機(jī)1個、兩位動態(tài)共陰數(shù)碼管1個、9個引腳的排阻、電阻3個、12MHz晶振1個、33pF電容2個、10uF極性電容1個、獨立按鍵1個

8、、4行3列矩陣按鍵1個、LED指示燈1個、電源和地若干</p><p><b>  1、AT89C51</b></p><p>  AT89C51是一個低功耗,高性能CMOS 8位單片機(jī),片內(nèi)含4k Bytes ISP(In-system programmable)的可反復(fù)擦寫1000次的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術(shù)制造,

9、兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲單元,功能強(qiáng)大的微型計算機(jī)的AT89C51可為許多嵌入式控制應(yīng)用系統(tǒng)提供高性價比的解決方案。AT89C單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。 其工作電壓在4.5-5V,一般我們選用+5V電壓。外形及引腳排列如圖2所示 </p><p>  圖二 at89c51外形及引腳</p>

10、<p><b>  主要特性</b></p><p>  ·與MCS-51 兼容 </p><p>  ·4K字節(jié)可編程閃爍存儲器 </p><p>  ·壽命:1000寫/擦循環(huán)</p><p>  ·數(shù)據(jù)保留時間:10年</p><p>  

11、·全靜態(tài)工作:0Hz-24MHz</p><p>  ·三級程序存儲器鎖定</p><p>  ·128×8位內(nèi)部RAM</p><p>  ·32可編程I/O線</p><p>  ·兩個16位定時器/計數(shù)器</p><p><b>  ·

12、;5個中斷源 </b></p><p><b>  ·可編程串行通道</b></p><p>  ·低功耗的閑置和掉電模式</p><p>  ·片內(nèi)振蕩器和時鐘電路 </p><p><b>  管腳說明</b></p><p> 

13、 (1)電源及時鐘引腳(4個)</p><p>  Vcc: 電源接入引腳</p><p><b>  Vss:接地引腳</b></p><p>  XTAL1:晶振震蕩器接入的一個引腳(采用外部振蕩器時,此引腳接地);</p><p>  XTAL2:晶體振蕩器的另一個引腳(采用外部振蕩器時,此引腳作為外部振

14、 蕩器信號的輸入端)。</p><p>  (2)控制線引腳(4個)</p><p>  RST/Vpd:復(fù)位信號輸入引腳/備用電源輸入引腳;</p><p>  ALE:地址鎖存允許信號輸出引腳/編程脈沖輸入引腳:</p><p>  EA:內(nèi)外存儲器選擇引腳/片外EPROM編程電壓輸入引腳;</p>&l

15、t;p>  PSEN:外部程序存儲器選通信號輸出引腳。</p><p>  (3)并行I/O引腳</p><p>  P0.0-P0.7:一般I/O口引腳或數(shù)據(jù)/低位地址總線復(fù)用引腳;</p><p>  P1.0-P1.7:一般I/O口引腳;</p><p>  P2.0-P2.7:一般I/O口引腳或高位地址總線引腳;</p&g

16、t;<p>  P3.0-P3.7:一般I/O口引腳或第二功能引腳</p><p><b>  振蕩器特性:</b></p><p>  XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時鐘源驅(qū)動器件,XTAL2應(yīng)不接。有余輸入至內(nèi)部時鐘信號要通過一個二分頻觸發(fā)器,因此對外部時鐘

17、信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。 </p><p>  2、LED數(shù)碼管顯示器概述</p><p>  本設(shè)計中采用的是7SEG–MPX2-CC–BLUE型號雙數(shù)碼管,它是一種半導(dǎo)體發(fā)光器件,其基本單元是發(fā)光二極管。實物如圖3所示:</p><p>  圖3 共陰雙數(shù)碼管 </p><p>  共陰數(shù)碼管是指將所有

18、發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管。共陰數(shù)碼管在應(yīng)用時應(yīng)將公共極COM接到地線GND上,當(dāng)某一字段發(fā)光二極管的陽極為高電平時,相應(yīng)字段就點亮。當(dāng)某一字段的陽極為低電平時,相應(yīng)字段就不亮。</p><p>  共陰極接法:把發(fā)光二極管的陰極連在一起構(gòu)成公共陰極,使用時公共陰極接地。每個發(fā)光二極管的陽極通過電阻與輸入端相連。</p><p>  LED數(shù)碼顯示器的顯示段碼。

19、 為了顯示字符,要為LED顯示器段碼(或稱字形代碼),組成一個8字形字符的7段,再加上1個小數(shù)點位,共計8段,因此提供給LED顯示器的顯示段碼為1個字節(jié)。各段碼位的對應(yīng)關(guān)系如下表所示.十六進(jìn)制數(shù)及空白字符與P的顯示如下表:</p><p><b>  3、矩陣鍵盤</b></p><p>  在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如

20、圖3所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接</p><p>  圖3 4行3列矩陣鍵盤</p><p><b>  四、程序框圖</b></p><p><b>  N</b></p><p><b>  Y</b></p&

21、gt;<p><b>  主程序</b></p><p><b>  五、部分電路連接</b></p><p>  1、矩陣按鍵掃描函數(shù)ankey()</p><p>  矩陣按鍵的原理和方法:矩陣按鍵的兩端都與單片機(jī)的I/O口相連,在檢測時,人為的通過單片機(jī)I/O口送出低電平。檢測時,先送一行為低電平,其余

22、幾列全為高電平,確定行數(shù),然后立即輪流檢測一次各列是否有低電平,若檢測到某一行為低電平,則確定列數(shù),這樣就可以確定按下那個數(shù)字。</p><p>  本設(shè)計用的是4行3列矩陣按鍵,它接AT89C51單片機(jī)的P1口,接法如圖所示:</p><p>  當(dāng)按下0~9數(shù)字鍵時,會產(chǎn)生相應(yīng)數(shù)值賦給矩陣按鍵掃描函數(shù)中以定義的參數(shù)key,當(dāng)按下*或#鍵時,會分別產(chǎn)生10或11賦給key。若key=10

23、,則將前面按下的數(shù)字送給顯示器;若key=11時調(diào)用對矩陣按鍵掃描進(jìn)行相應(yīng)處理函數(shù)text(uchar )且key賦給它,text(uchar )函數(shù)對key值進(jìn)行相應(yīng)處理:如果只按下一次數(shù)字鍵,那這數(shù)字就會是倒計時的個位,如果按下兩次數(shù)字鍵,那第一次的數(shù)字就會是倒計時的十位,第二次數(shù)字的數(shù)字就會是倒計時的個位,當(dāng)按下#或*鍵時,開始倒計時。</p><p>  2、動態(tài)數(shù)碼管顯示函數(shù)</p>&l

24、t;p>  動態(tài)數(shù)碼管顯示就是輪流向各位數(shù)碼管送出段選及相應(yīng)的位選,利用發(fā)光管的余輝和人眼視覺暫留作用,使人眼感覺各位數(shù)碼管同時都在顯示,實際上多位數(shù)碼管是一位一位輪流顯示的,只是輪流比較快,我們分辨不出來。本設(shè)計用的是兩位動態(tài)共陰數(shù)碼管顯示,它和單片機(jī)的連接如圖所示:</p><p>  其中那排阻是驅(qū)動電路。</p><p><b>  3、復(fù)位電路如圖:</b&

25、gt;</p><p>  RST為復(fù)位信號輸入端,高電平有效。系統(tǒng)上電后,當(dāng)已經(jīng)進(jìn)行過倒計時,這時想進(jìn)行不同時間的倒計時,只要按下復(fù)位按鈕后,就可以進(jìn)行新的倒計時。</p><p><b>  4、總電路圖</b></p><p><b>  六、總體程序</b></p><p>  #inclu

26、de <reg51.h> </p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int </p><p>  sbit sw=P0^6;//十位位選</p><p>  sbit gw=P0^7;//個位位選</p>

27、<p>  sbit led=P3^7;//LED燈</p><p>  uchar code table[]={</p><p>  0x3f,0x06,0x5b,0x4f,</p><p>  0x66,0x6d,0x7d,0x07,</p><p>  0x7f,0x6f};//編碼定義</p><p&g

28、t;  uchar numt0,num;</p><p>  void delayms(uint);</p><p>  void text(uchar);</p><p>  void display(uchar numdis) //動態(tài)數(shù)碼管顯示子函數(shù)</p><p><b>  {</b></p>

29、<p>  uchar shi,ge; //分離兩個分別要顯示的數(shù)</p><p>  shi=numdis/10;</p><p>  ge=numdis%10;</p><p><b>  sw=0;</b></p><p>  P2=table[shi]; //送十位段選數(shù)據(jù)<

30、/p><p>  delayms(5);//延時</p><p><b>  sw=1;</b></p><p><b>  gw=0;</b></p><p>  P2=table[ge]; //送個位段選數(shù)據(jù)</p><p>  delayms(5);</p>

31、<p><b>  gw=1;</b></p><p><b>  }</b></p><p>  void delayms(uint x)//延時x ms</p><p><b>  {</b></p><p><b>  uint i,j;<

32、;/b></p><p>  for(i=x;i>0;i--) //i=x即延時約x毫秒</p><p>  for(j=110;j>0;j--);</p><p><b>  }</b></p><p>  void ankey() //鍵盤掃描</p><p><b&

33、gt;  {</b></p><p>  uchar temp,key;</p><p>  P1=0xf7;//第1行 11110111</p><p><b>  temp=P1;</b></p><p>  temp=temp&0xf0;//temp低4位清0;</p><

34、p>  if(temp!=0xf0) //判斷是否有鍵按下</p><p><b>  {</b></p><p>  delayms(5); //延時,消除抖動</p><p><b>  {</b></p><p>  temp=P1; //重新讀取P1口</p><p

35、>  switch(temp)//判斷哪個鍵按下</p><p><b>  {</b></p><p>  case 0xe7:</p><p><b>  key=1;</b></p><p><b>  break;</b></p><p>

36、  case 0xd7:</p><p><b>  key=2;</b></p><p><b>  break;</b></p><p>  case 0xb7:</p><p><b>  key=3;</b></p><p><b> 

37、 break;</b></p><p><b>  }</b></p><p>  text(key);</p><p>  while(temp!=0xf0)//判斷按鍵是否釋放</p><p><b>  {</b></p><p><b>  te

38、mp=P1;</b></p><p>  temp=temp&0xf0;</p><p><b>  } </b></p><p><b>  }</b></p><p><b>  }</b></p><p>  P1=0xf

39、b;//第2行 </p><p><b>  temp=P1;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></p><p>  delayms(5);<

40、/p><p><b>  {</b></p><p><b>  temp=P1;</b></p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xeb:</p><p>

41、;<b>  key=4;</b></p><p><b>  break;</b></p><p>  case 0xdb:</p><p><b>  key=5;</b></p><p><b>  break;</b></p><

42、;p>  case 0xbb:</p><p><b>  key=6;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  text(key);</p><p>  while(t

43、emp!=0xf0)</p><p><b>  {</b></p><p><b>  temp=P1;</b></p><p>  temp=temp&0xf0;</p><p><b>  } </b></p><p><b&g

44、t;  }</b></p><p><b>  }</b></p><p>  P1=0xfd;//第3行</p><p><b>  temp=P1;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0x

45、f0)</p><p><b>  {</b></p><p>  delayms(5);</p><p><b>  {</b></p><p><b>  temp=P1;</b></p><p>  switch(temp)</p>

46、<p><b>  {</b></p><p>  case 0xed:</p><p><b>  key=7;</b></p><p><b>  break;</b></p><p>  case 0xdd:</p><p><b&

47、gt;  key=8;</b></p><p><b>  break;</b></p><p>  case 0xbd:</p><p><b>  key=9;</b></p><p><b>  break;</b></p><p>&

48、lt;b>  }</b></p><p>  text(key);</p><p>  while(temp!=0xf0)</p><p><b>  {</b></p><p><b>  temp=P1;</b></p><p>  temp=temp&

49、amp;0xf0;</p><p><b>  } </b></p><p><b>  }</b></p><p><b>  }</b></p><p>  P1=0xfe;//第4行</p><p><b>  temp=P1;&l

50、t;/b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></p><p>  delayms(5);</p><p><b>  {</b></p>&

51、lt;p><b>  temp=P1;</b></p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xee:</p><p><b>  key=10;</b></p><p>&l

52、t;b>  break;</b></p><p>  case 0xde:</p><p><b>  key=0;</b></p><p><b>  break;</b></p><p>  case 0xbe:</p><p><b>  k

53、ey=11;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  text(key);</p><p>  while(temp!=0xf0)</p><p><b>  {</b&

54、gt;</p><p><b>  temp=P1;</b></p><p>  temp=temp&0xf0;</p><p><b>  } </b></p><p><b>  }</b></p><p><b>  }&l

55、t;/b></p><p><b>  }</b></p><p>  void text(uchar key)//判斷鍵盤掃描結(jié)果,并倒計時</p><p><b>  {</b></p><p>  static uchar n,bb,s;//靜態(tài)局部變量</p><p

56、><b>  s=1;</b></p><p>  if(key==0||key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9)</p><p>  n++;//有數(shù)字鍵被按下,n加1</p><p>  if(key==10)</p>

57、<p>  n=3; //*被按下,n置3</p><p>  if(key==11)</p><p>  n=4;//#被按下,n置4</p><p><b>  switch(n)</b></p><p><b>  {</b></p><p>  case 1

58、: bb=key;key=20;display(bb);break;//第1次按下數(shù)字鍵</p><p>  case 2: bb=bb*10+key;n=0;key=20;display(bb);break;//第2次按下數(shù)字鍵</p><p>  case 3:{ num=bb;</p><p>  }break;//顯示倒計時時間</p><

59、;p>  case 4: { num=bb;//開始倒計時</p><p>  while(s==1)</p><p><b>  {</b></p><p>  TR0=1;//啟動定時器0中斷</p><p>  if(numt0==20)//如果到了20次,說明1秒時間到</p><p&

60、gt;<b>  {</b></p><p>  numt0=0;//然后把numt0清0重新再計20次</p><p>  num--;//num自減</p><p>  if(num==0)//如果num等0</p><p><b>  {</b></p><p>  T

61、R0=0;//關(guān)閉定時器0中斷</p><p>  s=0; //退出循環(huán)</p><p>  led=0;//點亮LED燈</p><p><b>  }</b></p><p><b>  }</b></p><p>  display(num);//顯示num<

62、/p><p><b>  }</b></p><p>  } break;}</p><p><b>  }</b></p><p>  void init() //初始化函數(shù)</p><p><b>  {</b></p><p

63、>  TMOD=0x01;//設(shè)置定時器0為工作方式1(0000 0001)</p><p>  TH0=(65536-50000)/256;//裝初值50ms一次中斷</p><p>  TL0=(65536-50000)%256;</p><p>  EA=1; //開總中斷</p><p>  ET0=1; //允許定時器0中斷

64、</p><p>  TR0=0; //定時器0計時開始</p><p>  sw=1;//關(guān)數(shù)碼管十位位選</p><p>  gw=1; //關(guān)數(shù)碼管個位位選</p><p><b>  }</b></p><p>  void main()//主函數(shù)</p><p&g

65、t;<b>  {</b></p><p>  init();//初始化函數(shù)</p><p><b>  num=0;</b></p><p>  while(1) //循環(huán)</p><p><b>  {</b></p><p>  ankey();

66、//鍵盤掃描</p><p>  display(num);//動態(tài)數(shù)碼管顯示</p><p><b>  }</b></p><p><b>  }</b></p><p>  void T0_time() interrupt 1//定時器0中斷函數(shù)</p><p>&

67、lt;b>  {</b></p><p>  TH0=(65536-50000)/256;//重裝初值(晶振為12MHz時為定時50毫秒)</p><p>  TL0=(65536-50000)%256;</p><p>  numt0++;//50ms中斷一次</p><p><b>  }</b&

68、gt;</p><p><b>  七、心得體會</b></p><p>  我們學(xué)的單片機(jī)課程是匯編的,對我而言,這是一門苦澀難懂的課程,而且與教材配套的課件完全跟課本一樣,老師本人也不太愿意用那本教材,結(jié)果只能無奈地照本宣科地把教材過一遍。說實在話,直到這門課程結(jié)束,我對單片機(jī)還知之甚少。我明白,作為一名大學(xué)生,決不能再依賴?yán)蠋?,必須學(xué)會如何學(xué)習(xí),必須提高自學(xué)能力

69、。但是,可能是惰性,正如朱光潛先生說的,“人容易朝抵抗力最低的路徑走”,經(jīng)過多次讀閱教材都未能摸出一個所以然來,我最終還是放棄了。因為這次課程設(shè)計,我接觸到了郭天祥的《51單片機(jī)C用語言教程》,我才知道當(dāng)初的學(xué)習(xí)方法太錯了,原以為必須完全了解其內(nèi)部結(jié)構(gòu)原理后,才能去實踐,殊不知實踐中學(xué)習(xí)才是最好的方法,于是就浪費(fèi)了很多時間,又被打擊了信心。后悔無補(bǔ)于事,最糟糕莫過于重頭再來!</p><p>  這次單片機(jī)設(shè)計,

70、我選擇了相對比較簡單的題目,查閱了不少網(wǎng)絡(luò)資源和書籍,試著去理解往年師兄師姐做的課程設(shè)計的電路連接、程序的編寫,才慢慢地摸到了門檻。雖然,至今我還無法完全靠自己完成設(shè)計,但是萬事開頭難,只要踏出了第一步,以后就能不斷地提高自己??偟膩碚f,通過這次單片機(jī)設(shè)計,我沒有取得很大的進(jìn)步,但收獲卻不少。如果沒有這次“被迫”練手的機(jī)會,我恐怕早就放棄這門學(xué)科?,F(xiàn)在我至少知道應(yīng)該如何去學(xué)單片機(jī),我有信心學(xué)好這門課,即使從零開始!</p>

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論