單片機(jī)數(shù)字鬧鐘電子表設(shè)計(jì)報(bào)告_第1頁
單片機(jī)數(shù)字鬧鐘電子表設(shè)計(jì)報(bào)告_第2頁
單片機(jī)數(shù)字鬧鐘電子表設(shè)計(jì)報(bào)告_第3頁
單片機(jī)數(shù)字鬧鐘電子表設(shè)計(jì)報(bào)告_第4頁
單片機(jī)數(shù)字鬧鐘電子表設(shè)計(jì)報(bào)告_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、單片機(jī)數(shù)字鬧鐘/電子表設(shè)計(jì)報(bào)告一、本設(shè)計(jì)功能描述1、采用stc89c52單片機(jī)作為主控芯片,實(shí)現(xiàn)數(shù)字鐘表主控功能。2、采用液晶屏顯示當(dāng)前年、月、日、時(shí)、分、秒,鬧鈴時(shí)間及狀態(tài)等信息。3、采用六鍵鍵盤設(shè)定時(shí)間初始值,具體方法是按時(shí)間設(shè)定鍵依次進(jìn)入年、月、日、時(shí)、分、秒設(shè)定狀態(tài),然后通過向上、向下鍵修改設(shè)定值。正在設(shè)定的變量以閃爍狀態(tài)突出顯示。4、采用六鍵鍵盤設(shè)定鬧鈴時(shí)間,具體方法是按鬧鈴設(shè)定鍵依次進(jìn)入時(shí)、分設(shè)定狀態(tài),然后通過向上、向下鍵修改設(shè)定值。正在設(shè)定的變量以閃爍狀態(tài)突出顯示。5、采用ds1302實(shí)時(shí)時(shí)鐘芯片完成后臺(tái)計(jì)時(shí)功能,要求具有后備電源,即使主電源掉電時(shí)間仍然保持運(yùn)行。6、可設(shè)定鬧鈴使

2、能,具體方法是按鬧鈴使能鍵,按一次打開,再按一次關(guān)閉。鬧鈴使能關(guān)閉時(shí)不報(bào)警。7、當(dāng)鬧鈴使能打開,且當(dāng)前時(shí)間到達(dá)鬧鈴設(shè)置時(shí)間,則蜂鳴器和led紅燈同時(shí)報(bào)警,如不按取消鍵,報(bào)警時(shí)間為1分鐘。報(bào)警狀態(tài)可以通過按取消鍵退出。8、系統(tǒng)通過usb電源供電,單片機(jī)程序也可通過usb線串行下載。二、相關(guān)基礎(chǔ)介紹1ds1302芯片(1) ds1302的性能特性l 實(shí)時(shí)時(shí)鐘,可對(duì)秒、分、時(shí)、日、周、月以及帶閏年補(bǔ)償?shù)哪赀M(jìn)行計(jì)數(shù);ds1302時(shí)鐘芯片包括實(shí)時(shí)時(shí)鐘/日歷和31字節(jié)的靜態(tài)ram。它經(jīng)過一個(gè)簡(jiǎn)單的串行接口與微處理器通信。實(shí)時(shí)時(shí)鐘/日歷提供秒、分、時(shí)、日、周、月和年等信息。對(duì)于小于31天的月和月末的日期自動(dòng)

3、進(jìn)行調(diào)整,還包括閏年校正的功能。時(shí)鐘的運(yùn)行可以采用24h或帶am(上午)/pm(下午)的12h格式。采用三線接口與cpu 進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或ram數(shù)據(jù)。ds1302有主電源/后備電源雙電源引腳:vcc1在單電源與電池供電的系統(tǒng)中提供電源,并提供低功率的電池備份;vcc2在雙電源系統(tǒng)中提供主電源,在這種運(yùn)用方式中vcc1連接到備份電,以便在沒有主電源的情況下能保存時(shí)間信息以及數(shù)據(jù)。ds1302由vcc1或vcc2中較大者供電。當(dāng)vcc2大于vcc10.2v時(shí),vcc2給ds1302供電;當(dāng)vcc2小于vcc1時(shí),ds1302由vcc1供電。(2) ds13

