基于單片機的電子鬧鐘設計_第1頁
基于單片機的電子鬧鐘設計_第2頁
基于單片機的電子鬧鐘設計_第3頁
基于單片機的電子鬧鐘設計_第4頁
基于單片機的電子鬧鐘設計_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、基于單片機的電子鬧鐘設計摘 要本設計以AT89C51芯片為核心,輔以必要的外圍電路,設計了一個結構簡單,功能齊全的電子時鐘,它由5V直流電源供電。關鍵詞:單片機;led;鬧鐘;定時器AbstractThis design, adopting AT89C51 chip as the core part with some necessary peripheral circuits, is a simple electronic clock which uses 5V DC as the power supply.Keywords:single chip machine ,in fixed tim

2、e machine, alarm clock,LED1 引言1.1設計目的此次課程設計是在學習先修課程單片機原理與系統(tǒng)設計之后,為加強對學生系統(tǒng)設計和應用能力的培養(yǎng)而開設的綜合設計訓練環(huán)節(jié)。本課程設計應結合單片機原理與系統(tǒng)設計課程的基礎理論,重點強調(diào)實際應用技能訓練,包括單片機系統(tǒng)設計的軟件和硬件兩部分。其課程設計任務是使學生通過應用單片機系統(tǒng)設計的基本理論,基本知識與基本技能,掌握單片機應用系統(tǒng)各主要環(huán)節(jié)的設計、調(diào)試方法,初步掌握并具備應用單片機進行設備技術改造和產(chǎn)品開發(fā)的能力,培養(yǎng)學生的創(chuàng)新意識,提高學生的動手能力和分析問題、解決問題的能力。1.2設計要求結合單片機知識,以AT89C51單

3、片機為核心,利用七段LED數(shù)碼管實現(xiàn)計時、校時及鬧鐘功能。1.3設計方法以AT89C51單片機為核心,外加晶振電路,使用8個七段數(shù)碼管顯示,LED采用動態(tài)掃描,用74ls245芯片作為驅(qū)動電路。通過四個獨立按鍵對時間進行定時、校時,從而實現(xiàn)鬧鐘提醒功能。2 設計方案及原理2.1設計方案選AT89C51單片機作為系統(tǒng)核心,輔助外部產(chǎn)生時鐘信號的晶振電路,再加上四個獨立按鍵作為輸入信號,使用8個七段數(shù)碼管顯示時間,芯片74ls245為數(shù)碼管段選線的驅(qū)動,最后用蜂鳴器實現(xiàn)鬧鈴功能。使用單片機的定時器T0計時時間為50ms,計時20次作為1s的時間基準。第一部分,12MHz的晶振連接至單片機的時鐘信號

4、輸入端;第二部分,四個獨立按鍵加上四個上拉電阻連接至單片機的P1口的低四位;第三部分,單片機的P0口通過由芯片74ls245構成的驅(qū)動電路連接至數(shù)碼管的段選線,單片機的P3口連接至數(shù)碼管的位選線;第四部分,單片機的P2.1通過一個NPN型三極管連接至蜂鳴器。8個七段數(shù)碼管使用動態(tài)掃描顯示時間,獨立按鍵用軟件編程實現(xiàn)對時間和鬧鐘時、分、秒的設置,再通過比較所設置的鬧鐘與時間是否相等,達到鬧鈴發(fā)出聲響的效果。2.2設計原理系統(tǒng)原理圖如圖2.1所示。AT89C51晶振按鍵段碼驅(qū)動位碼驅(qū)動 蜂鳴器8位數(shù)碼管圖2.1 系統(tǒng)原理圖3 硬件設計硬件電路分四個模塊:晶振電路、鍵盤電路、數(shù)碼管顯示電路、蜂鳴器驅(qū)

