分時(shí)區(qū)、12小時(shí)制和24小時(shí)制多功能電子時(shí)鐘_第1頁
分時(shí)區(qū)、12小時(shí)制和24小時(shí)制多功能電子時(shí)鐘_第2頁
分時(shí)區(qū)、12小時(shí)制和24小時(shí)制多功能電子時(shí)鐘_第3頁
分時(shí)區(qū)、12小時(shí)制和24小時(shí)制多功能電子時(shí)鐘_第4頁
分時(shí)區(qū)、12小時(shí)制和24小時(shí)制多功能電子時(shí)鐘_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、/*多功能電子時(shí)鐘單片機(jī):stc89c52系列或其兼容型號 外部晶振:12mhz功能:1、支持多個(gè)時(shí)鐘同時(shí)運(yùn)行(clockcount) 2、每個(gè)時(shí)鐘都具備12小時(shí)模式和24小時(shí)模式 3、12小時(shí)模式時(shí),具備am/pm的led指示功能 4、每個(gè)時(shí)鐘都具備鬧鈴功能 5、每個(gè)時(shí)鐘的時(shí)間和鬧鈴時(shí)間都可設(shè)置 (自適應(yīng)12小時(shí)模式和24小時(shí)模式)日期:2012.7.17(佳木斯大學(xué)65周年校慶)*/ #include reg52.h#define fosc(12)/系統(tǒng)晶振,以mhz為單位#define msecond(10)/定時(shí)器的定時(shí)時(shí)間,以毫秒為單位#define clockcount(3)/時(shí)鐘

2、個(gè)數(shù)#define vtl0(65536-msecond*fosc/12*1000)%256)/計(jì)算定時(shí)器初值#define vth0(65536-msecond*fosc/12*1000)/256)#define segport(p0)/顯示器段碼口#define weiport(p1)/顯示器位碼口#define flashhour(1)/小時(shí)閃爍判斷值#define flashminute(2)/分鐘閃爍判斷值#define flashsecond(3)/秒閃爍判斷值#define flashall(4)/所有位閃爍判斷值#define flashnone(5)/不閃爍判斷值#defin

3、e flashfreq(10)/小時(shí)、分、秒閃爍時(shí)的頻率,值越大越慢#define alarmtime(30000)/自動撤銷鬧鈴前的等待時(shí)間,值越大時(shí)間越長#define alarmon(1)/打開鬧鈴判斷值#define alarmoff(2)/關(guān)閉鬧鈴判斷值#define timemode12(1)/12小時(shí)模式#define timemode24(2)/24小時(shí)模式#define am(1)/代表上午#define pm(2)/代表下午#define key1(1)/1號按鍵的鍵值#define key2(2)/2號按鍵的鍵值#define key3(3)/3號按鍵的鍵值#define

4、 nokey(4)/無按鍵時(shí)的返回鍵值#define beepon(1)/打開蜂鳴器的電平#define beepoff(0)/關(guān)閉蜂鳴器的電平#define ledon(1)/點(diǎn)亮led時(shí)的電平#define ledoff(0)/熄滅led時(shí)的電平#define beepfreq(10)/蜂鳴器的發(fā)聲頻率,值越大越慢#define keyspeed(30)/按鍵的響應(yīng)速度,值越大響應(yīng)越慢#define keywaittime(1000)/無按鍵時(shí),自動退出前的等待時(shí)間,值越大時(shí)間越長sbit key1=p20;/1號按鍵,以下程序設(shè)定為“功能鍵”sbit key2=p21;/2號按鍵,以下程

5、序設(shè)定為“增鍵”sbit key3=p22;/3號按鍵,以下程序設(shè)定為“減鍵”sbit beep=p27;/鬧鈴驅(qū)動口線sbit amled=p23;/am指示燈sbit pmled=p24;/pm指示燈typedef struct/定義一個(gè)時(shí)鐘結(jié)構(gòu)體類型tclock unsigned char hour;unsigned char minute;unsigned char second;unsigned int msecond; /毫秒unsigned char timemode;/表示時(shí)鐘模式,是12小時(shí)模式還是24小時(shí)模式unsigned char amorpm;/表示當(dāng)前是上午還是下午

