實(shí)時(shí)日歷時(shí)鐘_第1頁(yè)
實(shí)時(shí)日歷時(shí)鐘_第2頁(yè)
實(shí)時(shí)日歷時(shí)鐘_第3頁(yè)
實(shí)時(shí)日歷時(shí)鐘_第4頁(yè)
實(shí)時(shí)日歷時(shí)鐘_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)時(shí)日歷時(shí)鐘硬件設(shè)計(jì)圖源程序/*功能介紹: 有時(shí)間功能鍵,增加鍵,減少鍵,日期功能鍵; 可根據(jù)不同鍵調(diào)節(jié)百年,年,月,日,時(shí),分,秒; 具有閏年調(diào)節(jié),日期錯(cuò)誤調(diào)整等校正功能; 具有按鍵自校正功能,防止誤按鍵; 有斷電保存功能;*/#include<reg52.h>/包含52單片機(jī)頭文件#define uchar unsigned char #define uint unsigned intbit write=0; /寫(xiě)24C02的標(biāo)志;sbit sda=P31; sbit scl=P30;void delay0() ; void start() /開(kāi)始信號(hào)sda=1;delay0(

2、);scl=1;delay0();sda=0;delay0();void stop() /停止sda=0;delay0();scl=1;delay0();sda=1;delay0();void respons() /應(yīng)答uchar i;scl=1;delay0();while(sda=1)&&(i<250)i+;scl=0;delay0();void init_24c02()/IIC初始化函數(shù)sda=1;delay0();scl=1;delay0();void write_byte(uchar date)/寫(xiě)一個(gè)字節(jié)函數(shù)uchar i,temp;temp=date;for

3、(i=0;i<8;i+)temp=temp<<1;scl=0; delay0();sda=CY;delay0();scl=1;delay0();scl=0;delay0();sda=1;delay0();uchar read_byte()/讀一個(gè)字節(jié)函數(shù)uchar i,k;scl=0;delay0();sda=1;delay0();for(i=0;i<8;i+)scl=1;delay0();k=(k<<1)|sda;scl=0;delay0();return k;void write_add(uchar address,uchar date)/指定地址寫(xiě)一個(gè)

4、字節(jié)start();write_byte(0xa0);respons();write_byte(address);respons();write_byte(date);respons();stop();char read_add(uchar address)/指定地址讀一個(gè)字節(jié)uchar date;start();write_byte(0xa0);respons();write_byte(address);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;/sbit dula=P26

5、; /定義鎖存器鎖存端/sbit wela=P27;sbit rs=P20; /定義1602液晶RS端sbit lcden=P22;/定義1602液晶LCDEN端sbit rw=P21;sbit s1=P14; /定義按鍵-功能鍵sbit s2=P15;/定義按鍵-增加鍵sbit s3=P16;/定義按鍵-減小鍵sbit s4=P17; /定義按鍵-riqi功能鍵sbit rd=P37;sbit beep=P23; /定義蜂鳴器端uchar count,s1num;uint count1;char miao,shi,fen;uchar n,moon,d,t,s4num,m;uchar code

6、 table1=" WELCOME TO USE"uchar code table2=" THE SYSTEM"void delay(uint z) /延時(shí)函數(shù)uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);void di()/蜂鳴器發(fā)聲函數(shù)beep=0;delay(100);beep=1;void write_com(uchar com)/液晶寫(xiě)命令函數(shù)rs=0; rw=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_date(u

7、char date)/液晶寫(xiě)數(shù)據(jù)函數(shù)rs=1;rw=0;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;void write_sfm(uchar add,uchar date)/寫(xiě)時(shí)分秒函數(shù)uchar shi,ge;shi=date/10;/分解一個(gè)2位數(shù)的十位和個(gè)位ge=date%10;write_com(0x80+0x40+add);/設(shè)置顯示位置write_date(0x30+shi);/送去液晶顯示十位write_date(0x30+ge); /送去液晶顯示個(gè)位void write_nyr(uchar add,uchar date)/

8、寫(xiě)年月日函數(shù)uchar shi,ge;shi=date/10;/分解一個(gè)2位數(shù)的十位和個(gè)位ge=date%10;write_com(0x80+add);/設(shè)置顯示位置write_date(0x30+shi);/送去液晶顯示十位write_date(0x30+ge); /送去液晶顯示個(gè)位void lcdinit1() uchar a; write_com(0x38); /顯示模式設(shè)置:16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口write_com(0x0c); /顯示模式設(shè)置write_com(0x06); /顯示模式設(shè)置:光標(biāo)右移,字符不移write_com(0x01); /清屏

9、幕指令,將以前的顯示內(nèi)容清除write_com(0x80); /設(shè)置所要顯示字符的位置為第一行第一列 TMOD=0x10; TH1=(65536-50000)/256;/定時(shí)器裝初值TL1=(65536-50000)%256; EA=1; ET1=1; TR1=1; do a=0; write_com(0x80); /設(shè)置所要顯示字符的位置為第一行第一列 while(table1a!='0')/只要沒(méi)有寫(xiě)到結(jié)束標(biāo)志,就繼續(xù)寫(xiě) /這是寫(xiě)字符的第一種方法,用while循環(huán)。 write_date(table1a); a+; a=0; write_com(0x80+0x40); wh