5、動電路。晶振電路使用12MHz晶體振蕩器,經(jīng)分頻后供單片機工作。鍵盤采用4個獨立按鍵配以4個上拉電阻實現(xiàn)對時鐘和鬧鐘的設定及修改。由于通過數(shù)碼管公共及的電流較大且避免過多地使用分立元件,采用了一片74ls245來驅(qū)動段碼,用P3口作位碼驅(qū)動。發(fā)音部分是通過三極管放大驅(qū)動蜂鳴器工作,再通過軟件這時產(chǎn)生等時時間方波驅(qū)動蜂鳴器發(fā)出間斷嘀聲,這樣就可以省去硬件振蕩電路,降低成本。系統(tǒng)硬件電路圖如圖3.1所示。圖3.1 系統(tǒng)硬件圖4 軟件設計源程序清單見附錄。主程序流程圖如圖4.1所示。圖4.1 主程序流程圖5 系統(tǒng)仿真及調(diào)試硬件部分設置了的三個按鍵K1、K2、K3、K4。當按鍵K1第一次按下時,停止計

6、時進入鬧鐘1的秒設置,當按鍵K1第二、第三次按下時,分別進入鬧鐘1的分設置和時設置,當按K1第四 、第五、第六次按下時分別進入鬧鐘2的秒、分、時設置,當按K1第七 、第八、第九次按下時分別進入鬧鐘3的秒、分、時設置,當按K1第十 、第二一、第十二次按下時分別進入時間的秒、分、時設置,在K1按下的各階段,可用按鍵K2、K3進行時間和鬧鈴時間的時、分、秒進行加減設置;當按鍵K1第十三次按下時恢復到時間顯示功能。當顯示的時間和定時設置的時間一致時,蜂鳴器發(fā)出等時間斷蜂鳴聲,鬧鈴時間設置為60秒。在各個鬧鐘設置階段,如果有K4按下,則相應鬧鐘功能關閉或開啟;如在鬧鈴時有K4按下則提前停止鬧鈴。系統(tǒng)仿真

7、圖如圖5.1所示。圖5.1 系統(tǒng)仿真圖6 總結通過兩周的努力,完成了電子鬧鐘的設計目的,實現(xiàn)了時間的顯示、校時、設置鬧鐘、鬧鈴等功能。這期間,我復習了單片機的相關知識,并結合查閱相關資料,設計了整體電路以及各模塊的電路,對照硬件電路編寫對應模塊的子程序,最后將各個子程序整合到一個主程序中,完成了設計所需功能。在設計中,我發(fā)現(xiàn)選擇合適的元器件很重要,比如數(shù)碼管有共陽極和共陰極兩種,不同的選擇會導致程序的不同,經(jīng)過多次調(diào)試最終選擇了共陽極數(shù)碼管。另外,我覺得軟件的設計比硬件設計更重要,而且難度更大。比如寫一個程序看其功能很少認為編寫程序簡單,但到編程的時候才發(fā)現(xiàn)一些細微的知識或低級錯誤經(jīng)常犯做不到

8、最后常常失敗,所以有些東西只有學精弄懂并且要細心才行,只學習理論有些東西是很難理解的,更談不上掌握。我在這次設計中收獲頗多。我對所學的理論知識在實踐中加深了認識,同時更加熟練掌握了Proteus、Keil等軟件的使用。做任何事都需要耐心和細心,一點小的疏忽和懈怠可能導致整個設計失敗。還有一點,自己的設計思路不可能憑空產(chǎn)生,只有借鑒別人已有的設計并充分消化吸收成為自己的東西,才能做出更好的設計作品。參考文獻1 王思明.單片機原理及應用系統(tǒng)設計M.北京:科學出版社,2012.2 陳明熒. 89C51單片機課程設計實訓教材M.北京:清華大學出版社,2003.3 劉瑞新.單片機原理及應用教程M.北京:

