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