基于51單片機(jī)鬧鐘設(shè)計(jì)

上傳人:無*** 文檔編號(hào):99731877 上傳時(shí)間:2022-06-01 格式:DOC 頁數(shù):28 大?。?02.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
基于51單片機(jī)鬧鐘設(shè)計(jì)_第1頁
第1頁 / 共28頁
基于51單片機(jī)鬧鐘設(shè)計(jì)_第2頁
第2頁 / 共28頁
基于51單片機(jī)鬧鐘設(shè)計(jì)_第3頁
第3頁 / 共28頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《基于51單片機(jī)鬧鐘設(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《基于51單片機(jī)鬧鐘設(shè)計(jì)(28頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、- 電子課程設(shè)計(jì)實(shí)習(xí)報(bào)告 元件購置及焊接 元件購置: 地點(diǎn):廣埠屯,華中電子市場(chǎng)二樓 時(shí)間:2021年4月7日 過程:大早到華中電子市場(chǎng)后,當(dāng)時(shí)還沒開門,等到九點(diǎn)才開門,據(jù)人介紹上了二樓,賣各種電子元件的店面很多,但都不大。選了一家比擬小的店面,把教師給的清單給店主看后,店主很熱情,但是說有兩樣元件沒有,但承諾叫我們等等,到倉庫去找一下。我們委婉拒絕了,想先看看,第一次來畢竟的貨比三家嘛。又挨個(gè)找了幾家店,比照價(jià)格和元件齊全程度后,我們選了一家比擬大元件齊全而且價(jià)格合理的店面。 由于主要的元件,包括板子和各種芯片教師都發(fā)了,我們主要買一些小型元件

2、。主要是電阻電容,由于元件小,不是單個(gè)賣的,都是十個(gè)十個(gè)的賣。至于電阻電容的區(qū)分,以前參加電子協(xié)會(huì)也接觸過,關(guān)鍵是一些不熟悉的元件,如串口下載線之類的,我們雖然在課堂聽教師講過區(qū)分公母,但對(duì)于是否買對(duì)了,還是有疑問,得到店主承諾買錯(cuò)了,可以包換后,才放心結(jié)賬。對(duì)著清單上一一看好后,除了電阻點(diǎn)容多買了幾個(gè)外,其他的東西都還齊全。最后叫店主結(jié)賬,并依照教師要求開發(fā)票。 原清單:〔局部元件由于分批購置或者網(wǎng)上購置,未能列入清單〕 焊接心得: 焊接時(shí)間:2021年4月9日〔星期六上午〕 地點(diǎn):信息樓405 焊接元件電路圖: 過程及心得: 有了大二焊接收音機(jī)的一些焊接功底后,對(duì)于焊

3、接還是有些經(jīng)歷的,先將小的元件焊接好,比方說電容電感,防止大的高的元件焊好后留下的可操作空間太少,給小的元件焊接帶來不便。而不耐高溫的元件,如三極管等,可以留在最后焊接,以免引腳觸到烙鐵損壞元件。當(dāng)然有些元件的引腳雖然是對(duì)稱分布,但是是是有區(qū)別的,如電解電容,二極管,三極管等。特別應(yīng)該注意的是排阻,普通電阻部沒有負(fù)極,但是排阻比擬特別,兩端是不同的。由于排阻焊反了,導(dǎo)致與P0口相連的矩陣鍵盤無論如何都沒常使用,后來發(fā)現(xiàn)后,拔了好久才拔下來,手還在此過程中,還跟烙鐵來了個(gè)親密接觸,手指被燙的留下了一道白印記。拔下來時(shí)候,板子已經(jīng)傷痕累累了,幸好買了新的排阻焊上去之后,鍵盤能夠正常工作了,真可謂教

4、訓(xùn)沉痛。 焊接過程中,由于烙鐵使用的還是比擬少,開場(chǎng)時(shí)手拿著總覺得很別扭,點(diǎn)錫絲的時(shí)候甚至有點(diǎn)抖,不過焊完一兩個(gè)元件后就適應(yīng)了很多,后來越來越上手,速度也快了很多。 我們特地幾個(gè)人約好一起焊接,并比照,有疑問先討論,再動(dòng)手焊接。但是還是有些問題沒得到解決,由于沒接觸過1602,對(duì)于排針和排插的位置還是焊反了,但是問題不大,后來的實(shí)習(xí)過程中證明液晶一直工作正常,不過以后還是得按常規(guī)出牌,以免遇到大麻煩。其間也遇到了復(fù)位開關(guān)的擺放問題,我一直覺得是只要能插進(jìn)去就正確的,但有人覺得有正反問題,后來證明我的想法是正確。 焊完后,分模塊對(duì)整個(gè)硬件電路進(jìn)展調(diào)試檢測(cè),看有沒有

5、漏焊,虛焊的地方。之后,插上芯片試電,一切正常后,用安裝好的編譯和STC串口下載軟件給單片機(jī)下載程序,紅色的二極管一閃一閃的,等二極管不閃后,第一個(gè)數(shù)碼管被點(diǎn)亮了,當(dāng)時(shí)很興奮。至此焊接告一段落。 在此過程中,我總結(jié)出 1、 焊接前需熟悉電路,了解各元件,因?yàn)檎嬲暮附舆^程實(shí)際上是很短的,而準(zhǔn)備工作沒做好,只會(huì)給后面的焊接帶來意想不到的麻煩,甚至導(dǎo)致板子被毀。 2、 焊接過程中,要注意力集中,逐漸積累經(jīng)歷,怎樣操作適應(yīng),怎樣防止虛焊和短路,以提高效率??偟膩碚f是一個(gè)熟練掌握焊槍和熟悉錫絲特性的過程。 3、 焊接后先不要急于上電,也不要想板子一定焊好了,或者不正常之后惶恐是不是焊廢了。畢竟

6、這也是一個(gè)小的系統(tǒng),我們第一次接觸,第一次上電就能一切運(yùn)行成功不現(xiàn)實(shí),出現(xiàn)情況不要急,可能只是一些小問題,如沒插上芯片或跳線帽之類的。 4、 總之作為學(xué)電子電氣的,我們畢竟還會(huì)接觸硬件的焊接和調(diào)試,這只是一個(gè)開端,相信有了這次的經(jīng)歷后,以后的會(huì)對(duì)這一過程了解的更深入。 基于數(shù)碼管及矩陣鍵盤實(shí)現(xiàn)的移位等假設(shè)干功能 一、材料及硬件分析 數(shù)碼管的接法: 由于數(shù)碼管的借口很多,如果一個(gè)個(gè)接在單片機(jī)IO口上,將會(huì)很占用硬件資源,同時(shí)編程時(shí)候要兼顧段選和位選,會(huì)給編程帶來很大不便。使用74LS138和CD4511譯碼器后,兩個(gè)問題迎刃而解,如下為數(shù)碼管的接法原理圖: 由圖可知,138控制位選占

7、用3個(gè)IO口,CD4511控制段選占用4個(gè)IO口,加上控制小數(shù)點(diǎn)的引腳總共占用8個(gè)IO口。給P1口賦值的時(shí)候,高3位控制的是位選,即第幾個(gè)數(shù)碼管亮,低4位控制的為段選,直接顯示0-9,無需代碼。而第4位則控制的是小數(shù)點(diǎn)的亮暗。動(dòng)態(tài)顯示的時(shí)候,只需要在*一位IO口后面的小數(shù)點(diǎn)點(diǎn)亮即可。 矩陣鍵盤線反法:矩陣鍵盤部是4*4的8根線組成的16鍵的鍵盤,每個(gè)限于線穿插點(diǎn),表示為一個(gè)鍵??偣残枰?個(gè)IO口,當(dāng)兩個(gè)線沒有穿插的時(shí)候,接通的兩條線都變味低電平。首先可將高八位置為高電平第八位置為低電平,記下變?yōu)榈碗娖降囊粭l線路。然后將上下電平交換,再記下一條線路,即可確定按下的鍵的位置。具體程序如下: v