4、02數(shù)據(jù)操作原理 ds1302在任何數(shù)據(jù)傳送時(shí)必須先初始化,把rst腳置為高電平,然后把8位地址和命令字裝入移位寄存器,數(shù)據(jù)在sclk的上升沿被輸出。無論是讀周期還是寫周期,開始8位指定40存器中哪個(gè)將被訪問到。在開始8個(gè)時(shí)鐘周期,把命令字節(jié)裝入移位寄存器之后,另外的始終周期在讀操作時(shí)輸出數(shù)據(jù),在寫操作時(shí)寫入數(shù)據(jù)。時(shí)鐘脈沖的個(gè)數(shù)在單字節(jié)方式下為8加8,在多字節(jié)方式下為8加字節(jié)數(shù),最大可達(dá)248字?jǐn)?shù)。 如果在傳送過程中置rst腳為低電平,則會(huì)中止本次數(shù)據(jù)傳送,并且i/o引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在vcc 2.5v之前,rst腳必須保持低電平。只有在sclk為低電平時(shí),才能將rst置為高電平。d

5、s1302的引腳及內(nèi)部結(jié)構(gòu)圖如圖1所示。 圖1 ds1302引腳圖及內(nèi)部結(jié)構(gòu)ds1302的控制字如圖2所示??刂谱止?jié)的最高有效位(位7)必須是邏輯1;如果它為0。則不能把數(shù)據(jù)寫入到ds1302中。位6如果為0則表示存取日歷時(shí)鐘數(shù)據(jù);為1表示存取ram數(shù)據(jù)。位51(a4a0)指示操作單元的地址。最低有效位(位0)如為0,表示要進(jìn)行寫操作;為1表示進(jìn)行讀操作??刂谱止?jié)總是從最低位開始輸入/輸出。圖2 ds1302的控制字ds1302的讀寫時(shí)序如圖3所示。為了提高對(duì)32個(gè)地址的尋址能力(地址/命令位15 = 邏輯1),可以把時(shí)鐘/日歷或ram寄存器規(guī)定為多字節(jié)(burst)方式。位6規(guī)定時(shí)鐘或ram

6、,而位0規(guī)定讀或?qū)憽T跁r(shí)鐘/日歷寄存器中的地址931或ram寄存器中的地址31不能存儲(chǔ)數(shù)據(jù)。在多字節(jié)方式中,讀或?qū)憦牡刂?的位0開始。必須按數(shù)據(jù)傳送的次序?qū)懽钕鹊?個(gè)寄存器。但是,當(dāng)以多字節(jié)方式寫ram時(shí),為了傳送數(shù)據(jù)不必寫所有31字節(jié),不管是否寫了全部31字節(jié),所寫的每一字都將傳送至ram。圖3 ds1302數(shù)據(jù)讀/寫時(shí)序ds1302共有12個(gè)寄存器,其中有7個(gè)寄存器與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)位為bcd碼形式。時(shí)鐘暫停:秒寄存器的位7定義位時(shí)鐘暫停位。當(dāng)它為1時(shí),ds1302停止振蕩,進(jìn)入低功耗的備份方式。通常在對(duì)ds1302進(jìn)行寫操作時(shí)(如進(jìn)入時(shí)鐘調(diào)整程序),停止振蕩。當(dāng)它為0時(shí),時(shí)鐘將

7、開始啟動(dòng)。am-pm/12-24小時(shí)方式:小時(shí)寄存器的位7定義為12或24小時(shí)方式選擇位。它為高電平時(shí),選擇12小時(shí)方式。在此方式下,位5是am/pm位,此位是高電平時(shí)表示pm,低電平表示am。在24小時(shí)方式下,位5為第二個(gè)10小時(shí)位(2023h)。 ds1302的晶振選用32.768khz,電容推薦值為6pf,因?yàn)檎袷庮l率較低,也可以不接電容,對(duì)記時(shí)精度影響不大。2stc89c52單片機(jī)(1) stc89c52 單片機(jī)概述stc89c52系列單片機(jī)是宏晶科技生產(chǎn)的單時(shí)鐘/機(jī)器周期(1t)的單片機(jī),是高速/低功耗/超強(qiáng)抗干擾的新一代8051單片機(jī),指令代碼完全兼容傳統(tǒng)8051,但速度快8-12

