單片機定時鬧鐘課程設計_第1頁
已閱讀1頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  緒 論</b></p><p><b>  摘要:</b></p><p>  單片機是一種集成在電路芯片,是采用超大規(guī)模集成電路技術把具有數據處理能力的中央處理器CPU隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統(tǒng)、定時器/計時器等功能(可能還包括顯示驅動電路、脈寬調制電路、模擬多路轉換器、A/D轉換器

2、等電路)集成到一塊硅片上構成的一個小而完善的計算機系統(tǒng)。、</p><p>  電子鬧鐘是采用數字電路實現對.時,分,秒.數字顯示的計時裝置,廣泛用于個人家庭,車站, 碼頭辦公室等公共場所,成為人們日常生活中不可少的必需品,由于數字集成電路的發(fā)展和石英晶體振蕩器的廣泛應用,使得數字鐘的精度,遠遠超過老式鐘表, 鐘表的數字化給人們生產生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、按時自

3、動打鈴、時間程序自動控制、定時廣播、自動起閉路燈、定時開關烘箱、通斷動力設備、甚至各種定時電氣的自動啟用等,所有這些,都是以鐘表數字化為基礎的。數字鐘已成為人們日常生活中:必不可少的必需品,廣泛用于個人家庭以及車站、碼頭、劇場、辦公室等公共場所,給人們的生活、學習、工作、娛樂帶來極大的方便。由于數字集成電路技術的發(fā)展和采用了先進的石英技術,使數字鐘具有走時準確、性能穩(wěn)定、攜帶方便等優(yōu)點,它還用于計時自動報時及自動控制的領域。因此,研究數

4、字鐘及擴大其應用,有著非?,F實的意義。</p><p>  關鍵字:C52、單片機、定時鬧鐘、電子設計</p><p><b>  設計目的和要求</b></p><p>  1.1設計任務:設計一個可控制的定時鬧鐘。</p><p><b>  1.2設計目的:</b></p>&l

5、t;p>  1.了解定時鬧鐘的組成及工作原理。</p><p>  2.進一步熟悉和掌握單片機的結構和工作原理。</p><p><b>  1.3設計要求:</b></p><p><b>  A.基本要求:</b></p><p>  1).由晶振電路產生1HZ標準秒信號。</p&g

6、t;<p>  2).秒、分為00-59六十進制計數器。</p><p>  3).時為00-23二十四進制計數器。</p><p>  4).可手動校正:能分別進行秒、分、時的校正。只要將開關置于手動位置,可分別對秒、分、時進行連續(xù)脈沖輸入調整。</p><p>  5).當時間到達鬧鐘設定時間時,蜂鳴器發(fā)出報警聲。</p><p

7、><b>  B.提高要求:</b></p><p>  a).通過按鈕快速切換鬧鐘顯示。</p><p>  b).通過計算機串口在PC上快速設定時間鬧鐘</p><p><b>  c).整點報時。</b></p><p><b>  系統(tǒng)設計</b></p&g

8、t;<p><b>  2.1硬件系統(tǒng):</b></p><p>  2.1.1電源電路:</p><p>  電源是單片機系統(tǒng)的重要組成部分,它不僅為系統(tǒng)提供多路電壓源,還直接影響到系統(tǒng)的技術指標和抗干擾性能。AT89C51單片機和一般的數字芯片一樣,都是5V電壓供電,所以可以共用一個5V電源。另外,為了提高電源的穩(wěn)定性,在離電源的最近處做好退耦處理,

9、即用一個47UF和一個10UF電容,以濾去干擾,保證電源的穩(wěn)定。</p><p>  2.1.2 AT89C51單片機</p><p>  AT89C51是一種帶4K字節(jié)閃存可編程可擦除只讀存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機。</p><

10、;p>  使用時VCC接電源,GND接地。P0-P3可作為輸入或者輸出端口。RST接復位電路。</p><p><b>  2.1.3時鐘電路</b></p><p>  單片機的時鐘產生方法有兩種:內部時鐘方式和外部時鐘方式。本系統(tǒng)中AT89C51單片機采用內部時鐘方式。最常用的內部時鐘方式是采用外接晶體和電容組成的并聯諧振回路。振蕩晶體可在1.2MHz~12

