基于單片機DS1302的時鐘萬年歷(帶鬧鐘)_第1頁
基于單片機DS1302的時鐘萬年歷(帶鬧鐘)_第2頁
基于單片機DS1302的時鐘萬年歷(帶鬧鐘)_第3頁
基于單片機DS1302的時鐘萬年歷(帶鬧鐘)_第4頁
基于單片機DS1302的時鐘萬年歷(帶鬧鐘)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選文檔#include<reg52.h>#define uchar unsigned char #define uint unsigned intsbit lcdws=P21; /1602管腳定義sbit lcden=P20;sbit lcdrs=P22;sbit key1=P23; /鬧鐘設(shè)置鍵 sbit key2=P24; sbit key3=P15;/功能鍵定義sbit key4=P16;/增大鍵定義sbit key5=P17;/減小鍵定義uchar shi,fen,miao,ashi,afen,amiao,year,month,day,week;uchar s1num=0

2、,s1num2=0,temp;bit flag; float f_temp;uint i,d;uchar code table2=0x20,0x20,0x2e,0x20,0xdf,0x43;uchar code table="20 - - "uchar code table1=" : : "sbit ds=P10;/ds18b20信號線sbit beep=P14; /蜂鳴器管腳定義sbit ACC_7 = ACC7; /位尋址寄存器定義sbit SCLK = P12; / DS1302時鐘信號 sbit DIO= P11; / DS1302數(shù)據(jù)信號 sb

3、it CE = P13;/地址、數(shù)據(jù)發(fā)送子程序 /void delay2(uint ms)/ / uchar t;/ while(ms-); for(t=0;t<120;t+); / void playmusic()/ / uint i2=0,j2,k2;/ while(jiepaii2!=0|songi2!=0)/ / for(j2=0;j2<jiepaii2*20;j2+)/ / beep=beep;/ for(k2=0;k2<songi2/3;k2+);/delay2(10);/i2+;/ / void write_1302( uchar addr,uchar dat

4、) uchar i,temp; CE=0; /CE 引腳為低, 數(shù)據(jù)傳送中止 SCLK=0; /清零時鐘總線 CE = 1; /CE 引腳為高,邏輯控制有效 /發(fā)送地址 for ( i=8; i>0; i- ) /循環(huán)8次移位 SCLK = 0; temp = addr; DIO = (bit)(temp&0x01); /每次傳輸?shù)妥止?jié) addr >>= 1; /右移一位 SCLK = 1; /發(fā)送數(shù)據(jù) for ( i=8; i>0; i- ) SCLK = 0; temp = dat; DIO = (bit)(temp&0x01); dat >&

5、gt;= 1; SCLK = 1; CE = 0; /數(shù)據(jù)讀取子程序 uchar Read1302 ( uchar addr ) unsigned char i,temp,dat1,dat2; CE=0; SCLK=0; CE = 1; /發(fā)送地址 for ( i=8; i>0; i- ) /循環(huán)8次移位 SCLK = 0; temp = addr; DIO = (bit)(temp&0x01); /每次傳輸?shù)妥止?jié) addr >>= 1; /右移一位 SCLK = 1; /讀取數(shù)據(jù) for ( i=8; i>0; i- ) ACC_7=DIO; SCLK = 1

6、; ACC>>=1; SCLK = 0; CE=0; dat1=ACC; dat2=dat1/16; /數(shù)據(jù)進制轉(zhuǎn)換 /十六進制轉(zhuǎn)十進制 dat1=dat1%16; dat1=dat1+dat2*10; return (dat1); /初始化 DS1302 void Initial(void) /初始化1302 2010年09月30日23點58分56秒 星期一 write_1302 (0x8e,0x00); /允許寫保護 write_1302 (0x80,0x56); /秒位初始化 write_1302 (0x82,0x58); /分鐘初始化 write_1302 (0x84,0x

7、23); /小時初始化 write_1302 (0x86,0x30); /日初始化 write_1302 (0x88,0x09); /月初始化 write_1302 (0x8c,0x10); /年初始化 write_1302 (0x8a,0x01); /日期始化 write_1302 (0x8e,0x80); /禁止寫保護void delay(uint z)/延時1msuint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);void write_com(uchar com)/1602寫命令lcdrs=0;lcden=0;P0=com;delay(5);l