8、倍,內(nèi)部集成max810專用復(fù)位電路。 (2) stc89c52 單片機(jī)管腳及封裝stc89c52 單片機(jī)有多種封裝形式,本設(shè)計(jì)中選用40dip封裝,其管腳定義如圖4所示。其最小應(yīng)用系統(tǒng)如圖5所示。圖4 stc89c52 管腳圖 三、portel硬件開發(fā)軟件protel是目前國(guó)內(nèi)最流行的通用eda軟件,它是將電路原理圖設(shè)計(jì)、pcb板圖設(shè)計(jì)、電路仿真和pld設(shè)計(jì)等多個(gè)實(shí)用工具軟件組合后構(gòu)成的eda工作平臺(tái),是第一個(gè)將eda軟件設(shè)計(jì)成基于windows的普及型產(chǎn)品。2pcb板設(shè)計(jì)(1) 定元件的封裝 (2) 建立pcb板框 (3) 載入網(wǎng)絡(luò)表 (4) 布局 (5) pcb設(shè)計(jì)遵循的規(guī)則 地線回路規(guī)

9、則:圖7 地線回路規(guī)則 竄擾控制 屏蔽保護(hù)圖8 屏蔽保護(hù) 走線方向控制規(guī)則 電源與地線層的完整性規(guī)則四、硬件電路設(shè)計(jì)單片機(jī)數(shù)字鬧鐘硬件框圖如圖9所示。圖9 硬件框圖其中ds1302完成計(jì)時(shí)功能,單片機(jī)主控芯片讀取ds1302的時(shí)間數(shù)據(jù),在液晶屏上顯示出來。用戶可以通過按鍵設(shè)定時(shí)間初始值、鬧鈴初始值等。主電源和備份電源給各芯片供電。1 單片機(jī)電路 單片機(jī)采用stc89c52芯片,電路采用11.0592mhz外部無源晶體,振蕩電容采用20pf。復(fù)位電路采用10uf(c1)電容和10k(r2)組成的阻容復(fù)位電路。單片機(jī)管腳連接標(biāo)號(hào)中,p00p07為液晶屏數(shù)據(jù)線,p25p27為液晶屏控制線。標(biāo)號(hào)rxd

10、和txd是單片機(jī)的異步串行通信引腳,用于單片機(jī)程序的isp下載。2 ds1302時(shí)鐘電路ds1302時(shí)鐘電路如圖11所示,其中bt1是后備電池,以保證在主電源掉電時(shí)時(shí)鐘依然運(yùn)行。y2是時(shí)鐘晶振,因?yàn)轭l率較低,故可以不加電容。r10r12為上拉電阻。ds1302通過sclk、i/o和rst管腳和單片機(jī)相連。圖11 ds1302時(shí)鐘電路3 液晶屏顯示電路顯示部分采用smc 1602液晶屏進(jìn)行數(shù)據(jù)顯示與單片機(jī)接口電路如圖12所示。圖12 lcd與單片機(jī)接口電路4 按鍵電路u盤驅(qū)動(dòng)芯片ch375不僅提供了與usb設(shè)備的硬件連接,還內(nèi)置了文件系統(tǒng)底層程序,使得讀、寫u盤中的文件變得容易。圖中ch375使