11、MHz之間。電容值無嚴格要求,但電容取值對振蕩頻率輸出的穩(wěn)定性、大小和振蕩電路起振速度有少許影響,一般可在20pF~100pF之間取值。</p><p><b>  單片機的時鐘產生</b></p><p><b>  、</b></p><p>  2.1.4數碼管顯示電路</p><p>  要

12、同時使得6個數碼管點亮,所需的IO口是很多的。為了節(jié)省單片機的IO口,通常采用動態(tài)掃描的顯示方法,將每個數碼管的同名段連在一起,分6次向數碼管寫數據,每次對6個數碼管寫相同的數據,每次選通一個數碼管,完成掃描,通過調整、縮短掃描的時間,由于人眼的視覺暫留作用,使得人們看起來就像同時顯示一樣,以達到動態(tài)顯示的目的.</p><p><b>  2.2設計原理</b></p>&l

13、t;p>  2.2.1 系統(tǒng)總體方案</p><p>  1)由于要顯示數字時間,所以需要6位數碼管。</p><p>  2)時間的定時用時鐘電路,修改時間和定時用手動按鍵控制,報警聲通過喇叭發(fā)出。</p><p>  3)AT89S52單片機加上外圍器件(6個共陰數碼管,限流電阻和一個蜂鳴器)和應用程序(KEIL編譯軟件),構成相應的應用系統(tǒng)。</p

14、><p>  2.2.2 系統(tǒng)設計方框圖</p><p>  2.2.3 軟件設計流程</p><p><b>  實驗結果和討論</b></p><p>  在確立了編程設計的基本思路后,我們開始查找相關的編程資料,然后采用C語言對軟件設計的要求進行編譯。一開始進展很慢,并且編程過程中出現個各種錯誤,經過大量時間的編譯與完

15、善,我們終于逐步完成定時鬧鐘的軟件設計過程。</p><p><b>  最終程序如下:</b></p><p>  #include<reg51.h></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</

16、p><p>  uchar code shu[]={0x3f,0x06,0x5b,0x4f,</p><p>  0x66,0x6d,0x7d,0x07,</p><p>  0x7f,0x6f}; //0~9</p><p>  uchar code shu2[]={0xbf,0x86,0xdb,0xcf,</p&

17、gt;<p>  0xe6,0xed,0xfd,0x87,</p><p>  0xff,0xef}; //帶小數點0~9</p><p>  uchar code wei[]={0xef,0xdf,0xbf,0x7f,0xf7,0xfb};//數碼管位選碼</p><p>  uchar x[]={0,0,0,0};</p

18、><p>  uchar y[]={0,0,0,0,0,0};</p><p>  uint hour=12,min,sec,h=22,m=0;</p><p>  uint a,s1=1,s2=1,s3=0,i=0,status=0,num=0,class=0;</p><p>  bit flag=0;</p><p>

19、;  sbit P3_7=P3^7;</p><p>  void delay(uint t); </p><p>  void keyprint(unsigned char key);</p><p>  void display();</p><p>  void timer0();</p><p>  vo

20、id sint()interrupt 4 //串口中斷,實現PC上快速設定時間與鬧鐘</p><p><b>  {</b></p><p><b>  s3++;</b></p><p><b>  s3=s3%4;</b></p><p>  if(RI&&am

21、p;s3==1)</p><p><b>  { </b></p><p><b>  RI=0;</b></p><p>  hour=SBUF;</p><p><b>  }</b></p><p>  if(RI&&s3==2)

22、</p><p><b>  {</b></p><p><b>  RI=0;</b></p><p><b>  min=SBUF;</b></p><p><b>  }</b></p><p>  if(RI&&am

23、p;s3==3)</p><p><b>  {</b></p><p><b>  RI=0;</b></p><p><b>  h=SBUF;</b></p><p><b>  }</b></p><p>  if(RI&a

24、mp;&s3==0)</p><p><b>  {</b></p><p><b>  RI=0;</b></p><p><b>  m=SBUF;</b></p><p><b>  }</b></p><p><

25、;b>  if(!TI)</b></p><p><b>  TI=0; </b></p><p><b>  }</b></p><p>  void delay(uint t) </p><p><b>  {</b></p><

26、;p><b>  uint i;</b></p><p>  while(t--)</p><p>  for(i=0;i<125;i++);</p><p><b>  }</b></p><p>  main() </p><p><b&