8、oid press() { unsigned char keybuf1,keybuf2; P0=0*f0;keybuf1=P0; if(P0!=0*f0) { if(P0!=0*f0) //按鍵 { P0=0*0f;keybuf2=P0;KeyV=keybuf1+keybuf2;} } 經(jīng)過屢次試驗(yàn)后得出的各鍵的代碼為: 0*ee 0*de 0*be 0*7e 0*ed 0*dd 0*bd 0*7d 0

9、*eb 0*db 0*bb 0*7b 0*e7 0*d7 0*b7 0*77,當(dāng)然將鍵盤反接之后鍵就值完全變了。 軟件消抖:當(dāng)有鍵按下的時(shí)候,瞬間單片機(jī)的電平會(huì)不穩(wěn)定,即出現(xiàn)電平抖動(dòng),為了消除抖動(dòng),可采用軟件法: unsigned char up() { unsigned char P0Buf; P0=0*f0; //松鍵 P0Buf=P0; return(P0Buf-0*f0); } 在有鍵按下之后執(zhí)行while(up(

10、));即停在該處,只給Keyv賦值一次。 二、程序功能 1、密碼鎖:其他所有功能都在此程序運(yùn)行成功的根底才能執(zhí)行。上電之后,輸入密碼,并按c鍵驗(yàn)證正確之后會(huì)顯示全8,否則顯示全0。驗(yàn)證成功后按下A可以自行下面程序 2、自動(dòng)拉幕式移屏:1鍵左移,2鍵右移,其他鍵停頓,全屏顯示為12345678。 3、定時(shí)器時(shí)鐘:BCD分別可調(diào)時(shí)分秒,A鍵實(shí)現(xiàn)下一功能 4、秒表:1、2、3分別可以實(shí)現(xiàn)暫停,繼續(xù),清零功能,可準(zhǔn)確到百分之一秒 5、手動(dòng)式移位并刪除:輸入數(shù)字的將第一個(gè)數(shù)字刪除,并將所有數(shù)字前移一位。C鍵可實(shí)現(xiàn)刪除,將最后一位數(shù)字刪除,并在第一位補(bǔ)零。 6、加法器:輸入兩個(gè)數(shù)字可實(shí)現(xiàn)相加

11、,并可清屏和連加,但不能實(shí)現(xiàn)小數(shù)相加。 二、源程序 *include"reg52.h" unsigned char Pin[8]={8,5,8,5,8,5,8,5}; unsigned char Lock[8]={11,11,11,11,11,11,11,11}; unsigned char L1[8]={0,0,0,0,0,0,0,0}; unsigned char L[8]={0,0,0,0,0,0,0,0}; unsigned char Led1[8]={0,0,0,0,0,0,0,0}; unsigned char Led[16]={11,11,11,11,11,11,

12、11,11,0,1,2,3,4,5,6,7}; unsigned char KeyV=0; unsigned char Total=0; unsigned char disp[]={0*00,0*01,0*02,0*03,0*04,0*05,0*06,0*07,0*08,0*09}; unsigned char second1=0; unsigned char second2=0; unsigned char minute1=0; unsigned char minute2=0; unsigned char hour1=0; unsigned char day=0; uns

13、igned char month=0; unsigned char Con=60; unsigned char code Key[]={0*d7,0*ee,0*de,0*be,0*ed,0*dd,0*bd,0*eb,0*db,0*bb,0*7e}; unsigned char T=0; unsigned char V=0; void delay(int n) { while(n--); } void dly() { unsigned int q; q=2000; while(q--); } /*chan

14、ge() { if(Con==60)Con=1; if(Con==1)Con=60; } */ unsigned char up() { unsigned char P0Buf; P0=0*f0; //松鍵 P0Buf=P0; return(P0Buf-0*f0); } void press() { unsigned char keybuf1,keybuf2;

15、 P0=0*f0;keybuf1=P0; if(P0!=0*f0) { if(P0!=0*f0) //按鍵 { P0=0*0f;keybuf2=P0;KeyV=keybuf1+keybuf2;} while(up()); } } display() { unsigned char i,P1Buf; for(i=0;i<=7;i++) {

16、 P1Buf=i*2; P1Buf=P1Buf<<4; P1Buf=P1Buf+Led[i]; //顯示 P1=P1Buf; //delay(); } } void lscan() { unsigned char i; for(i=0;i<=10;i++)

17、 { if(KeyV==Key[i]) { KeyV=i; //換數(shù)值 break; } } for(i=

18、7;i>0;i--) { Lock[i]=Lock[i-1]; } Lock[0]=KeyV; } ldisplay() { unsigned char i,P1Buf; for(i=0;i<=7;i++) { P1Buf=i*2; P1Buf=P1Buf<<4;

19、 P1Buf=P1Buf+Lock[i]; //顯示 P1=P1Buf; //delay(); } } display1() { unsigned char i,P1Buf; for(i=0;i<=7;i++) { P1Buf=i*2; P1Buf=P1Buf<<4; P1Buf=P1Buf+L[i];

20、 //顯示 P1=P1Buf; //delay(); } } void scan1() { unsigned char keybuf1,keybuf2; P0=0*f0;keybuf1=P0; if(P0!=0*f0) { P0=0*0f; keybuf2=P0; KeyV=keybuf1+keybuf2; i

21、f(KeyV==0*ee) {minute1++;if(minute1==10)minute1=0;} //調(diào)時(shí)間 if(KeyV==0*de) {minute2++;if(minute2==6)minute2=0;} if(KeyV==0*be) {hour1++;if(hour1==13)hour1=1;} delay(15000); } } void Timer0() interrupt 1 { TH0=(65536-16666)/256;

22、 TL0=(65536-16666)%256; T++; if(T==Con) { T=0; second1++; if(second1>=10) { second1=0; second2++; if(second2>=6)

23、 { //中斷0 minute1++; second2=0; if(minute1>=10) { minute1=0;

24、 minute2++; if(minute2>=6) { hour1++; minute2=0; if(hour1>=13) { hour1=1; }

25、 } } } } } } rotatel() { unsigned char t,i; { t=Led[15]; { for(i=15;i>0;i--)

26、 { Led[i]=Led[i-1];} // 左移 Led[0]=t; } } } rotater() { unsigned char t,i; { t=Led[0]; { for(i=1;i<=15;i++) //右移

27、 { Led[i-1]=Led[i];} Led[15]=t; } } } back() { unsigned char i; for(i=1;i<=7;i++) //右移 { L[i-1]=L[i]; } L[7]=0; }

28、void Timer1() interrupt 3 { TH1=(65536-40000)/256; TL1=(65536-40000)%256; T++; if(T==200) switch(KeyV) { case 0*ee: rotatel(); break; case 0*de: rotater(); break; default: break; } } void sca

29、n() { unsigned char i; for(i=0;i<=10;i++) { if(KeyV==Key[i]) { KeyV=i; //換數(shù)值

30、 break; } } for(i=7;i>0;i--) { L[i]=L[i-1]; } L[0]=KeyV; } void adscan() {

31、 unsigned char i; for(i=0;i<=10;i++) { if(KeyV==Key[i]) { KeyV=i; //換數(shù)值 break;

32、 } } for(i=7;i>0;i--) { Led1[i]=Led1[i-1]; } Led1[0]=KeyV; } void clr() { if(KeyV==0*be) { second1=0; seco

33、nd2=0; //清零 3 minute1=0; minute2=0; hour1=0;EA=0; Con=1; } } add0() { unsigned char i; for(i=0;i<=7;i++) L1[i]=Led1[i]; for(i=0;i

34、<=7;i++) Led1[i]=0; } eql() { unsigned char t,i,b; t=0; b=0; for(i=0;i<=7;i++) { /* Led1[i]=(Led1[i]+L1[i]+t)%10; if(Led1[i]>9) t=1;*/ t=Led1[i]+L1[i]+b; if(t<=9) {Led1[i]=t;b=0; }

35、 if(t>9) {Led1[i]=t-10;b=1;} } } adcl() { unsigned char i; if(KeyV==0*77) for(i=0;i<=7;i++) { Led1[i]=0; L1[i]=0; } } void sec2() { if(KeyV==0*de) {EA=0;}

36、 //暫停 2 } void sec1() { if(KeyV==0*ed) //切換 4 {EA=1;Con=60;} } void sec() { if(KeyV==0*ee) //開場(chǎng) 1 {EA=1;} } addisp() { unsigned char i,P1Buf; for

37、(i=0;i<=7;i++) { P1Buf=i*2; P1Buf=P1Buf<<4; P1Buf=P1Buf+Led1[i]; P1=P1Buf; } } add() { while(1) { KeyV=0; press(); adcl(); if(KeyV==0*7e) {screen();} if(Key

38、V==0*e7) {add0();} if(KeyV==0*b7) {eql();} if(KeyV!=0*b7&&KeyV!=0*e7&&KeyV!=0&&KeyV!=0*77&&KeyV!=0*7e) adscan(); addisp(); } } rotate() { KeyV=0; while(1) { KeyV=11; press(); if(Ke

39、yV==0*7e) {add();} if(KeyV==0*77) back(); if(KeyV!=0*7e&&KeyV!=11&&KeyV!=0*77) scan(); display1(); //移位 } } second() { KeyV=0; secon

40、d1=0; second2=0; minute1=0; minute2=0; hour1=0; TMOD=0*01; TH0=(65536-16666)/256; TL0=(65536-16666)%256; TR0=1; ET0=1; //秒表 EA=1; Con=1; whil

41、e(1) { P1=0*50+disp[minute1]; P1=0*60+disp[minute2]; P1=0*00+disp[second1]; P1=0*20+disp[second2]; P1=0*90+disp[(hour1%10)]; P1=0*a0+disp[(hour1/10)]; press(); sec(); sec1();

42、 sec2(); clr(); if(KeyV==0*7e) {rotate();} } } clock() { KeyV=0; TMOD=0*01; TH0=(65536-16666)/256; TL0=(65536-16666)%256; TR0=1; TR1=0; ET0=1;

43、 //時(shí)鐘 EA=1; Con=63; while(1) { P1=0*50+disp[minute1]; P1=0*60+disp[minute2]; P1=0*00+disp[second1]; P1=0*20+disp[second2]; P1=0*90+disp[(hour1%10)]; P1=0*a0+disp[(hour1/10)]; scan1();

44、 press(); if(KeyV==0*7e) {second();} } } screen() { KeyV=0; TMOD=0*01; TH1=(65536-40000)/256; TL1=(65536-40000)%256; TR1=1; TR0=0; ET1=1;

45、 //時(shí)鐘 EA=1; //dly(); while(1) { press(); display(); if(KeyV==0*7e) {clock();} } } Klock() { unsigned char i,t; V=0; while(1) { KeyV=11;

46、 V=0; press(); ldisplay(); if(KeyV!=11&&KeyV!=0*7b&&KeyV!=0*7e) lscan(); if(KeyV==0*7b) { for(i=0;i<=7;i++) {if(Pin[i]==Lock[i]) V++;} if(V!=8){

47、for(i=0;i<=7;i++) Lock[i]=0;} if(V==8){for(i=0;i<=7;i++) Lock[i]=8;t=V;}//等于8證明八個(gè)數(shù)都相等開鎖 } if(t==8&&KeyV==0*7e)break; } } void main() { dly(); while(1) { Klock(); screen(); } } 暑期實(shí)

48、習(xí) 課題一:基于51單片機(jī)的鬧鐘設(shè)計(jì) 一、 材料 材料:STC89C52單片機(jī)開發(fā)板一塊,1602液晶一片,12c887時(shí)鐘芯片,ps2鍵盤,下載線,個(gè)人計(jì)算機(jī) 編譯軟件:wave及keil 下載程序軟件:STC專用下載串口軟件 二、 芯片及硬件資料 一、芯片DS12c887 1、DS12C887 能夠自動(dòng)產(chǎn)生世紀(jì)、 年、月、日、時(shí)、分、秒 等時(shí)間信息,其 部又增加了世紀(jì)存放器,從而利用硬件電路 解決子 "千年〞問題;DS12C887 中自帶有鋰電 池,外部掉電時(shí),其部時(shí)間 信息還能夠保 持 10 年之久;對(duì)于一天的時(shí)間記錄,有 12 小時(shí)制和 24 小時(shí)制兩種模式。在 12

49、小時(shí) 制模式中,用 AM 和 PM 區(qū)分上午和下午; 2. 、引腳功能:DS12C887 的引腳排列如圖 1 所示,各管腳的功能說明如下: GND、VCC:直流電源,其中 VCC 接+5V 輸入,GND 接地,當(dāng) VCC 輸入為+5V 時(shí),用 戶可以 DS12C887 RAM 中的數(shù)據(jù),并可對(duì)其進(jìn)展讀、寫操作;當(dāng) VCC 的輸入小于 +4.25V 時(shí),制止用戶對(duì)部 RAM 進(jìn)展讀、寫操作,此時(shí)用戶不能正確獲取芯片的時(shí)間信 息;當(dāng) VCC 的輸入小于+3V 時(shí),DS12C887 會(huì)自動(dòng)將電源發(fā)換到部自帶的鋰電池上,以保證 部的電路能夠正常工作。

50、 圖1 3. 圖 2是用 8031 單片機(jī)和 DS12C887 構(gòu)成的時(shí)間獲取電路圖 即對(duì)應(yīng)的管腳為如下: --------------------------------------------------- |DS12887-----51 |DS12887-----51 |DS12887------51 | --------------------------------------------------| |AD0-------P0.0 |AD4-------P0.4 |AS-----------AL

51、E | |AD1-------P0.1 |AD5-------P0.5 |DS-----------P3.7| |AD2-------P0.2 |AD6-------P1.6 |RW-----------P3.6| |AD3-------P0.3 |AD7-------P0.7 |IRQ----------P3.5| --------------------------------------------------- 圖 2 4. 下列圖為DS12C887地址分布圖,則結(jié)合上圖及其管腳知其基地址為

52、: 0*0fe0 圖3 5. 、相應(yīng)的程序采用 C51 語言編寫,由于Mot接地則以 Intel 工作模式。 即可以將各個(gè)引腳宏定義如下,并放入頭文件中: *define DS12887_Sec *BYTE[0*0fe00] //秒 *define DS12887_Min *BYTE[0*0fe02] //分 *define DS12887_Hour *BYTE[0*0fe04] //時(shí) *define DS12887_Week *BYTE[0*0fe06] //星期 *define DS12887_Da

53、y *BYTE[0*0fe07] //日 *define DS12887_Mon *BYTE[0*0fe08] //月 *define DS12887_Year *BYTE[0*0fe09] //年 *define DS12887_A *BYTE[0*0fe0a] //存放器A *define DS12887_B *BYTE[0*0fe0b] //存放器B *define DS12887_C *BYTE[0*0fe0c] //存放器C *define DS12887_D *BYTE[0*0fe0d]

54、 //存放器D *define DS12887_AlarmSec *BYTE[0*0fe01] //秒鬧鐘 *define DS12887_AlarmMin *BYTE[0*0fe03] //分鐘鬧鐘 *define DS12887_AlarmHour *BYTE[0*0fe05] //小時(shí)鬧 三、 思路分析 1、 時(shí)間及日期顯示:要有鬧鐘功能,及先應(yīng)該有時(shí)鐘顯示,可先將*一時(shí)間初值賦值給各個(gè)AD管腳,然后又以掃描方式將時(shí)間調(diào)出來,并用Lcd顯示,并在第二次下載程序之前,將原有時(shí)間屏蔽,即可實(shí)現(xiàn)。 2、 時(shí)間及日期修改:如果時(shí)間不準(zhǔn),可以通過軟件重設(shè)時(shí)間,但是現(xiàn)實(shí)

55、時(shí)鐘不允許軟件改時(shí)間,為了與現(xiàn)實(shí)鬧鐘功能一致,必須實(shí)現(xiàn)用硬件修改時(shí)間,及必先有輸入設(shè)備。用ps2鍵盤,結(jié)合頭文件可編程實(shí)現(xiàn)該功能。 3、 鬧鐘設(shè)置:用一個(gè)數(shù)組記錄三個(gè)數(shù)據(jù),分別定義為鬧鐘時(shí)分秒,并通過掃描與當(dāng)前時(shí)間比照,如果一一對(duì)應(yīng),則開場(chǎng)鬧鐘。鬧鐘過程可將開發(fā)板上的Led點(diǎn)亮,然后按*件實(shí)現(xiàn)關(guān)閉??闪硇性黾幼约旱南敕üδ埽鐟胸i功能延時(shí),自行延時(shí)等。 4、 鬧鐘屏蔽:如果設(shè)置了鬧鐘,在主界面上可以通過*個(gè)符號(hào)顯示,如果沒有則通過另一個(gè)符號(hào)顯示。如果顯示沒有鬧鐘,則可屏蔽鬧鐘,即使設(shè)置了也不能到點(diǎn)鬧。該功能可通過按下*鍵改變*變量實(shí)現(xiàn)。 四、 功能及實(shí)現(xiàn) 1、 時(shí)間日期星期顯示:從頭文

56、件中調(diào)用函數(shù)SetTime(unsigned char hour,unsigned char min,unsigned char sec)和SetDate(unsigned char year,unsigned char mon,unsigned char day)將時(shí)間日期分別賦值給對(duì)應(yīng)變量。并將各個(gè)值分別賦值給數(shù)組: Date_Time[6]=DS12887_Sec; //秒 Date_Time[5]=DS12887_Min; //分 Date_Time[4]=DS12887_Hour; //時(shí)

57、 Date_Time[3]=DS12887_Week ; //星期 Date_Time[2]=DS12887_Day; //日 Date_Time[1]=DS12887_Mon; //月 Date_Time[0]=DS12887_Year; 在主函數(shù)中用while〔1〕循環(huán)掃描記錄各值。 將時(shí)分秒及月日用如下方式別離成十位和個(gè)位: Date_Time[i]/10)+48);(Date_Time[i]%10)+48)注意要顯示字符,必須加上48,因?yàn)長cd只能顯示字

58、符為char型。 定義displaytime〔〕函數(shù),用 DispOneChar(*,y,(Date_Time[i]/10)+48);語句將別離后的時(shí)分秒及日月顯示在液晶適當(dāng)?shù)奈恢谩? 由于星期只能用字符串顯示,只能另外編寫函數(shù),因?yàn)镈ate_Time[3]為記錄星期的數(shù)組元素,其值從1到7,分別對(duì)應(yīng)星期日到星期一??删帉懶瞧诤瘮?shù)如下: void week() { if(Date_Time[3]==6) Display(5,0,"Fri"); ... } 整個(gè)時(shí)間顯示構(gòu)造如下: mian〔〕 { SetTime( );SetDate(); While(1)

59、 {Date_Time[i]=DS12887_...; week(); displaytime〔〕; } } 2、時(shí)間星期日期的調(diào)整:日期及星期的調(diào)整可在主界面上進(jìn)展,調(diào)用Ps2頭文件,在while循環(huán)中用if判斷如果有鍵按下則星期加減同時(shí)日期同步加減, if(KeyChar=='w'){DS12887_Day+=1;DS12887_Week+=1;if(DS12887_Week>7) DS12887_Week=1;KeyChar=0;} //設(shè)置新日期 if(KeyChar=='j'){DS12887_Da

60、y-=1;DS12887_Week-=1;if(DS12887_Week<1) DS12887_Week=7;KeyChar=0;} 注意星期只能從1到7變化。 月份的調(diào)整要簡單些 if(KeyChar=='m'){DS12887_Mon+=1;KeyChar=0;} //設(shè)置新月份 if(KeyChar=='_'){DS12887_Mon-=1;KeyChar=0;} 時(shí)分秒的調(diào)整由于變量太多,可設(shè)置跳入另一界面實(shí)現(xiàn),如果有‘s’鍵按下,則進(jìn)入另一界面設(shè)置時(shí)間, 在Newtime()中調(diào)整時(shí)間,以‘b’跳回主函數(shù),函數(shù)從新設(shè)置的時(shí)間開場(chǎng)執(zhí)行。 3、 鬧鐘

61、的實(shí)現(xiàn) 如果沒有設(shè)置鬧鐘,在主界面上將顯示"$*〞。在主函數(shù)循環(huán)中,如果按下回車鍵,進(jìn)入鬧鐘設(shè)置界面,用一個(gè)全局變量數(shù)組Almtime[]記錄所設(shè)置的鬧鐘時(shí)分秒,回車鍵后返回主界面,在原來顯示"$*〞的地方顯示"$〞及腦中翻開。并開啟Led〔〕和 autdly()函數(shù)開場(chǎng)始掃描比照Almtime[]和當(dāng)前時(shí)間。 如果到了設(shè)置時(shí)間,則開場(chǎng)鬧鐘, D2=0;即亮燈,并顯示"Lazy pig Get up〞。并進(jìn)入自動(dòng)延時(shí)狀態(tài),如果有‘t’鍵按下,關(guān)閉鬧鐘,否則自動(dòng)延時(shí)10秒后開場(chǎng)滅燈返回主界面,一分鐘后繼續(xù)開場(chǎng)鬧鐘。 懶豬功能:對(duì)于賴床的人,轉(zhuǎn)么設(shè)置的一個(gè)功能,如果到點(diǎn)了,可以按下'y'鍵延

62、時(shí)三分鐘。具體實(shí)現(xiàn)如下: while(Date_Time[5]%10==Almtime[7]-48&&D2==0) { D2=0;Display(0,0," Lazy pig ");Display(4,1,"Get up!"); Date_Time[6]=DS12887_Sec; if(KeyChar=='t'){D2=1;Flag=1;KeyChar=0;WrtLcdCmd(Clear);break;}//關(guān)閉鬧鐘 if(KeyChar=='y') {Almtime[7]+=3;if(Almt

63、ime[7]>'9'){Almtime[7]=Almtime[7]-10;Almtime[8]=Almtime[8]+1;}D2=1;KeyChar=0;WrtLcdCmd(Clear);break;} //懶豬功能 if(Date_Time[6]/10==(Almtime[9]-47)){D2=1;WrtLcdCmd(Clear);break;} } 以上為第一次開場(chǎng)鬧鐘,一分鐘后通過語句 while(Date_Time[5]%10==(Almtime[7]-47)),再次進(jìn)入鬧鐘實(shí)現(xiàn)如上一樣功能。 4、鬧鐘的屏蔽 樣如果想屏蔽鬧鐘功能,按下'

64、p'鍵,將鬧鐘屏蔽,屏蔽后,不掃描Led〔〕及其autdly〔〕函數(shù),同時(shí)顯示"$*〞。 在主函數(shù)循環(huán)中可定義如下語句:if(KeyChar=='p'){flg=1;KeyChar=0;}其中,如果flg為1則不掃描Led〔〕及autdly〔〕; 五、整體構(gòu)造 整個(gè)程序簡化后如下: 時(shí)分秒調(diào)整〔〕; 時(shí)間顯示〔〕; 鬧鐘設(shè)置〔〕; 亮燈〔〕; mian〔〕 { Lcd初始化; 開ps2中斷; While〔1〕 { 時(shí)間數(shù)組=DS12887_; 時(shí)間顯示〔〕; 日期及星期調(diào)整; 時(shí)分秒調(diào)整〔〕; 鬧鐘設(shè)置〔〕; 亮燈〔〕; 開關(guān)鬧鐘屏蔽; } }

65、六、 源程序 *include //包含單片機(jī)存放器的頭文件 *include //包含隨機(jī)函數(shù)rand()的定義文件 *include "absacc.h" *include //包含_nop_()函數(shù)定義的頭文件 *include<12887.h> *include<1602.h> *include sbit D2=P3^1; unsigned char Almtime[15]={' ',' ',' ','_','_',':','_','_',':','_','_'}; unsigne

66、d char Date_Time[7]; unsigned char flg=1;//鬧鐘屏蔽標(biāo)志 unsigned char Flag=1;//延時(shí)掃描標(biāo)志 void delay() { unsigned char i,j=200; for(i=0;i<200;i++) while(j) {j--;} } void dely() { unsigned char i; for(i=0;i<200;i++) delay(); } void DisplayTime() //別離并顯示時(shí)間 { //取余運(yùn)算,求得各位數(shù)字 DispOneChar(12,0,(Date_Time[2]/10)+48); DispOneChar(13,0,(Date_Time[2]%10)+48); //日期 DispOneChar(9,0,(Date_Time[1]/10)+48)

展開閱讀全文
溫馨提示:
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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!