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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

6、unsigned char alarmopen;/是否打開鬧鈴的控制位unsigned char alarmhour;unsigned char alarmminute;unsigned char alarmflag; /鬧鈴時間到標志unsigned int alarmtime;/為自動退出鬧鈴狀態(tài)服務unsigned char alarmamorpm;/表示鬧鈴是設置在上午還是下午 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ù)組和時鐘指針unsigned char keywaitflag=0,adjusttimeflag=0;/用于函數(shù)間協(xié)調的兩個標志unsigned char whichclock=0;/存放當前所選時鐘的下標unsigned char dispbuf6;/顯示緩沖區(qū)unsigned char keywaittime=0;/為無按鍵時的自動退出服務/通用的軟件延時函數(shù)/x要延時的時間,范圍0255void xdelay(unsigned char x) unsigned char y; for(;x0;x-) f

8、or(y=30;y0;y-);/將所選時鐘的數(shù)據(jù)填充到顯示緩沖區(qū)/pclock指向時鐘的指針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;/將所選時鐘的鬧鈴時間填充到顯示緩沖區(qū)/pc

9、lock指向時鐘的指針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ù),用于顯示時間,可閃爍顯示/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); /顯示指定時鐘的時鐘下標(編號)/aclock時鐘下標void displayclock(unsigned char xclock) dispbuf0=0x39;/c dispbuf1=0x38;/l dispbuf2=0x3f;/o dispbuf3=0x39;/c dispbuf4=0x00;/熄滅 dispbuf5=segcodexclock;/時鐘編號 display(flashnone);/用于顯示所選時鐘鬧鈴的開關狀態(tài)/onoff開關狀態(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); /用于顯示時鐘的時間模式(12小時制或24小時制)/xtimemode時間模式,可取值為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:/時鐘正常運行filldispbuf(clock+whichclock);displa

18、y(flashnone);if(clockwhichclock.alarmflag)/驅動鬧鐘蜂鳴器 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: /選擇時鐘keywaitflag=1;/等待按鍵時間內(nèi)無按鍵,自動返回運行狀態(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:/選擇時間模式(12小時制或24小時制)keywaitflag=1;/等待按鍵時間內(nèi)無按鍵,自動返回運行狀態(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:/調整所選時鐘的小時key

22、waitflag=1;/等待按鍵時間內(nèi)無按鍵,自動返回運行狀態(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:/調整所選時鐘的分鐘keywaitflag=1;/等待按鍵時間內(nèi)無按鍵,自動返回運行狀態(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:/調整所選時鐘的秒keywaitflag=1;/等待按鍵時間內(nèi)無按鍵,自動返回運行狀態(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:/開關鬧鈴功能keywaitflag=1;/等待按鍵時間內(nèi)無按鍵,自動返回運行狀態(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:/調整鬧鈴小時keywaitflag=1;/等待按鍵時間內(nèi)無按鍵,自動返回運行狀態(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:/調整鬧鈴分鐘keywaitflag=1;/等待按鍵時間內(nèi)無按鍵,自動返回運行狀態(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定時器10ms中斷服務函數(shù)void t0int(void) interr

溫馨提示

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

評論

0/150

提交評論