27、gt;  { </b></p><p><b>  uchar n;</b></p><p>  uchar input;</p><p><b>  n=0x0f;</b></p><p>  TMOD=0x21; </p><p>  TH0=(65

28、536-5000)/256; </p><p>  TL0=(65536-5000)%256; </p><p><b>  TH1=0xfd;</b></p><p><b>  TL1=0xfd;</b></p><p>  SCON=0x50; </p><p&

29、gt;  PCON=0x00;</p><p><b>  TR1=1;</b></p><p>  IP=0x10; </p><p>  TR0=1; </p><p>  IE=0x92; //開定時器0,串口中斷</p><p>  while(1)

30、 //鍵掃描程序 </p><p>  { </p><p>  input=P2&0x0f;</p><p>  if(input!=0x0f&&s1==1) </p><p><b>  { </b></p><p>  d

31、elay(10);</p><p><b>  s1=0;</b></p><p>  if(input!=0x0f&&s2==1)</p><p><b>  {</b></p><p>  s2=0; //按住不放</p><p>  n =

32、 input; //n用來暫時存放鍵值</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(input==0x0f&&s1==0)</p><p><b>  {</b></p><

33、;p><b>  s1=1; </b></p><p><b>  s2=1;</b></p><p>  keyprint(n);</p><p><b>  n=0x0f;</b></p><p><b>  }</b></p>&

34、lt;p>  if((hour==h&&min==m)||(h!=0&&min==0)) </p><p><b>  {</b></p><p>  if(sec==0)</p><p><b>  P3_7=0;</b></p><p>  if(sec

35、==1)</p><p><b>  P3_7=1;</b></p><p>  if(sec==2)</p><p><b>  P3_7=0;</b></p><p>  if(sec==3)</p><p><b>  P3_7=1;</b><

36、;/p><p>  if(sec==4)</p><p><b>  P3_7=0;</b></p><p>  if(sec==5)</p><p><b>  P3_7=1;</b></p><p><b>  } </b></p>&

37、lt;p><b>  else </b></p><p><b>  P3_7=1;</b></p><p>  if(h>=24) </p><p><b>  h=0; </b></p><p>  display();</p><p>

38、;<b>  }</b></p><p><b>  }</b></p><p>  void keyprint(unsigned char key) //各個按鍵功能</p><p><b>  { </b></p><p>  if(key==0x0e)</p&g

39、t;<p><b>  {</b></p><p><b>  num++;</b></p><p>  if(num==1) {class=1;}</p><p>  if(num==2) {class=2;num=0;}</p><p><b>  }</b&g