9、機械工業(yè)出版社,2005.4 楊文龍.單片機原理及應用M.西安:西安電子科技大學出版社,2002.附錄源程序清單:/*頭文件*#include<reg51.h> #include<intrins.h>/*宏定義*#define uchar unsigned char #define uint unsigned int/*位聲明*sbit key1=P10; sbit key2=P11;sbit key3=P12;sbit key4=P13;sbit fmq=P21;/*數(shù)碼管顯示的數(shù)值*uchar code table=0xc0,0xf9,0xa4,0xb0,0x99,

10、0x92,/ 0 1 2 3 4 5 0x82,0xf8,0x80,0x90,0xbf,0x0ff; / 6 7 8 9 - 滅 void jia(); /定義時間加函數(shù) void jian(); /定義時間減函數(shù)/*數(shù)組定義,數(shù)組內(nèi)含有8個數(shù)值*uchar table18,table28,table38,table48;/*時間顯示初始值*uchar shi=12,fen=0,miao=0; /*定義全局變量*uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;uchar shi4,fen4,miao4;uchar flag, flag

11、1, wss, cnt, cnt1, alm1, alm2, alm3;/ 1秒 等時 位閃 次數(shù) 校時 鬧1 鬧2 鬧3uint flag2;/ 蜂鳴 /*延時函數(shù),用于動態(tài)掃描數(shù)碼管*void delay(uchar i) uchar x,y; for(x=i;x>0;x-) for(y=120;y>0;y-); /*初始化函數(shù)*void init() TMOD=0x01; /工作方式1 TH0=0x3c; /定時時間為:50ms(65536-50000)/256 TL0=0x0b0; /(65536-50000)%256 ET0=1; /打開定時器 EA=1; /開總中斷 T

12、R0=1; /啟動定時器 /*顯示子函數(shù),用于顯示時間數(shù)值*void display() uchar i,j; if(cnt!=10|wss=0) table10=miao%10; /分離秒的個位與十位 table11=miao/10; else table10=table11=11;if(cnt!=11|wss=0) table13=fen%10; /分離分的個位與十位 table14=fen/10; else table13=table14=11;if(cnt!=12|wss=0) table16=shi%10; /分離時的個位與十位 table17=shi/10; else table1

13、6=table17=11; table12=table15=10; j=0x7f; for(i=0;i<=7;i+) /從秒到時的掃描 P3=j;/選通點亮八個數(shù)碼管 P0=tabletable1i; /顯示數(shù)值 delay(10);/調(diào)用延時程序 j=_cror_(j,1); /循環(huán)右移 /*顯示子函數(shù),用于顯示定時1時間*void display1() uchar i,j; if(alm1=0) if(cnt!=1|wss=0) table20=miao1%10; /分離秒的個位與十位 table21=miao1/10; else table20=table21=11; if(cnt

14、!=2|wss=0) table23=fen1%10; /分離分的個位與十位 table24=fen1/10; else table23=table24=11; if(cnt!=3|wss=0) table26=shi1%10; /分離時的個位與十位 table27=shi1/10; else table26=table27=11; else table20=table21=table23=table24=table26=table27=10; table22= table25=10; j=0x7f; for(i=0;i<=7;i+) /從秒到時的掃描 P3=j; /選通點亮八個數(shù)碼管

15、P0=tabletable2i;/顯示數(shù)值delay(10); /調(diào)用延時程序 j=_cror_(j,1); /循環(huán)右移 /*顯示子函數(shù),用于顯示定時2時間*void display2() uchar i,j; if(alm2=0) if(cnt!=4|wss=0) table30=miao2%10; /分離秒的個位與十位 table31=miao2/10; else table30=table31=11; if(cnt!=5|wss=0) table33=fen2%10; /分離分的個位與十位 table34=fen2/10; else table33=table34=11;if(cnt!=

16、6|wss=0) table36=shi2%10; /分離時的個位與十位 table37=shi2/10; else table36=table37=11; else table30=table31=table33=table34=table36=table37=10; table32= table35=10; j=0x7f; for(i=0;i<=7;i+) /從秒到時的掃描 P3=j; /選通點亮八個數(shù)碼管 P0=tabletable3i; /顯示數(shù)值delay(10); /調(diào)用延時程序 j=_cror_(j,1); /循環(huán)右移 /*顯示子函數(shù),用于顯示定時3時間數(shù)值*/void d

17、isplay3() uchar i,j; if(alm3=0) if(cnt!=7|wss=0) table40=miao3%10; /分離秒的個位與十位 table41=miao3/10; else table40=table41=11;if(cnt!=8|wss=0) table43=fen3%10; /分離分的個位與十位 table44=fen3/10;else table43=table44=11;if(cnt!=9|wss=0) table46=shi3%10; /分離時的個位與十位 table47=shi3/10;else table46=table47=11; else tabl