10、ile(table2a!='0')/只要沒(méi)有寫(xiě)到結(jié)束標(biāo)志,就繼續(xù)寫(xiě) /這是寫(xiě)字符的第一種方法,用while循環(huán)。 write_date(table2a); a+; while(count1<=140&s2=1&s3=1); count1=0; TR1=0; void init()/初始化函數(shù)/uchar num;rd=0; /軟件將矩陣按鍵第4列一端置低用以分解出獨(dú)立按鍵/dula=0;/關(guān)閉兩鎖存器鎖存端,防止操作液晶時(shí)數(shù)碼管會(huì)出亂碼/wela=0;lcden=0;fen=0; /初始化種變量值miao=0;shi=9;m=20;moon=2;d=14;

11、n=14;s4num=0;count=0; count1=0;s1num=0;init_24c02();write_com(0x38);/初始化1602液晶/功能設(shè)置write_com(0x0c);/顯示開(kāi)關(guān)write_com(0x06);/設(shè)置輸入方式write_com(0x01);/清屏write_com(0x80);/設(shè)置顯示初始坐標(biāo)write_com(0x80+6);/寫(xiě)出時(shí)間顯示部分的兩個(gè)冒號(hào)write_date('-');delay(5);write_com(0x80+9);write_date('-');delay(5);write_com(0x8

12、0+0x40+6);/寫(xiě)出時(shí)間顯示部分的兩個(gè)冒號(hào)write_date(':');delay(5);write_com(0x80+0x40+9);write_date(':');delay(5);miao=read_add(1);/首次上電從AT24C02中讀取出存儲(chǔ)的數(shù)據(jù)fen=read_add(2);shi=read_add(3);d=read_add(4);moon=read_add(5);n=read_add(6);m=read_add(7);write_nyr(10,d);/分別送去液晶顯示write_nyr(7,moon);write_nyr(4,n)

13、;write_nyr(2,m);write_sfm(10,miao);/分別送去液晶顯示write_sfm(7,fen);write_sfm(4,shi);TMOD=0x11;/設(shè)置定時(shí)器0,1工作模式1TH0=(65536-50000)/256;/定時(shí)器裝初值TL0=(65536-50000)%256; TH1=(65536-50000)/256;/定時(shí)器裝初值TL1=(65536-50000)%256;EA=1;/開(kāi)總中斷ET0=1;/開(kāi)定時(shí)器0中斷 ET1=1;TR0=1;/啟動(dòng)定時(shí)器0 TR1=0;void keyscan()/按鍵掃描函數(shù)if(s1=0)delay(5);if(s1=

14、0)/確認(rèn)功能鍵被按下s1num+;/功能鍵按下次數(shù)記錄while(!s1);/釋放確認(rèn)di();/每當(dāng)有按鍵釋放蜂鳴器發(fā)出滴聲s4num=0;/終止日期調(diào)節(jié)count1=0;if(s1num=1)/第一次被按下時(shí)TR0=0; /關(guān)閉定時(shí)器 TR1=1;write_com(0x80+0x40+11);/光標(biāo)定位到秒位置 write_com(0x0f);if(s1num=2)/第二次按下光標(biāo)閃爍定位到分鐘位置write_com(0x80+0x40+8);if(s1num=3)/第三次按下光標(biāo)閃爍定位到小時(shí)位置write_com(0x80+0x40+5);if(s1num=4)/第四次按下s1nu

15、m=0;/記錄按鍵數(shù)清零write_com(0x0c);/取消光標(biāo)閃爍TR0=1;/啟動(dòng)定時(shí)器使時(shí)鐘開(kāi)始走 TR1=0; count1=0; if(s1num!=0)/只有功能鍵被按下后,增加和減小鍵才有效if(s2=0)delay(5);if(s2=0)/增加鍵確認(rèn)被按下while(!s2);/按鍵釋放di();/每當(dāng)有按鍵釋放蜂鳴器發(fā)出滴聲 count1=0;if(s1num=1)/若功能鍵第一次按下miao+; /則調(diào)整秒加1if(miao>=60)/若滿60后將清零miao=0;write_sfm(10,miao);/每調(diào)節(jié)一次送液晶顯示一下write_com(0x80+0x40

16、+11);/顯示位置重新回到調(diào)節(jié)處write_add(1,miao);/數(shù)據(jù)改變立即存入24C02if(s1num=2)/若功能鍵第二次按下fen+;/則調(diào)整分鐘加1if(fen>=60)/若滿60后將清零fen=0;write_sfm(7,fen);/每調(diào)節(jié)一次送液晶顯示一下write_com(0x80+0x40+8);/顯示位置重新回到調(diào)節(jié)處write_add(2,fen);/數(shù)據(jù)改變立即存入24C02if(s1num=3)/若功能鍵第三次按下shi+;/則調(diào)整小時(shí)加1if(shi>=24)/若滿24后將清零shi=0;write_sfm(4,shi);/每調(diào)節(jié)一次送液晶顯示一