40、t;</p><p>  if(key==0x0d)</p><p><b>  {</b></p><p><b>  status++;</b></p><p>  if(status>=5)</p><p><b>  status=0;</b&g

41、t;</p><p><b>  }</b></p><p>  if(key==0x0b)</p><p><b>  {</b></p><p>  if(status==1)</p><p><b>  {</b></p><p

42、>  if(min<59)min++;</p><p>  else {min=0;hour++;}</p><p><b>  }</b></p><p>  if(status==2)</p><p><b>  {</b></p><p>  if(hou

43、r<23) hour++;</p><p>  else hour=0;</p><p><b>  }</b></p><p>  if(status==3)</p><p><b>  {</b></p><p>  if(m<59)m++;</p&g

44、t;<p>  else {m=0;h++;}</p><p><b>  }</b></p><p>  if(status==4)</p><p><b>  {</b></p><p>  if(h<23) h++;</p><p><b>

45、;  else h=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void display() //數碼管數值顯示函數</p>

46、<p><b>  {</b></p><p>  uchar d=0;</p><p>  if(class==1||class==0)</p><p><b>  { </b></p><p>  x[0]=hour/10; // 顯示時的十位</p>

47、<p>  x[1]=hour%10; // 顯示時的個位</p><p>  x[2]=min/10; // 顯示分的十位</p><p>  x[3]=min%10; // 顯示分的個位</p><p>  while(d<4)</p><p><b>  

48、{</b></p><p>  P2=wei[d];</p><p>  P0=shu[x[d]];</p><p><b>  delay(1);</b></p><p><b>  d++;</b></p><p><b>  }</b>

49、</p><p><b>  }</b></p><p>  else if(class==2)</p><p><b>  {</b></p><p>  y[0]=h/10; // 顯示時的十位</p><p>  y[1]=h%10;

50、 // 顯示時的個位</p><p>  y[2]=m/10; // 顯示分的十位</p><p>  y[3]=m%10; // 顯示分的個位</p><p><b>  d=0; </b></p><p>  if(flag==0)// 每過0.5s小數

51、點閃爍一次</p><p><b>  {</b></p><p>  while(d<4)</p><p><b>  {</b></p><p>  P2=wei[d];</p><p>  P0=shu2[y[d]];</p><p>&l

52、t;b>  delay(1);</b></p><p><b>  d++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(flag==1)</p><p>

53、<b>  {</b></p><p>  while(d<4)</p><p><b>  {</b></p><p>  P2=wei[d];</p><p>  P0=shu[y[d]];</p><p><b>  delay(1);</b>

54、;</p><p><b>  d++;</b></p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b></p><p><b>  }</b

55、></p><p>  void timer0() interrupt 1 //定時器0方式1中斷函數</p><p><b>  { </b></p><p>  uint count;</p><p>  TH0=(65536-5000)/256; // 定時器0設置初始值1ms中斷初始值<

56、;/p><p>  TL0=(65536-5000)%256; </p><p><b>  TR0=1;</b></p><p>  count++; //正常計時</p><p>  if(count>=100) </p><p><b>

57、  {</b></p><p><b>  flag=1;</b></p><p>  if(count>=200) // 定時 1S 到,以下為時鐘的正常走鐘邏輯 </p><p><b>  {</b></p><p><b>  flag

58、=0;</b></p><p><b>  count=0;</b></p><p><b>  sec++;</b></p><p>  if(sec>= 60)</p><p>  { </p><p><b> 

59、 sec=0;</b></p><p>  min++; //秒到60分加一,秒清零</p><p><b>  }</b></p><p>  if(min>= 60) </p><p>  { </p><p><b>  min=0; &

60、lt;/b></p><p>  hour++; //分到60時加一,分清零</p><p><b>  }</b></p><p>  if(hour>= 24) </p><p><b>  { </b></p><p>  hour=0; //時到

61、24立即變?yōu)?</p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  結論</

62、b></p><p>  4.1本次課程設計的特點:</p><p>  本次課程設計對單片機這么課程的知識原理要求比較高,具有一定的編程要求。設計出的定時鬧鐘比較貼近生活產品,實用性計較強,因此達到了知識與實踐相結合,學以致用的目的。</p><p><b>  4.2主要貢獻:</b></p><p>  讓我

63、們再一次深入了解了單片機的基本知識和原理,給予我們一定的單片機設計經驗,強化了教學目標。</p><p><b>  4.3心得與體會:</b></p><p>  課程設計是培養(yǎng)學生綜合運用所學知識,發(fā)現、提出、分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié),是對學生實際工作能力的具體訓練和考察過程。</p><p>  回顧起此次單片機課程設計

64、,我仍感慨頗多,學到了很多的東西。同時不僅鞏固了以前所學過的知識,而且還學到了很多在書本上所沒有學到過的知識。在實際設計中才發(fā)現,書本上理論性的東西與在實際運用中的還是有一定的出入的,所以有些問題不但要深入地理解,而且要不斷地更正以前的錯誤思維。一切問題必須要靠自己一點一滴的解決,而在解決的過程當中你會發(fā)現自己在飛速的提升。對于單片機設計,其硬件電路是比較簡單的,主要是解決程序設計中的問題,而程序設計是一個很靈活的東西,它反映了你解決問

65、題的邏輯思維和創(chuàng)新能力,它才是一個設計的靈魂所在。因此可以說單片機的設計是軟件和硬件的結合,二者是密不可分的。</p><p><b>  五.參考文獻</b></p><p>  【1】《C51單片機技術教程》 人民郵電出版社</p><p><b>  ——田希輝、薛亮儒</b></p><p>

66、;  【2】《單片機應用技術選編》 北京航空航天大學出版社</p><p><b>  ——何立民</b></p><p><b>  六.附 錄:</b></p><p>  1.主要使用軟件:Keil C語言編寫軟件</p><p>  Protues 仿真軟件</p><

溫馨提示

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

評論

0/150

提交評論