6、unsigned char alarmopen;/是否打開鬧鈴的控制位unsigned char alarmhour;unsigned char alarmminute;unsigned char alarmflag; /鬧鈴時(shí)間到標(biāo)志unsigned int alarmtime;/為自動退出鬧鈴狀態(tài)服務(wù)unsigned char alarmamorpm;/表示鬧鈴是設(shè)置在上午還是下午 tclock;unsigned char code segcode=/共陰極管 dp g f e d c b a 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x

7、6f,0x00;tclock clockclockcount,*pclock;/時(shí)鐘數(shù)組和時(shí)鐘指針unsigned char keywaitflag=0,adjusttimeflag=0;/用于函數(shù)間協(xié)調(diào)的兩個(gè)標(biāo)志unsigned char whichclock=0;/存放當(dāng)前所選時(shí)鐘的下標(biāo)unsigned char dispbuf6;/顯示緩沖區(qū)unsigned char keywaittime=0;/為無按鍵時(shí)的自動退出服務(wù)/通用的軟件延時(shí)函數(shù)/x要延時(shí)的時(shí)間,范圍0255void xdelay(unsigned char x) unsigned char y; for(;x0;x-) f

8、or(y=30;y0;y-);/將所選時(shí)鐘的數(shù)據(jù)填充到顯示緩沖區(qū)/pclock指向時(shí)鐘的指針void filldispbuf(tclock *pclock) dispbuf0=segcodepclock-hour/10; dispbuf1=segcodepclock-hour%10; dispbuf2=segcodepclock-minute/10; dispbuf3=segcodepclock-minute%10; dispbuf4=segcodepclock-second/10; dispbuf5=segcodepclock-second%10;/將所選時(shí)鐘的鬧鈴時(shí)間填充到顯示緩沖區(qū)/pc

9、lock指向時(shí)鐘的指針void fillalarmtodispbuf(tclock *pclock) dispbuf0=segcode10; dispbuf1=segcode10; dispbuf2=segcodepclock-alarmhour/10; dispbuf3=segcodepclock-alarmhour%10; dispbuf4=segcodepclock-alarmminute/10; dispbuf5=segcodepclock-alarmminute%10;/顯示函數(shù),用于顯示時(shí)間,可閃爍顯示/flashwhich指定閃爍的部分,可取值flashhour、/flashmi

10、nute、flashsecond、flashall、flashnonevoid display(unsigned char flashwhich) unsigned char weicode,i; static unsigned char nstate=0,flashcount=flashfreq; weicode=0xfe; for(i=0;i0) segport=dispbufi;else flashcount=flashfreq; nstate=1; break; case 1: /offif(-flashcount0) segport=dispbuf10;else flashcount

11、=flashfreq; nstate=0; break; default: nstate=0; else segport=dispbufi;break;case flashminute:if (i=2)|(i=3) switch(nstate) case 0: /onif(-flashcount0) segport=dispbufi;else flashcount=flashfreq; nstate=1; break; case 1: /offif(-flashcount0) segport=dispbuf10;else flashcount=flashfreq; nstate=0; brea

12、k; default: nstate=0; else segport=dispbufi;break;case flashsecond:if (i=4)|(i=5) switch(nstate) case 0: /onif(-flashcount0) segport=dispbufi;else flashcount=flashfreq; nstate=1; break; case 1: /offif(-flashcount0) segport=dispbuf10;else flashcount=flashfreq; nstate=0; break; default: nstate=0; else

13、 segport=dispbufi;break;case flashall:switch(nstate) case 0: /onif(-flashcount0) segport=dispbufi;else flashcount=flashfreq; nstate=1; break; case 1: /offif(-flashcount0) segport=dispbuf10;else flashcount=flashfreq; nstate=0; break; default: nstate=0;break;default: segport=dispbufi;flashcount=flashf