11、用12mhz外部晶體,振蕩電容為20pf。管腳連接標(biāo)號(hào)d0d7是與單片機(jī)并口進(jìn)行數(shù)據(jù)傳輸?shù)臄?shù)據(jù)線,ch375int為單片機(jī)提供中斷信號(hào),ch375cs、ch375a0、ch375wr和ch375rd是控制信號(hào)線。ch375通過ru2和ru3兩個(gè)電阻與u盤的ud+和ud-數(shù)據(jù)線連接,同時(shí)通過lu發(fā)光管輸出u盤狀態(tài)。 3鍵盤驅(qū)動(dòng)電路鍵盤驅(qū)動(dòng)電路如圖14所示。圖14 鍵盤驅(qū)動(dòng)程序電路使用與單片機(jī)管腳直接相連的按鍵實(shí)現(xiàn)鍵盤。當(dāng)按鍵按下時(shí)管腳為低電平,無按鍵時(shí)為高電平。單片機(jī)采用查詢方式獲取按鍵信息。4鬧鈴電路圖15 鬧鈴電路 鬧鈴電路由單片機(jī)管腳驅(qū)動(dòng)蜂鳴器和報(bào)警燈實(shí)現(xiàn),當(dāng)鬧鈴時(shí)間到時(shí),蜂鳴器鳴響,紅燈

12、報(bào)警。5電源電路本設(shè)計(jì)采用usb接口供電,電源電壓5v。同時(shí),usb接口通過內(nèi)含pl2303芯片的轉(zhuǎn)換電路對(duì)單片機(jī)進(jìn)行程序編寫。其電路原理如圖所示。圖16 供電及程序下載電路五、 軟件設(shè)計(jì)1、軟件流程圖本設(shè)計(jì)軟件流程如圖17所示。 圖17 軟件流程圖 2、時(shí)間調(diào)整程序設(shè)計(jì)調(diào)整時(shí)間用4個(gè)調(diào)整按紐,1個(gè)作為移位、控制用,另外2個(gè)作為加個(gè)減用,分別定義為時(shí)間設(shè)置按紐、加按紐、減按紐。在調(diào)整時(shí)間過程中,要調(diào)整的位與別的位應(yīng)該有區(qū)別,所以增加了閃爍功能,即調(diào)整的位一直在閃爍,直到調(diào)整下一位。閃爍原理就是,讓要調(diào)整的一位每隔一定時(shí)間熄滅一次,比如說50ms。利用定時(shí)器記時(shí),當(dāng)?shù)竭_(dá)50ms溢出時(shí),就送給該位

13、熄滅符,在下一次溢出時(shí),再送正常顯示的值,不斷交替,直到調(diào)整該位結(jié)束。此時(shí)送正常顯示值給該位,再進(jìn)入下一位調(diào)整閃爍程序。時(shí)間調(diào)整程序流程圖如圖18所示??刂奇I有效,進(jìn)入月調(diào)整程序控制鍵有效,進(jìn)入年調(diào)整程序等待按鍵程序等待按鍵程序減鍵有效加鍵有效加鍵有效減鍵有效月減1年加1月加1年減1控制鍵有效,進(jìn)入星期調(diào)整程序控制鍵有效,進(jìn)入日調(diào)整程序等待按鍵程序等待按鍵程序減鍵有效加鍵有效加鍵有效減鍵有效星期減1日加1星期加1日減1控制鍵有效,進(jìn)入分調(diào)整程序控制鍵有效,進(jìn)入小時(shí)調(diào)整程序等待按鍵程序等待按鍵程序減鍵有效加鍵有效加鍵有效減鍵有效分減1小時(shí)加1分加1小時(shí)減1控制鍵有效,跳出時(shí)間調(diào)整程序,進(jìn)入主循環(huán)

14、程序圖18 時(shí)間設(shè)定程序流程圖 鬧鈴時(shí)間設(shè)定方法類似,不再贅述。3、主程序 下面介紹main.c主程序編寫,其他程序略。(1) 頭文件和一些宏定義#include #include #include 1602.h#include ds1302.h#define amhouraddr 0xc0 /存鬧鈴時(shí)的地址#define amminuteaddr 0xc2 /存鬧鈴分的地址#define amenaddr 0xc4 /存鬧鐘使能標(biāo)志的地址(2) 管腳、常量、變量定義/定義管腳sbit led_alarm=p21;/報(bào)警燈sbit beep_alarm=p20; /蜂鳴器sbit key_tm

