基于51單片機鬧鐘設(shè)計
《基于51單片機鬧鐘設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《基于51單片機鬧鐘設(shè)計(28頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、- 電子課程設(shè)計實習(xí)報告 元件購置及焊接 元件購置: 地點:廣埠屯,華中電子市場二樓 時間:2021年4月7日 過程:大早到華中電子市場后,當(dāng)時還沒開門,等到九點才開門,據(jù)人介紹上了二樓,賣各種電子元件的店面很多,但都不大。選了一家比擬小的店面,把教師給的清單給店主看后,店主很熱情,但是說有兩樣元件沒有,但承諾叫我們等等,到倉庫去找一下。我們委婉拒絕了,想先看看,第一次來畢竟的貨比三家嘛。又挨個找了幾家店,比照價格和元件齊全程度后,我們選了一家比擬大元件齊全而且價格合理的店面。 由于主要的元件,包括板子和各種芯片教師都發(fā)了,我們主要買一些小型元件
2、。主要是電阻電容,由于元件小,不是單個賣的,都是十個十個的賣。至于電阻電容的區(qū)分,以前參加電子協(xié)會也接觸過,關(guān)鍵是一些不熟悉的元件,如串口下載線之類的,我們雖然在課堂聽教師講過區(qū)分公母,但對于是否買對了,還是有疑問,得到店主承諾買錯了,可以包換后,才放心結(jié)賬。對著清單上一一看好后,除了電阻點容多買了幾個外,其他的東西都還齊全。最后叫店主結(jié)賬,并依照教師要求開發(fā)票。 原清單:〔局部元件由于分批購置或者網(wǎng)上購置,未能列入清單〕 焊接心得: 焊接時間:2021年4月9日〔星期六上午〕 地點:信息樓405 焊接元件電路圖: 過程及心得: 有了大二焊接收音機的一些焊接功底后,對于焊
3、接還是有些經(jīng)歷的,先將小的元件焊接好,比方說電容電感,防止大的高的元件焊好后留下的可操作空間太少,給小的元件焊接帶來不便。而不耐高溫的元件,如三極管等,可以留在最后焊接,以免引腳觸到烙鐵損壞元件。當(dāng)然有些元件的引腳雖然是對稱分布,但是是是有區(qū)別的,如電解電容,二極管,三極管等。特別應(yīng)該注意的是排阻,普通電阻部沒有負極,但是排阻比擬特別,兩端是不同的。由于排阻焊反了,導(dǎo)致與P0口相連的矩陣鍵盤無論如何都沒常使用,后來發(fā)現(xiàn)后,拔了好久才拔下來,手還在此過程中,還跟烙鐵來了個親密接觸,手指被燙的留下了一道白印記。拔下來時候,板子已經(jīng)傷痕累累了,幸好買了新的排阻焊上去之后,鍵盤能夠正常工作了,真可謂教
4、訓(xùn)沉痛。 焊接過程中,由于烙鐵使用的還是比擬少,開場時手拿著總覺得很別扭,點錫絲的時候甚至有點抖,不過焊完一兩個元件后就適應(yīng)了很多,后來越來越上手,速度也快了很多。 我們特地幾個人約好一起焊接,并比照,有疑問先討論,再動手焊接。但是還是有些問題沒得到解決,由于沒接觸過1602,對于排針和排插的位置還是焊反了,但是問題不大,后來的實習(xí)過程中證明液晶一直工作正常,不過以后還是得按常規(guī)出牌,以免遇到大麻煩。其間也遇到了復(fù)位開關(guān)的擺放問題,我一直覺得是只要能插進去就正確的,但有人覺得有正反問題,后來證明我的想法是正確。 焊完后,分模塊對整個硬件電路進展調(diào)試檢測,看有沒有
5、漏焊,虛焊的地方。之后,插上芯片試電,一切正常后,用安裝好的編譯和STC串口下載軟件給單片機下載程序,紅色的二極管一閃一閃的,等二極管不閃后,第一個數(shù)碼管被點亮了,當(dāng)時很興奮。至此焊接告一段落。 在此過程中,我總結(jié)出 1、 焊接前需熟悉電路,了解各元件,因為真正的焊接過程實際上是很短的,而準(zhǔn)備工作沒做好,只會給后面的焊接帶來意想不到的麻煩,甚至導(dǎo)致板子被毀。 2、 焊接過程中,要注意力集中,逐漸積累經(jīng)歷,怎樣操作適應(yīng),怎樣防止虛焊和短路,以提高效率??偟膩碚f是一個熟練掌握焊槍和熟悉錫絲特性的過程。 3、 焊接后先不要急于上電,也不要想板子一定焊好了,或者不正常之后惶恐是不是焊廢了。畢竟
6、這也是一個小的系統(tǒng),我們第一次接觸,第一次上電就能一切運行成功不現(xiàn)實,出現(xiàn)情況不要急,可能只是一些小問題,如沒插上芯片或跳線帽之類的。 4、 總之作為學(xué)電子電氣的,我們畢竟還會接觸硬件的焊接和調(diào)試,這只是一個開端,相信有了這次的經(jīng)歷后,以后的會對這一過程了解的更深入。 基于數(shù)碼管及矩陣鍵盤實現(xiàn)的移位等假設(shè)干功能 一、材料及硬件分析 數(shù)碼管的接法: 由于數(shù)碼管的借口很多,如果一個個接在單片機IO口上,將會很占用硬件資源,同時編程時候要兼顧段選和位選,會給編程帶來很大不便。使用74LS138和CD4511譯碼器后,兩個問題迎刃而解,如下為數(shù)碼管的接法原理圖: 由圖可知,138控制位選占
7、用3個IO口,CD4511控制段選占用4個IO口,加上控制小數(shù)點的引腳總共占用8個IO口。給P1口賦值的時候,高3位控制的是位選,即第幾個數(shù)碼管亮,低4位控制的為段選,直接顯示0-9,無需代碼。而第4位則控制的是小數(shù)點的亮暗。動態(tài)顯示的時候,只需要在*一位IO口后面的小數(shù)點點亮即可。 矩陣鍵盤線反法:矩陣鍵盤部是4*4的8根線組成的16鍵的鍵盤,每個限于線穿插點,表示為一個鍵??偣残枰?個IO口,當(dāng)兩個線沒有穿插的時候,接通的兩條線都變味低電平。首先可將高八位置為高電平第八位置為低電平,記下變?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)過屢次試驗后得出的各鍵的代碼為: 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)有鍵按下的時候,瞬間單片機的電平會不穩(wěn)定,即出現(xiàn)電平抖動,為了消除抖動,可采用軟件法: unsigned char up() { unsigned char P0Buf; P0=0*f0; //松鍵 P0Buf=P0; return(P0Buf-0*f0); } 在有鍵按下之后執(zhí)行while(up(
10、));即停在該處,只給Keyv賦值一次。 二、程序功能 1、密碼鎖:其他所有功能都在此程序運行成功的根底才能執(zhí)行。上電之后,輸入密碼,并按c鍵驗證正確之后會顯示全8,否則顯示全0。驗證成功后按下A可以自行下面程序 2、自動拉幕式移屏:1鍵左移,2鍵右移,其他鍵停頓,全屏顯示為12345678。 3、定時器時鐘:BCD分別可調(diào)時分秒,A鍵實現(xiàn)下一功能 4、秒表:1、2、3分別可以實現(xiàn)暫停,繼續(xù),清零功能,可準(zhǔn)確到百分之一秒 5、手動式移位并刪除:輸入數(shù)字的將第一個數(shù)字刪除,并將所有數(shù)字前移一位。C鍵可實現(xiàn)刪除,將最后一位數(shù)字刪除,并在第一位補零。 6、加法器:輸入兩個數(shù)字可實現(xiàn)相加
11、,并可清屏和連加,但不能實現(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)時間 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) //開場 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、 //時鐘 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、 //時鐘 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證明八個數(shù)都相等開鎖 } if(t==8&&KeyV==0*7e)break; } } void main() { dly(); while(1) { Klock(); screen(); } } 暑期實
48、習(xí) 課題一:基于51單片機的鬧鐘設(shè)計 一、 材料 材料:STC89C52單片機開發(fā)板一塊,1602液晶一片,12c887時鐘芯片,ps2鍵盤,下載線,個人計算機 編譯軟件:wave及keil 下載程序軟件:STC專用下載串口軟件 二、 芯片及硬件資料 一、芯片DS12c887 1、DS12C887 能夠自動產(chǎn)生世紀(jì)、 年、月、日、時、分、秒 等時間信息,其 部又增加了世紀(jì)存放器,從而利用硬件電路 解決子 "千年〞問題;DS12C887 中自帶有鋰電 池,外部掉電時,其部時間 信息還能夠保 持 10 年之久;對于一天的時間記錄,有 12 小時制和 24 小時制兩種模式。在 12
49、小時 制模式中,用 AM 和 PM 區(qū)分上午和下午; 2. 、引腳功能:DS12C887 的引腳排列如圖 1 所示,各管腳的功能說明如下: GND、VCC:直流電源,其中 VCC 接+5V 輸入,GND 接地,當(dāng) VCC 輸入為+5V 時,用 戶可以 DS12C887 RAM 中的數(shù)據(jù),并可對其進展讀、寫操作;當(dāng) VCC 的輸入小于 +4.25V 時,制止用戶對部 RAM 進展讀、寫操作,此時用戶不能正確獲取芯片的時間信 息;當(dāng) VCC 的輸入小于+3V 時,DS12C887 會自動將電源發(fā)換到部自帶的鋰電池上,以保證 部的電路能夠正常工作。
50、 圖1 3. 圖 2是用 8031 單片機和 DS12C887 構(gòu)成的時間獲取電路圖 即對應(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 工作模式。 即可以將各個引腳宏定義如下,并放入頭文件中: *define DS12887_Sec *BYTE[0*0fe00] //秒 *define DS12887_Min *BYTE[0*0fe02] //分 *define DS12887_Hour *BYTE[0*0fe04] //時 *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] //小時鬧 三、 思路分析 1、 時間及日期顯示:要有鬧鐘功能,及先應(yīng)該有時鐘顯示,可先將*一時間初值賦值給各個AD管腳,然后又以掃描方式將時間調(diào)出來,并用Lcd顯示,并在第二次下載程序之前,將原有時間屏蔽,即可實現(xiàn)。 2、 時間及日期修改:如果時間不準(zhǔn),可以通過軟件重設(shè)時間,但是現(xiàn)實
55、時鐘不允許軟件改時間,為了與現(xiàn)實鬧鐘功能一致,必須實現(xiàn)用硬件修改時間,及必先有輸入設(shè)備。用ps2鍵盤,結(jié)合頭文件可編程實現(xiàn)該功能。 3、 鬧鐘設(shè)置:用一個數(shù)組記錄三個數(shù)據(jù),分別定義為鬧鐘時分秒,并通過掃描與當(dāng)前時間比照,如果一一對應(yīng),則開場鬧鐘。鬧鐘過程可將開發(fā)板上的Led點亮,然后按*件實現(xiàn)關(guān)閉。可另行增加自己的想法功能,如懶豬功能延時,自行延時等。 4、 鬧鐘屏蔽:如果設(shè)置了鬧鐘,在主界面上可以通過*個符號顯示,如果沒有則通過另一個符號顯示。如果顯示沒有鬧鐘,則可屏蔽鬧鐘,即使設(shè)置了也不能到點鬧。該功能可通過按下*鍵改變*變量實現(xiàn)。 四、 功能及實現(xiàn) 1、 時間日期星期顯示:從頭文
56、件中調(diào)用函數(shù)SetTime(unsigned char hour,unsigned char min,unsigned char sec)和SetDate(unsigned char year,unsigned char mon,unsigned char day)將時間日期分別賦值給對應(yīng)變量。并將各個值分別賦值給數(shù)組: Date_Time[6]=DS12887_Sec; //秒 Date_Time[5]=DS12887_Min; //分 Date_Time[4]=DS12887_Hour; //時
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)掃描記錄各值。 將時分秒及月日用如下方式別離成十位和個位: Date_Time[i]/10)+48);(Date_Time[i]%10)+48)注意要顯示字符,必須加上48,因為Lcd只能顯示字
58、符為char型。 定義displaytime〔〕函數(shù),用 DispOneChar(*,y,(Date_Time[i]/10)+48);語句將別離后的時分秒及日月顯示在液晶適當(dāng)?shù)奈恢谩? 由于星期只能用字符串顯示,只能另外編寫函數(shù),因為Date_Time[3]為記錄星期的數(shù)組元素,其值從1到7,分別對應(yīng)星期日到星期一??删帉懶瞧诤瘮?shù)如下: void week() { if(Date_Time[3]==6) Display(5,0,"Fri"); ... } 整個時間顯示構(gòu)造如下: mian〔〕 { SetTime( );SetDate(); While(1)
59、 {Date_Time[i]=DS12887_...; week(); displaytime〔〕; } } 2、時間星期日期的調(diào)整:日期及星期的調(diào)整可在主界面上進展,調(diào)用Ps2頭文件,在while循環(huán)中用if判斷如果有鍵按下則星期加減同時日期同步加減, 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;} 時分秒的調(diào)整由于變量太多,可設(shè)置跳入另一界面實現(xiàn),如果有‘s’鍵按下,則進入另一界面設(shè)置時間, 在Newtime()中調(diào)整時間,以‘b’跳回主函數(shù),函數(shù)從新設(shè)置的時間開場執(zhí)行。 3、 鬧鐘
61、的實現(xiàn) 如果沒有設(shè)置鬧鐘,在主界面上將顯示"$*〞。在主函數(shù)循環(huán)中,如果按下回車鍵,進入鬧鐘設(shè)置界面,用一個全局變量數(shù)組Almtime[]記錄所設(shè)置的鬧鐘時分秒,回車鍵后返回主界面,在原來顯示"$*〞的地方顯示"$〞及腦中翻開。并開啟Led〔〕和 autdly()函數(shù)開場始掃描比照Almtime[]和當(dāng)前時間。 如果到了設(shè)置時間,則開場鬧鐘, D2=0;即亮燈,并顯示"Lazy pig Get up〞。并進入自動延時狀態(tài),如果有‘t’鍵按下,關(guān)閉鬧鐘,否則自動延時10秒后開場滅燈返回主界面,一分鐘后繼續(xù)開場鬧鐘。 懶豬功能:對于賴床的人,轉(zhuǎn)么設(shè)置的一個功能,如果到點了,可以按下'y'鍵延
62、時三分鐘。具體實現(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;} } 以上為第一次開場鬧鐘,一分鐘后通過語句 while(Date_Time[5]%10==(Almtime[7]-47)),再次進入鬧鐘實現(xiàn)如上一樣功能。 4、鬧鐘的屏蔽 樣如果想屏蔽鬧鐘功能,按下'
64、p'鍵,將鬧鐘屏蔽,屏蔽后,不掃描Led〔〕及其autdly〔〕函數(shù),同時顯示"$*〞。 在主函數(shù)循環(huán)中可定義如下語句:if(KeyChar=='p'){flg=1;KeyChar=0;}其中,如果flg為1則不掃描Led〔〕及autdly〔〕; 五、整體構(gòu)造 整個程序簡化后如下: 時分秒調(diào)整〔〕; 時間顯示〔〕; 鬧鐘設(shè)置〔〕; 亮燈〔〕; mian〔〕 { Lcd初始化; 開ps2中斷; While〔1〕 { 時間數(shù)組=DS12887_; 時間顯示〔〕; 日期及星期調(diào)整; 時分秒調(diào)整〔〕; 鬧鐘設(shè)置〔〕; 亮燈〔〕; 開關(guān)鬧鐘屏蔽; } }
65、六、 源程序
*include
66、d char Date_Time[7]; unsigned char flg=1;//鬧鐘屏蔽標(biāo)志 unsigned char Flag=1;//延時掃描標(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ù)字 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等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2020高考化學(xué)熱門專題:原理綜合透題型析課件
- 現(xiàn)代中國的教育說課稿課件
- 蒸餾和熔點沸點的測定和溫度計的校正
- 臨時起搏器的護理
- 恒成實業(yè)網(wǎng)絡(luò)推廣方案
- 勿為小惡優(yōu)秀課件-粵教版
- 人教版初中地理七年級上冊人口與人種課件7
- 誡子書課件文檔
- 軟件測試計劃書與測試用例編寫課件
- 人教版五年級數(shù)學(xué)上冊課件3小數(shù)除法第2課時除數(shù)是整數(shù)的小數(shù)除法課件
- 太白酒2002年全國推廣營銷企劃案
- 滬教版小學(xué)語文三年級上冊《小狗杜克》課件1
- 我們的情感世界課件7-人教版
- 擔(dān)保產(chǎn)品案例講解及其風(fēng)險控制設(shè)計(含法律相關(guān)規(guī)范)
- 【部編版】四年級語文上冊《2.走月亮》ppt課件