14、req; weiport=weicode; weicode=1; weicode|=1; xdelay(10); /顯示指定時(shí)鐘的時(shí)鐘下標(biāo)(編號)/aclock時(shí)鐘下標(biāo)void displayclock(unsigned char xclock) dispbuf0=0x39;/c dispbuf1=0x38;/l dispbuf2=0x3f;/o dispbuf3=0x39;/c dispbuf4=0x00;/熄滅 dispbuf5=segcodexclock;/時(shí)鐘編號 display(flashnone);/用于顯示所選時(shí)鐘鬧鈴的開關(guān)狀態(tài)/onoff開關(guān)狀態(tài),可取值為alarmon、ala

15、rmoffvoid displayonoffalarm(unsigned char onoroff) dispbuf0=0x77;/a dispbuf1=0x38;/l dispbuf2=0x77;/a if (onoroff=alarmon) dispbuf3=0x00;/熄滅 dispbuf4=0x5c;/o dispbuf5=0x54;/n else dispbuf3=0x5c;/o dispbuf4=0x71;/f dispbuf5=0x71;/f display(flashnone); /用于顯示時(shí)鐘的時(shí)間模式(12小時(shí)制或24小時(shí)制)/xtimemode時(shí)間模式,可取值為timem

16、ode12、timemode24void displaytimemode(unsigned char xtimemode) if (xtimemode=timemode12) dispbuf0=segcode1; /1 dispbuf1=segcode2; /2 else dispbuf0=segcode2; /2 dispbuf1=segcode4; /4 dispbuf2=0x74; /h dispbuf3=0x5c; /o dispbuf4=0x1c; /u dispbuf5=0x70; /r display(flashnone);/鍵盤函數(shù),返回值為按鍵的鍵值/返回值包括key1,ke