15、set = p32; /時(shí)間設(shè)置sbit key_amset = p33;/鬧鈴設(shè)置sbit key_up = p34;/上調(diào)sbit key_down = p35;/下調(diào)sbit key_amen = p36;/鬧鈴開關(guān)sbit key_review = p37;/查看/定義標(biāo)識(shí)volatile bit flagkeypress = 0; /有鍵按下標(biāo)志volatile bit flagshow = 0; /顯示標(biāo)志volatile bit flagtmset = 0; /時(shí)間設(shè)置狀態(tài)標(biāo)志volatile bit flagamset = 0; /鬧鈴設(shè)置狀態(tài)標(biāo)志volatile bit fl

16、agamen = 0; /鬧鈴使能標(biāo)志,0為鬧鈴不使能,1為鬧鈴使能volatile bit flagalarm = 0; /鬧鈴狀態(tài)標(biāo)志/按鍵響應(yīng)用變量uchar keyvalue,keytmset,keyamset,keyup,keydown,keyset,keyamen,keyreview;/ds1302時(shí)鐘用變量systemtime currenttime;uchar year, month, day, hour, minute, second;uchar amhour, amminute,amstart;/報(bào)警及存儲(chǔ)用變量/char * psave;/字符串顯示用變量uchar st

17、r16 = 000000;uchar date9=00-00-00, time9=00:00:00;uchar hide, setnum;uint counter; (3) 函數(shù)聲明/函數(shù)聲明void int2str(int x, char* str);void delay1ms(unsigned int count);void data_init();void timer0_init();void timer0_isr () ;void keyprocess(uint num);(4) 各子程序/整型轉(zhuǎn)字符串的函數(shù),轉(zhuǎn)換范圍0-65536void int2str(int x, char* s

18、tr) int i=1; int tmp=10; while(x/tmp!=0) i+; tmp*=10; tmp=x; stri=0; while(i1) str-i=0+(tmp%10); tmp/=10; str0=tmp+0; void delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+)for(j=0;j= 450) flagshow = 1; counter = 0; /設(shè)定閃爍標(biāo)志 if (hide = 1) hide = 0; else hide = 1; void keyprocess(uint num

19、) switch (num) case 1: /tmset鍵被按下。setnum=0-管設(shè)置;1-年;2-月;3-日;4-時(shí);5-分;6-秒,按一下setnum加1。 if (flagamset=1) /從鬧鈴時(shí)間設(shè)置進(jìn)入當(dāng)前時(shí)間設(shè)置 flagamset = 0;flagtmset = 1;setnum = 1; else if (flagtmset=0)/從正常狀態(tài)進(jìn)入當(dāng)前時(shí)間設(shè)置 flagtmset = 1;setnum = 1; else /已經(jīng)在時(shí)間設(shè)置狀態(tài) setnum +; if (setnum = 7) /已經(jīng)設(shè)定完畢,則存盤退出 setnum = 0;flagtmset = 0

20、; break; case 2: /amset鍵被按下。setnum=0-關(guān)設(shè)置;1-時(shí);2-分,按一下setnum加1。 if (flagtmset=1) /從當(dāng)前時(shí)間設(shè)置進(jìn)入鬧鈴時(shí)間設(shè)置 flagtmset = 0;flagamset = 1;setnum = 1; /清屏l1602_string(1,1, );l1602_string(2,1, );/讀出當(dāng)前鬧鈴時(shí)間并顯示 int2str(amhour,str1); l1602_string(2,1,str1);int2str(amminute,str1); l1602_string(2,4,str1); else if (flagam

21、set=0)/從正常狀態(tài)進(jìn)入鬧鈴時(shí)間設(shè)置 flagamset = 1;setnum = 1; /清屏l1602_string(1,1, );l1602_string(2,1, );/讀出當(dāng)前鬧鈴時(shí)間并顯示 int2str(amhour,str1); l1602_string(2,1,str1);int2str(amminute,str1); l1602_string(2,4,str1); else /已經(jīng)在鬧鈴時(shí)間設(shè)置狀態(tài) setnum +; if (setnum = 3) /已經(jīng)設(shè)定完畢,則存盤退出并返回正常顯示界面 /存入鬧鈴時(shí)間 write1302(0x8e,0x00); /寫入允許 w