8、cden=1;delay(5);lcden=0;void write_data(uchar date)/1602寫數(shù)據(jù)lcdrs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;void dsreset(void) /DS18B20,初始化函數(shù)uint i;ds=0;i=103;while(i>0)i-;ds=1;i=4;while(i>0)i-;bit tempreadbit(void)/讀1位數(shù)據(jù)函數(shù)uint i;bit dat;ds=0;i+;ds=1;i+;i+;/i+起到延時作用dat=ds;i=8;while(i&

9、gt;0)i-;return(dat);uchar tempread(void) /讀一個字節(jié)數(shù)據(jù)函數(shù)uchar i,j,dat;dat=0;for(i=1;i<=8;i+)j=tempreadbit();dat=(j<<7)|(dat>>1);return(dat);void tempwritebyte(uchar dat) /向DS18B20寫一個字節(jié)數(shù)據(jù)函數(shù)uint i;uchar j;bit testb;for(j=1;j<=8;j+)testb=dat&0x01;dat=dat>>1;if(testb)/寫1ds=0;i+;i+

10、;ds=1;i=8;while(i>0)i-;elseds=0; /寫0i=8;while(i>0)i-;ds=1;i+;i+;void tempchange(void) /DS18B20開始獲取溫度并轉(zhuǎn)換dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0x44);uint get_temp() /獲取溫度uchar a,b;dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread(); /讀高8位b=tempread(); /讀低8位temp

11、=b;temp<<=8; /兩個字節(jié)組合成1個字節(jié)temp=temp|a;f_temp=temp*0.0625;temp=f_temp*10+0.5;f_temp=f_temp+0.05; /溫度在寄存器中為12位,分辨率為0.0625return temp;void display(uchar addr,uchar dat)write_com(0x80+0x40+addr);write_data(0x30+dat);delay(5);void dis_temp(uint t)uchar i;i=t/100;display(10,i);i=t%100/10;display(11,i

12、);i=t%100%10;display(13,i);void init()/初始化程序uchar num;flag=1;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<15;num+)write_data(tablenum);delay(5);write_com(0x80+0x40);for(num=0;num<8;num+)write_data(table1num);delay(5);write_com(0x80+0x40+

13、10);for(num=0;num<6;num+)write_data(table2num);delay(10);void di()/蜂鳴器響函數(shù)beep=0;delay(100);beep=1;void write_sfm(uchar add,uchar date)uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);void write_nyrz(uchar add,uchar date)/顯示年,月,日,周uchar shi,ge;s