18、e40=table41=table43=table44=table46=table47=10; table42= table45=10; j=0x7f; for(i=0;i<=7;i+) /從秒到時的掃描 P3=j; /選通點亮八個數(shù)碼管 P0=tabletable4i; /顯示數(shù)值delay(10); /調(diào)用延時程序 j=_cror_(j,1); /循環(huán)右移 /*時間子函數(shù) */void shijian() if(flag>=20) /判斷是否到一秒 wss=wss; flag=0; /到了,則標志位清零 if(cnt1!=0) miao4+; /秒加1 if( miao4>

19、;59) /判斷秒是否到60s miao4=0; /到了,則清零 fen4+; /分加1 if(fen4>59) /判斷分是否到1min fen4=0; /到了,則清零 shi4+; /時加1 if(shi4>23) /判斷時是否到24h shi4=0; /到了,則清零 else miao+; /秒加1 if( miao>59) /判斷秒是否到60s miao=0; /到了,則清零 fen+; /分加1 if(fen>59) /判斷分是否到1min fen=0; / 到了,則清零 shi+; /時加1 if(shi>23) / 判斷時是否到24h shi=0; /

20、到了,則清零 /*鍵盤掃描子函數(shù)*/void key_scan() if(key1=0) while(!key1) /防止掉顯 if(cnt=1|cnt=2|cnt=3) display1(); /key1按了1、2、3次,調(diào)用鬧鐘1子程序 if(cnt=4|cnt=5|cnt=6) display2(); / key1按了4、5、6次,調(diào)用鬧鐘2子程序 if(cnt=7|cnt=8|cnt=9) display3(); / key1按了7、8、9次,調(diào)用鬧鐘3子程序 if(cnt=0|cnt=10|cnt=11|cnt=12|cnt=13) display(); / key1按了10、11、

21、12、13次,調(diào)用計時子程序 cnt+; /記下按鍵key1按下的次數(shù) if(cnt=10&&cnt1=0) miao4=miao; fen4=fen;shi4=shi;cnt1+;if(cnt=13) cnt=0; if(cnt1=1) miao=miao4; fen=fen4; shi=shi4; cnt1=0; if(key2=0) /判斷key2是否按下 while(!key2) /防止掉顯 if(cnt=1|cnt=2|cnt=3) display1(); if(cnt=4|cnt=5|cnt=6) display2(); if(cnt=7|cnt=8|cnt=9)

22、display3(); if(cnt=0|cnt=10|cnt=11|cnt=12|cnt=13) display(); jia(); /調(diào)用加1子函數(shù) if(key3=0) /判斷key3是否按下 while(!key3) /防止掉顯 if(cnt=1|cnt=2|cnt=3) display1(); if(cnt=4|cnt=5|cnt=6) display2(); if(cnt=7|cnt=8|cnt=9) display3(); if(cnt=0|cnt=10|cnt=11|cnt=12|cnt=13) display(); jian(); /調(diào)用減1子函數(shù) if(key4=0) /判

