1、uchar inittime7=0x00,0x00,0x16,0x01,0x05,0x07,0x11; /初始化后设置为:/11年5月1日星期日,16点0分0秒, /从左往右的数据依次是,秒,分,时,日,月,星期,年。uchar code t1= 20 - - ; /液晶固定显示部分。uchar code t2= : uchar code t3=CLOCK ALARM:/各函数声明.void delay(uint z); /毫秒级延时函数。void di(); /蜂鸣器发声函数。void writecom(uchar com); /液晶写命令函数。void writedata(uchar da
2、t); /液晶写数据函数。void writetime(uchar add,char dat); /液晶刷新时分秒。void writenyr(uchar add,char dat); /液晶刷新日期。void writeweek(char week); /液晶星期几显示函数。void keyscan(); /键盘扫描函数。void dswritebyte(uchar d);/往DS1302写入一个字节。 uchar dsreadbyte(); /从DS1302读出一个字节。void dswrite(uchar add, uchar dat); /向DS1302的指定地址写入一个字节。ucha
3、r dsread(uchar add); /从DS1302的指定地址读出一个字节.void init1302time(uchar *pClock); /DS1302时间初始化函数.void init(); /初始化函数。ds18b20_delay(uchar xus); /延时xusvoid write_onechar(uchar dat); /向18B20写一字节uchar read_onechar(); /从18B20读一字节uint read_wendu(); /DS18B20读温度void wendu_desplay(uint dat); /温度值送液晶显示函数 void delay(
4、uint z) /毫秒级延时函数。 uint x,y; for(x=z;x0;x-) for(y=110;yy-); ds18b20_delay(uchar xus) /延时xus while(xus-);/*ds18b20*/void ds18b20_init() /DS18B20初始化 uchar x=0; DQ=1; ds18b20_delay(8); DQ=0; ds18b20_delay(80); ds18b20_delay(14); x=DQ; ds18b20_delay(20);void write_onechar(uchar dat) /写一字节 uchar i; for(i=
5、8;ii-) DQ=0; if(dat&0x01=0x01) DQ=1; else DQ=0; ds18b20_delay(5); DQ=1; ds18b20_delay(1); dat=1; uchar read_onechar() /读一字节 uchar value=0,i; value DQ=0; ds18b20_delay(1); DQ=1; if(DQ=1) value|=0x80; else value&=0x7f; ds18b20_delay(4); return value;uint read_wendu() /DS18B20读温度 uchar a=0,b=0; uint we
6、n=0x0000; ds18b20_init(); /初始化 write_onechar(0xcc); / 跳过读序号列号的操作 write_onechar(0x44); / 启动温度转换 ds18b20_delay(150); /跳过读序号列号的操作 write_onechar(0xbe); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度 b=read_onechar(); /读取温度值低位 a=read_onechar(); /读取温度值高位 wen=a; wen=(wen8)|b; return wen;void wendu_desplay(uint dat) /温度转换后送显示
7、 float temp; unsigned char temp_shi,temp_ge,temp_shu; temp=dat*0.625; /dat*0.0625*10 temp_shi=temp/100; /取十位 temp除不用定义类型 temp_ge =(uint)temp)%100/10; /取个位 temp求模要定义类型,为16位,故定义uint temp_shu=(uint)temp)%100%10; /取小数 writecom(0x80+0x40+10); /送显示 writedata(0x30+temp_shi); writedata(0x30+temp_ge); writed
8、ata(0x2e); writedata(0x30+temp_shu); writedata(0xdf); /温度符号 writedata(0x43);void di() /蜂鸣器发声函数。 beep=0; delay(100); beep=1;void writecom(uchar com) /液晶写命令函数。 lcden=0; lcdrw=0; lcdrs=0; lcddata=com; delay(3); lcden=1;void writedata(uchar dat) /液晶写数据函数。 lcdrs=1; lcddata=dat;void writetime(uchar add,ch
9、ar dat) /液晶刷新时分秒。 /0为时的开始位置,3为分,6为秒。 char shi,ge; shi=dat/10; ge=dat%10; writecom(0x80+0x40+add); writedata(0x30+shi); writedata(0x30+ge);void writenyr(uchar add,char dat) /液晶刷新日期。 /2为年,5为月,8为日。 writecom(0x80+add);void writeweek(char week) /液晶星期几显示函数。 writecom(0x80+12); switch(week) case 1: writedat
10、a(M);delay(5); writedata(ON break; case 2:TUE case 3:WD case 4:H case 5:FRI case 6:SA case 7:void keyscan() /键盘扫描函数。 if(flagalarm=1) /如果闹钟在响,任意键停止闹钟响。 if(kmenu=0)|(kup=0)|(kdown=0)|(kalarm=0) delay(4); if(kmenu=0)|(kup=0)|(kdown=0)|(kalarm=0) while(!(kmenu&kup&kdown&kalarm); di(); flagalarm=0; /清除闹钟
11、标志。 if(kmenu=0) /检测功能键。 delay(4); if(kmenu=0) kmenunum+; /记录功能键按下次数。 if(flagseta=1) / 检测是否在进行闹钟设置。 if(kmenunum=4) kmenunum=1; /因为进行闹钟设置时,只调节 /时分秒,所以,kmenunum 只能等于1,2,3。 flagset=1; /设置标志位,表示在进行各种时间设置。 while(!kmenu); di(); switch(kmenunum) /定位光标闪烁点。 case 1: writecom(0x80+0x40+7); /秒闪烁。 writecom(0x0f);
12、 /开光标闪烁。 break; case 2: writecom(0x80+0x40+4); /分闪烁。 case 3: writecom(0x80+0x40+1); /时闪烁。 case 4: /星期闪烁. case 5: writecom(0x80+9); /日闪烁. case 6: writecom(0x80+6); /月闪烁. case 7: writecom(0x80+3); /年闪烁. case 8: kmenunum=0; writecom(0x0c); /取消光标闪烁。 flagset=0; /取消时间调节标志。 dswrite(0x8e,0x00); /*允许写操作*/ ds
13、write(0x80,second/10*16+second%10); /退出时间设置功能时,往DS1302 dswrite(0x82,minute/10*16+minute%10); /中保存所有时间变量的值。 dswrite(0x84,hour/10*16+hour%10); dswrite(0x8a,week/10*16+week%10); dswrite(0x86,day/10*16+day%10); dswrite(0x88,month/10*16+month%10); dswrite(0x8c,year/10*16+year%10); dswrite(0x8e,0x80); /*禁
14、止写操作*/ if(kmenunum!=0) /只有当功能键按下时,才检测增大,减小键. if(kup=0) delay(2); if(kup=0)kup); switch(kmenunum) /根据功能键被按下的次数,调节相应数值。 case 1: second+; if(second=60) second=0; writetime(7,second); writecom(0x80+0x40+7); /因为,上面送液晶显示 break; /一次,光标后移一位,所以要将光标复位. case 2: minute+; if(minute=60) minute=0; writetime(4,minu
15、te); writecom(0x80+0x40+4); case 3: hour+; if(hour=24) hour=0; writetime(1,hour); writecom(0x80+0x40+1); case 4: week+; if(week=8) week=1; writeweek(week); writecom(0x80+12); case 5: day+; if(day=32) day=1; writenyr(9,day); writecom(0x80+9); case 6: month+; if(month=13) month=1; writenyr(6,month); w
16、ritecom(0x80+6); case 7: year+; if(year=100) year=0; writenyr(3,year); writecom(0x80+3); if(kdown=0) if(kdown=0)kdown); switch(kmenunum) /根据功能键被按次数调节相应数值. second-; if(second=-1) second=59; minute-; if(minute=-1) minute=59; hour-; if(hour=-1) hour=23; week-; if(week=0) week=7; day-; if(day=0) day=31;
17、 month-; if(month=0) month=12; year-; if(year=-1) year=99; if(kalarm=0) /检测闹钟调节键是否按下,此条if语句与 if(kmenunum!=0) /在同一个层次。 delay(2); if(kalarm=0) flagseta=flagseta;kalarm); if(flagseta=0) /此时,退出闹钟设置,保存各相关数值。 flagset=0; /清除时间设置标志,在if(kalarm=0)这个if语句 writecom(0x80+0x40);/中,不用flagset=1这条语句来设置 /flagset标志位,因为
18、,如果进行了闹钟时间的设置 /,就会执行前面if(kmenunum=0)语句中的flagset=1这条语句。 /清除液晶上的“Ri”闹钟调节标志。 /writedata( /*for(i=0;i13;i+) writedata(t3i); */ writecom(0x0c); dswrite(0x8e,0x00); dswrite(writealarmsecond,second/10*16+second%10); /往DS1302中保存闹钟的时分秒值。 dswrite(writealarmminute,minute/10*16+minute%10); dswrite(writealarmhour,hour/10*16+hour%10); dswrite(0x8e,0x80); else /进入闹钟设置。 s=dsread(readalarmsecond)/16*10+dsread(readalarmsecond)%16; /读取DS1302中闹钟的原始时间,转化为十进制数存进s,m,h保存,用以后面判断闹钟时间是否到达。 m=dsread(readalarmminute)/16*10+dsread(re
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1