14、hi=date/10;ge=date%10;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);void display_week(uchar we)write_com(0x80+12);switch(we)case 1: write_data('M');delay(5);write_data('O');delay(5);write_data('N');break;case 2: write_data('T');delay(5);write_data('

15、U');delay(5);write_data('E');break;case 3: write_data('W');delay(5);write_data('E');delay(5);write_data('D');break;case 4: write_data('T');delay(5);write_data('H');delay(5);write_data('U');break;case 5: write_data('F');delay(5);writ

16、e_data('R');delay(5);write_data('T');break;case 6: write_data('S');delay(5);write_data('A');delay(5);write_data('T');break;case 7: write_data('S');delay(5);write_data('U');delay(5);write_data('N');break;void keyscan()/按鍵設(shè)置if(key3=0)/功能鍵

17、按下flag=0;delay(5);if(key3=0)s1num+;while(!key3);di();switch(s1num)/光標(biāo)閃爍定位case 1:write_com(0x80+0x40+7);/定位到秒的位置 write_com(0x0f);break;case 2:write_com(0x80+0x40+4);/定位到分的位置 write_com(0x0f);break;case 3:write_com(0x80+0x40+1);/定位到小時的位置 write_com(0x0f);break;case 4:write_com(0x80+0x0e);/定位到星期的位置 write

18、_com(0x0f);break;case 5:write_com(0x80+0x9);/定位到日的位置 write_com(0x0f);break;case 6:write_com(0x80+0x6);/定位到月的位置 write_com(0x0f);break;case 7:write_com(0x80+0x3);/定位到年的位置 write_com(0x0f);break;case 8: s1num=0;/復(fù)位,時鐘走write_com(0x0c);flag=1; write_1302 (0x8e,0x00); /允許寫保護 write_1302 (0x80,miao); /秒位初始化

19、write_1302 (0x82,fen); /分鐘初始化 write_1302 (0x84,shi); /小時初始化 write_1302 (0x86,day); /日初始化 write_1302 (0x88,month); /月初始化 write_1302 (0x8c,year); /年初始化 write_1302 (0x8a,week); /日期始化 write_1302 (0x8e,0x80); /禁止寫¥break;if(s1num!=0)/只有功能鍵按下后,增大,增小建才有效if(key4=0)/增大建delay(5);if(key4=0)while(!key4);di();swi

20、tch(s1num)case 1: miao+; if(miao=60)miao=0;write_sfm(6,miao);/write_1302(write_second,miao);write_com(0x80+0x40+7);break;case 2: fen+; if(fen=60)fen=0;write_sfm(3,fen);/write_1302(write_minute,fen);write_com(0x80+0x40+4);break;case 3: shi+; if(shi=24)shi=0;write_sfm(0,shi);write_com(0x80+0x40+1);bre

21、ak;case 4: week+; if(week=8) week=1;display_week(week);write_com(0x80+14);break;case 5: day+; if(day=31)day=1;write_nyrz(8,day);write_com(0x80+9);break;case 6: month+; if(month=13)month=1;write_nyrz(5,month);write_com(0x80+6);break;case 7: year+; if(year=99)year=0;write_nyrz(2,year);write_com(0x80+3

22、);break;if(key5=0)/減小鍵delay(5);if(key5=0)while(!key5);di();switch(s1num)case 1: miao-; if(miao=-1)miao=59;write_sfm(6,miao);write_com(0x80+0x40+7);break;case 2: fen-; if(fen=-1)fen=59;write_sfm(3,fen);write_com(0x80+0x40+4);break;case 3: shi-; if(shi=-1)shi=23;write_sfm(0,shi);write_com(0x80+0x40+1)

23、;break;case 4: week-; if(week=-1) week=7;display_week(week);write_com(0x80+14);break;case 5: day-; if(day=0)day=31;write_nyrz(8,day);write_com(0x80+9);break;case 6: month-; if(month=0)month=12;write_nyrz(5,month);write_com(0x80+6);break;case 7: year-; if(year=-1)year=99;write_nyrz(2,year);write_com(

24、0x80+3);break;void set_alarm() if(key1=0)/功能鍵按下 delay(5);if(key1=0) while(!key1); flag=0; s1num2+; write_sfm(6,amiao); write_com(0x80+0x40+7); write_sfm(3,afen); write_com(0x80+0x40+4); write_sfm(0,ashi); write_com(0x80+0x40+1);di();switch(s1num2)/光標(biāo)閃爍定位case 1:write_com(0x80+0x40+7);/定位到秒的位置 write_c

25、om(0x0f);break;case 2:write_com(0x80+0x40+4);/定位到分的位置 write_com(0x0f);break;case 3:write_com(0x80+0x40+1);/定位到小時的位置 write_com(0x0f);break;case 4: s1num2=0;/復(fù)位,時鐘走write_com(0x0c);flag=1;/write_1302(0x8e,0x00);/允許寫保護write_1302 (0x8e,0x80);break; if(s1num2!=0)/只有功能鍵按下后,增大,增小建才有效 if(key2=0)/增大建delay(5);if(key2=0)while(!key2);di();switch(s1num2)case 1: amiao+; if(amiao=60)amiao=0;writ

溫馨提示

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

評論

0/150

提交評論