17、y2,key3,nokeyunsigned char key(void) static unsigned char xcount=0; if (+xcountalarmopen=alarmoff; pclock-timemode=timemode24; amled=ledoff; pmled=ledoff;void main(void) unsigned char nstate=0,akey,temp=0; init(); while(1) akey=key(); switch(nstate) case 0:/時(shí)鐘正常運(yùn)行filldispbuf(clock+whichclock);displa

18、y(flashnone);if(clockwhichclock.alarmflag)/驅(qū)動鬧鐘蜂鳴器 if(+temp=beepfreq) temp=0; beep=1; if(akey!=nokey) clockwhichclock.alarmflag=0;temp=0;beep=beepoff; if (akey=key1) keywaittime=0; nstate=1; break; case 1: /選擇時(shí)鐘keywaitflag=1;/等待按鍵時(shí)間內(nèi)無按鍵,自動返回運(yùn)行狀態(tài)if (keywaittime=keywaittime) nstate=0; keywaitflag=0; k

19、eywaittime=0;if (akey=key1) keywaittime=0; clockwhichclock.msecond=0; nstate=2; if (akey=key2) keywaittime=0; if(whichclock0) whichclock-;displayclock(whichclock); break; case 2:/選擇時(shí)間模式(12小時(shí)制或24小時(shí)制)keywaitflag=1;/等待按鍵時(shí)間內(nèi)無按鍵,自動返回運(yùn)行狀態(tài)if (keywaittime=keywaittime) nstate=0; keywaitflag=0; keywaittime=0;

20、if (akey=key1) keywaittime=0; adjusttimeflag=1; nstate=3;if (clockwhichclock.timemode=timemode12) displaytimemode(timemode12); if (clockwhichclock.amorpm=pm)pmled=ledon; amled=ledoff; else pmled=ledoff; amled=ledon; if (akey=key2)|(akey=key3) keywaittime=0;clockwhichclock.timemode=timemode24;clockwh

21、ichclock.hour+=12; else displaytimemode(timemode24); amled=ledoff; pmled=ledoff; if (akey=key2)|(akey=key3) clockwhichclock.timemode=timemode12;if (clockwhichclock.hour=12) keywaittime=0; clockwhichclock.hour-=12; clockwhichclock.amorpm=pm; else clockwhichclock.amorpm=am; break; case 3:/調(diào)整所選時(shí)鐘的小時(shí)key

22、waitflag=1;/等待按鍵時(shí)間內(nèi)無按鍵,自動返回運(yùn)行狀態(tài)if (keywaittime=keywaittime) nstate=0; keywaitflag=0; keywaittime=0;if (akey=key1) keywaittime=0; nstate=4; if (akey=key2) keywaittime=0; if (clockwhichclock.timemode=timemode12) if (clockwhichclock.hour12) clockwhichclock.hour+;else if (clockwhichclock.amorpm=pm) cloc

23、kwhichclock.amorpm=am;clockwhichclock.hour=0; else clockwhichclock.amorpm=pm;clockwhichclock.hour=0; else if (clockwhichclock.hour0) clockwhichclock.hour-; filldispbuf(clock+whichclock);display(flashhour); break; case 4:/調(diào)整所選時(shí)鐘的分鐘keywaitflag=1;/等待按鍵時(shí)間內(nèi)無按鍵,自動返回運(yùn)行狀態(tài)if (keywaittime=keywaittime) nstate=

24、0; keywaitflag=0; keywaittime=0;if (akey=key1) keywaittime=0; nstate=5; if (akey=key2) keywaittime=0; if(clockwhichclock.minute0) clockwhichclock.minute-; filldispbuf(clock+whichclock);display(flashminute); break; case 5:/調(diào)整所選時(shí)鐘的秒keywaitflag=1;/等待按鍵時(shí)間內(nèi)無按鍵,自動返回運(yùn)行狀態(tài)if (keywaittime=keywaittime) nstate=

25、0; keywaitflag=0; keywaittime=0;if (akey=key1) keywaittime=0; adjusttimeflag=0; nstate=6; if (akey=key2) keywaittime=0; if(clockwhichclock.second0) clockwhichclock.second-; filldispbuf(clock+whichclock);display(flashsecond); break; case 6:/開關(guān)鬧鈴功能keywaitflag=1;/等待按鍵時(shí)間內(nèi)無按鍵,自動返回運(yùn)行狀態(tài)if (keywaittime=keyw

26、aittime) nstate=0; keywaitflag=0; keywaittime=0;if (akey=key1) keywaittime=0; if(clockwhichclock.alarmopen) nstate=7; else nstate=0; if(clockwhichclock.alarmopen) displayonoffalarm(alarmon); if(akey=key2)|(akey=key3) keywaittime=0; clockwhichclock.alarmopen=alarmoff; else displayonoffalarm(alarmoff)

27、; if(akey=key2)|(akey=key3) keywaittime=0; clockwhichclock.alarmopen=alarmon; break; case 7:/調(diào)整鬧鈴小時(shí)keywaitflag=1;/等待按鍵時(shí)間內(nèi)無按鍵,自動返回運(yùn)行狀態(tài)if (keywaittime=keywaittime) nstate=0; keywaitflag=0; keywaittime=0;if (akey=key1) keywaittime=0; nstate=8; if (akey=key2) keywaittime=0; if (clockwhichclock.timemode=

28、timemode12) if (clockwhichclock.alarmhour12) clockwhichclock.alarmhour+;else if (clockwhichclock.alarmamorpm=pm) clockwhichclock.alarmamorpm=am;clockwhichclock.alarmhour=0; else clockwhichclock.alarmamorpm=pm;clockwhichclock.alarmhour=0; else if(clockwhichclock.alarmhour0) clockwhichclock.alarmhour-

29、; fillalarmtodispbuf(clock+whichclock);display(flashminute);break; case 8:/調(diào)整鬧鈴分鐘keywaitflag=1;/等待按鍵時(shí)間內(nèi)無按鍵,自動返回運(yùn)行狀態(tài)if (keywaittime=keywaittime) nstate=0; keywaitflag=0; keywaittime=0;if (akey=key1) keywaittime=0; nstate=0; if (akey=key2) keywaittime=0; if(clockwhichclock.alarmminute0) clockwhichclock.alarmminute-; fillalarmtodispbuf(clock+whichclock);display(flashsecond); break; default: nstate=0; /t0定時(shí)器10ms中斷服務(wù)函數(shù)void t0int(void) interr

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論