22、rite1302(amhouraddr,amhour);delay1ms(500); write1302(amminuteaddr,amminute);delay1ms(500); write1302(0x8e,0x80); /寫入禁止amhour=read1302(amhouraddr);amminute=read1302(amminuteaddr); setnum = 0;flagamset = 0; break; case 3: /up鍵被按下 if (flagtmset = 1) /如果在當(dāng)前時(shí)間設(shè)置狀態(tài) switch (setnum) case 0: case 1: /年 if (y

23、ear99)year+; write1302(0x8e,0x00); /寫入允許 ds1302_settime(ds1302_year,year); write1302(0x8e,0x80); /禁止寫入 break; case 2: /月 if (month12) month+; write1302(0x8e,0x00); /寫入允許 ds1302_settime(ds1302_month,month); write1302(0x8e,0x80); /禁止寫入 break; case 3: /日 if (day31) day+; write1302(0x8e,0x00); /寫入允許 ds1

24、302_settime(ds1302_day,day); write1302(0x8e,0x80); /禁止寫入 break; case 4: /時(shí) if (hour23) hour+; write1302(0x8e,0x00); /寫入允許 ds1302_settime(ds1302_hour,hour); write1302(0x8e,0x80); /禁止寫入 break; case 5: /分 if (minute59) minute+; write1302(0x8e,0x00); /寫入允許 ds1302_settime(ds1302_minute,minute); write1302

25、(0x8e,0x80); /禁止寫入 break; case 6: /秒 if (second59) second+; write1302(0x8e,0x00); /寫入允許 ds1302_settime(ds1302_second,second); write1302(0x8e,0x80); /禁止寫入 break; if (flagamset=1) /如果在鬧鈴設(shè)置狀態(tài) switch (setnum) case 1: /時(shí) if (amhour23) amhour+; break; case 2: /時(shí) if (amminute0)year-; write1302(0x8e,0x00);

26、/寫入允許 ds1302_settime(ds1302_year,year); write1302(0x8e,0x80); /禁止寫入 break; case 2: /月 if (month0) month-; write1302(0x8e,0x00); /寫入允許 ds1302_settime(ds1302_month,month); write1302(0x8e,0x80); /禁止寫入 break; case 3: /日 if (day0) day-; write1302(0x8e,0x00); /寫入允許 ds1302_settime(ds1302_day,day); write130

27、2(0x8e,0x80); /禁止寫入 break; case 4: /時(shí) if (hour0) hour-; write1302(0x8e,0x00); /寫入允許 ds1302_settime(ds1302_hour,hour); write1302(0x8e,0x80); /禁止寫入 break; case 5: /分 if (minute0) minute-; write1302(0x8e,0x00); /寫入允許 ds1302_settime(ds1302_minute,minute); write1302(0x8e,0x80); /禁止寫入 break; case 6: /秒 if

28、 (second0) second-; write1302(0x8e,0x00); /寫入允許 ds1302_settime(ds1302_second,second); write1302(0x8e,0x80); /禁止寫入 break; if (flagamset=1) /如果在鬧鈴設(shè)置狀態(tài) switch (setnum) case 1: /時(shí) if (amhour0) amhour-; break; case 2: /時(shí) if (amminute0) amminute-; break; break; break; case 5: /鬧鈴使能鍵被按下 if (flagamen = 0) /

29、存入鬧鈴時(shí)間 write1302(0x8e,0x00); /寫入允許 write1302(amenaddr,1); delay1ms(500); write1302(0x8e,0x80); /寫入禁止 flagamen = 1; l1602_string(2,11,open ); else /存入鬧鈴時(shí)間 write1302(0x8e,0x00); /寫入允許 write1302(amenaddr,0); delay1ms(500); write1302(0x8e,0x80); /寫入禁止 flagamen = 0; l1602_string(2,11,close); break; case

30、6: /鬧鈴review鍵按下,實(shí)際功能就是在鬧鈴響的時(shí)候關(guān)鈴聲 led_alarm = 1; beep_alarm = 1; flagalarm = 0; break; /* 名稱 : main()* 功能 : 主函數(shù)*/void main() uint i, j,temp; ea = 0;timer0_init(); /定時(shí)器0初始化 data_init();initial_ds1302();ea = 1;/載入鬧鐘使能信號(hào) temp = read1302(amenaddr);if (temp = 1) flagamen = 1;else if (temp = 0) flagamen =