23、斷key4是否按下 while(!key4) /防止掉顯 if(cnt=1|cnt=2|cnt=3) alm1=alm1; display1(); if(cnt=4|cnt=5|cnt=6) alm2=alm2; display2(); if(cnt=7|cnt=8|cnt=9) alm3=alm3; display3(); if(cnt=0|cnt=10|cnt=11|cnt=12|cnt=13) display(); /*加1子函數(shù)*void jia() if(cnt=1) /判斷key1按下的次數(shù)是否為1 miao1+; /是,則秒加1 if(miao1>59) /判斷秒是否大于6

24、0,是,則秒清零 miao1=0; if(cnt=2) /判斷key1按下的次數(shù)是否為2 fen1+;/是,則分加1 if(fen1>59) /判斷分是否大于60 fen1=0; /是,則分清零 if(cnt=3) /判斷key1按下的次數(shù)是否為3 shi1+; /是,則時加1 if(shi1>23) /判斷時是否大于23 shi1=0; /是,則時清零 if(cnt=4) /判斷key1按下的次數(shù)是否為4 miao2+; /是,則秒加1 if(miao2>59) /判斷秒是否大于60,是,則秒清零 miao2=0; if(cnt=5) /判斷key1按下的次數(shù)是否為5 fe

25、n2+; /是,則分加1 if(fen2>59) /判斷分是否大于60 fen2=0; /是,則分清零 if(cnt=6) /判斷key1按下的次數(shù)是否為6 shi2+; /是,則時加1 if(shi2>23) /判斷時是否大于23 shi2=0; /是,則時清零 if(cnt=7) /判斷key1按下的次數(shù)是否為7 miao3+; /是,則秒加1 if(miao3>59) /判斷秒是否大于60,是,則秒清零 miao3=0; if(cnt=8) /判斷key1按下的次數(shù)是否為8 fen3+; /是,則分加1 if(fen3>59) /判斷分是否大于60 fen3=0;

26、 /是,則分清零 if(cnt=9) /判斷key1按下的次數(shù)是否為9 shi3+; /是,則時加1 if(shi3>23) /判斷時是否大于23 shi3=0; /是,則時清零 if(cnt=10) /判斷key1按下的次數(shù)是否為10 miao+; /是,則秒加1 if(miao>59) /判斷秒是否大于60,是,則秒清零 miao=0;cnt1+; if(cnt=11) /判斷key1按下的次數(shù)是否為11 fen+; /是,則分加1if(fen>59) /判斷分是否大于60 fen=0; /是,則分清零cnt1+; if(cnt=12) /判斷key1按下的次數(shù)是否為12

27、 shi+; /是,則時加1 if(shi>23) /判斷時是否大于23 shi=0; /是,則時清零cnt1+; /*減1子函數(shù)*/void jian() if(cnt=1)/判斷key1按下的次數(shù)是否為1,是則秒減1 miao1-; if(miao1=255)/判斷秒是否減到255,是,則秒置59 miao1=59; if(cnt=2)/判斷key1按下的次數(shù)是否為2,是則分減1 fen1-; if(fen1=255) /判斷分是否減到255,是,則分置59 fen1=59; if(cnt=3) /判斷key1按下的次數(shù)是否為3,是則時減1 shi1-; if(shi1=255) /

28、判斷時是否減到255,是,則時置23 shi1=23; if(cnt=4) /判斷key1按下的次數(shù)是否為4,是則秒減1 miao2-; if(miao2=255) /判斷秒是否減到255,是,則秒置59 miao2=59; if(cnt=5) /判斷key1按下的次數(shù)是否為5,是則分減1 fen2-; if(fen2=255) /判斷分是否減到255,是,則分置59 fen2=59; if(cnt=6) /判斷key1按下的次數(shù)是否為6,是則時減1 shi2-; if(shi2=255) /判斷時是否減到255,是,則時置23 shi2=23; if(cnt=7) /判斷key1按下的次數(shù)是

29、否為7,是則秒減1 miao3-; if(miao3=255) /判斷秒是否減到255,是,則秒置59 miao3=59; if(cnt=8) /判斷key1按下的次數(shù)是否為8,是則分減1 fen3-; if(fen3=255) /判斷分是否減到255,是,則分置59 fen3=59; if(cnt=9) /判斷key1按下的次數(shù)是否為9,是則時減1 shi3-; if(shi3=255) /判斷時是否減到255,是,則時置23 shi3=23; if(cnt=10) /判斷key1按下的次數(shù)是否為10,是則秒減1 miao-; if(miao=255) /判斷秒是否減到255,是,則秒置59 miao=59; cnt1+; if(cnt=11) /判斷key1按下的次數(shù)是否為11,是則分減1 fen-; if(fen=255) /判斷分是否減到255,是,則分置59 fen=59; cnt1+; if(cnt=12) /判斷key1按下的次數(shù)是否為12,是

溫馨提示

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

最新文檔

評論

0/150

提交評論