17、下write_com(0x80+0x40+5);/顯示位置重新回到調(diào)節(jié)處write_add(3,shi);/數(shù)據(jù)改變立即存入24C02if(s3=0)delay(5);if(s3=0)/確認(rèn)減小鍵被按下while(!s3);/按鍵釋放di();/每當(dāng)有按鍵釋放蜂鳴器發(fā)出滴聲 count1=0;if(s1num=1)/若功能鍵第一次按下miao-;/則調(diào)整秒減1if(miao=-1)/若減到負(fù)數(shù)則將其重新設(shè)置為59miao=59;write_sfm(10,miao);/每調(diào)節(jié)一次送液晶顯示一下write_com(0x80+0x40+11);/顯示位置重新回到調(diào)節(jié)處write_add(1,miao

18、);/數(shù)據(jù)改變立即存入24C02if(s1num=2)/若功能鍵第二次按下fen-;/則調(diào)整分鐘減1if(fen=-1)/若減到負(fù)數(shù)則將其重新設(shè)置為59fen=59;write_sfm(7,fen);/每調(diào)節(jié)一次送液晶顯示一下write_com(0x80+0x40+8);/顯示位置重新回到調(diào)節(jié)處write_add(2,fen);/數(shù)據(jù)改變立即存入24C02if(s1num=3)/若功能鍵第二次按下shi-;/則調(diào)整小時(shí)減1if(shi=-1)/若減到負(fù)數(shù)則將其重新設(shè)置為23shi=23;write_sfm(4,shi);/每調(diào)節(jié)一次送液晶顯示一下write_com(0x80+0x40+5);/

19、顯示位置重新回到調(diào)節(jié)處write_add(3,shi);/數(shù)據(jù)改變立即存入24C02/*時(shí)間調(diào)整*/閏年判斷uchar nian(uchar n)uchar y;if(n%400=0)y=1;else if(n%100=0)y=0;else if(n%4=0)y=1;else y=0;return y;/月天數(shù)判斷uchar m_tian(uchar moon)uchar y,tian,nm;nm=n+m*100;y=nian(nm);if(moon=2)if(y=0)tian=28;else tian=29;else if(moon=4|moon=6|moon=9|moon=11)tian=

20、30;else tian=31;return tian;/鍵盤掃描1void keyscan1()if(s4=0)/日期功能鍵實(shí)現(xiàn)delay(5);if(s4=0)s4num+;/s4按下的次數(shù)while(!s4);di();s1num=0;/終止時(shí)間調(diào)節(jié) count1=0;switch(s4num)case 1:TR0=0; TR1=1;write_com(0x80+11);write_com(0x0f);/光標(biāo)顯示并閃爍break;case 2:write_com(0x80+8);break;case 3:write_com(0x80+5);break;case 4:write_com(0

21、x80+3);break;case 5:s4num=0;write_com(0x0c);/光標(biāo)不再閃爍TR0=1; TR1=0; count=0;break;/日期調(diào)整if(s4num!=0)if(s2=0)delay(5);if(s2=0)/時(shí)間增加調(diào)整while(!s2);di(); count1=0;if(s4num=1)d+;t=m_tian(moon);if(d>t)d=1;write_nyr(10,d);write_com(0x80+11);write_add(4,d);if(s4num=2)moon+;if(moon>=13)moon=1;write_nyr(7,mo

22、on);write_com(0x80+8);write_add(5,moon);if(s4num=3)n+;if(n>=100)n=0;write_nyr(4,n);write_com(0x80+5);write_add(6,n);if(s4num=4)m+;if(m>=100)m=0;write_nyr(2,m);write_com(0x80+3);write_add(7,m);if(s3=0)/時(shí)間減少調(diào)整delay(5);if(s3=0)while(!s3);di(); count1=0;if(s4num=1)t=m_tian(moon); if(d>t) d=t+1;

23、if(d=1)d=t+1; d-; write_nyr(10,d);write_com(0x80+11);write_add(4,d);if(s4num=2)if(moon>13) moon=13; if(moon=1)moon=13;moon-;write_nyr(7,moon);write_com(0x80+8);write_add(5,moon);if(s4num=3) if(n>100) n=100;if(n=0)n=100;n-;write_nyr(4,n);write_com(0x80+5);write_add(6,n);if(s4num=4)if(m>100)

24、m=100;if(m=0)m=100;m-;write_nyr(2,m);write_com(0x80+3);write_add(7,m);void main()/主函數(shù) lcdinit1();init();/首先初始化各數(shù)據(jù) while(1)/進(jìn)入主程序大循環(huán)keyscan();/不停的檢測(cè)按鍵是否被按下keyscan1();void timer0() interrupt 1/定時(shí)器0中斷服務(wù)程序TH0=(65536-50000)/256;/再次裝定時(shí)器初值TL0=(65536-50000)%256;count+;/中斷次數(shù)累加if(count=18) /20次50毫秒為1秒count=0;miao+;if(miao>=60)/秒加到60則進(jìn)位分鐘miao=0;/同時(shí)秒數(shù)清零fen+;if(fen&g

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論