31、0;else /存入鬧鈴時(shí)間 write1302(0x8e,0x00); /寫入允許 write1302(amenaddr,0); delay1ms(500); write1302(0x8e,0x80); /寫入禁止 flagamen = 0;/載入鬧鈴時(shí)間amhour = read1302(amhouraddr);if (amhour23)|(amhour59)|(amminute0) amminute = 0; /存入鬧鈴時(shí)間 write1302(0x8e,0x00); /寫入允許 write1302(amminuteaddr,amminute); delay1ms(500); write

32、1302(0x8e,0x80); /寫入禁止 amminute=read1302(amminuteaddr); /顯示初始化l1602_init();l1602_string(1,1, welcome to my );l1602_string(2,1, digital timer! );/延時(shí)for (i=0;i1000;i+) for (j=0;j1000;j+) ; /初始化屏幕l1602_string(1,1, alarm );if (flagamen = 1) l1602_string(2,1, open );else l1602_string(2,1, close ); while(

33、1) if (flagalarm = 1) led_alarm = 0; beep_alarm = 0; else led_alarm = 1; beep_alarm = 1; /時(shí)間顯示 if (flagshow = 1) /讀出日期時(shí)間值 ds1302_gettime(¤ttime); year = currenttime.year; month = currenttime.month; day = currenttime.day; hour = currenttime.hour; minute = currenttime.minute; second = currenttim

34、e.second; datetostr(¤ttime); timetostr(¤ttime); /flagalarm=0為鬧鈴關(guān)閉狀態(tài),flagalarm=1為鬧鈴打開狀態(tài), if (flagamen = 1)&(hour = amhour)&(minute = amminute)&(amstart = 0) flagalarm = 1; amstart = 1; else if (flagamen != 1)|(hour != amhour)|(minute != amminute) flagalarm = 0; amstart = 0; /如果不在鬧鈴設(shè)置狀態(tài)則顯示

35、當(dāng)前日期時(shí)間 if (flagamset = 0) l1602_string(1,1,currenttime.datestring); l1602_string(2,1,currenttime.timestring); else /如果在鬧鈴狀態(tài)則顯示鬧鈴時(shí)和分 int2str(amhour,str1); l1602_string(2,1,str1); l1602_string(2,3,:); int2str(amminute,str1); l1602_string(2,4,str1); /產(chǎn)生時(shí)間設(shè)定時(shí)的閃爍效果,只在閃爍標(biāo)志置位時(shí)運(yùn)行 /setnum=0-未設(shè)定;1-年;2-月;3-日;4

36、-時(shí);5-分;6-秒 if (flagtmset=1)&(hide=1) switch (setnum) case 0: break; case 1: /年 l1602_string(1,1, ); break; case 2: /月 l1602_string(1,4, ); break; case 3: /日 l1602_string(1,7, ); break; case 4: /時(shí) l1602_string(2,1, ); break; case 5: /分 l1602_string(2,4, ); break; case 6: /秒 l1602_string(2,7, ); break

37、; default: break; else if (flagamset=1)&(hide=1) switch (setnum) case 0: break;case 1: /時(shí) l1602_string(2,1, ); break; case 2: /分 l1602_string(2,4, ); break;default: break; flagshow = 0; /以下為鍵盤查詢,當(dāng)有按鍵從按下到彈起時(shí),該按鍵被響應(yīng)。 if (key_tmset)&(keytmset=0) flagkeypress = 1;keyvalue = 1; else if (key_amset)&(keyamset=0) flagkeypress = 1; keyvalue = 2; else if (key_up)&(keyup=0) flagkeypress = 1; keyvalue = 3; else if (key_down)&(keydown=0) flagkeypress = 1; keyvalue = 4; else if (key_amen)&(keyamen=0) flagkeypress = 1; keyvalue = 5

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論