1、 /定义累加器的最高和最低位。sbit ACC0=ACC0;bit flagalarm,flagseta,flagset; /分别定义闹钟响标志位,闹钟设置标志位,/和时间设置标志位.uchar kmenunum,s,m,h; /功能键被按次数的计数器.char second,minute,hour,year,month,day,week;uchar inittime7=0x00,0x00,0x16,0x01,0x05,0x07,0x11; /初始化后设置为:/11年5月1日星期日,16点0分0秒, /从左往右的数据依次是,秒,分,时,日,月,星期,年。uchar code t1= 20 -
2、; /液晶固定显示部分。uchar code t2= :uchar code t3=CLOCK ALARM:/各函数声明.void delay(uint z); /毫秒级延时函数。void di(); /蜂鸣器发声函数。void writecom(uchar com); /液晶写命令函数。void writedata(uchar dat); /液晶写数据函数。void writetime(uchar add,char dat); /液晶刷新时分秒。void writenyr(uchar add,char dat); /液晶刷新日期。void writeweek(char week); /液晶星
3、期几显示函数。void keyscan(); /键盘扫描函数。void dswritebyte(uchar d);/往DS1302写入一个字节。 uchar dsreadbyte(); /从DS1302读出一个字节。void dswrite(uchar add, uchar dat); /向DS1302的指定地址写入一个字节。uchar dsread(uchar add); /从DS1302的指定地址读出一个字节.void init1302time(uchar *pClock); /DS1302时间初始化函数.void init(); /初始化函数。ds18b20_delay(uchar xu
4、s); /延时xusvoid write_onechar(uchar dat); /向18B20写一字节uchar read_onechar(); /从18B20读一字节uint read_wendu(); /DS18B20读温度void wendu_desplay(uint dat); /温度值送液晶显示函数 void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;yy-);ds18b20_delay(uchar xus)while(xus-);/*ds18b20*/void ds18b20_init() /DS18B20初始化uchar x=0
5、;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=8;ii-)if(dat&0x01=0x01)elseds18b20_delay(5);ds18b20_delay(1);dat=1;uchar read_onechar() /读一字节uchar value=0,i;valueif(DQ=1)value|=0x80;value&=0x7f;ds18b20_delay(4);r
6、eturn value;uint read_wendu() /DS18B20读温度uchar a=0,b=0;uint wen=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)
7、|b;return wen;void wendu_desplay(uint dat) /温度转换后送显示float temp;unsigned char temp_shi,temp_ge,temp_shu;temp=dat*0.625; /dat*0.0625*10temp_shi=temp/100; /取十位 temp除不用定义类型temp_ge =(uint)temp)%100/10; /取个位 temp求模要定义类型,为16位,故定义uinttemp_shu=(uint)temp)%100%10; /取小数writecom(0x80+0x40+10); /送显示writedata(0x3
8、0+temp_shi);writedata(0x30+temp_ge);writedata(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,char
9、 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: writedata(M);delay(5
10、);writedata(ONbreak;case 2:TUEcase 3:WDcase 4:Hcase 5:FRIcase 6:SAcase 7:void keyscan() /键盘扫描函数。if(flagalarm=1) /如果闹钟在响,任意键停止闹钟响。if(kmenu=0)|(kup=0)|(kdown=0)|(kalarm=0)delay(4);while(!(kmenu&kup&kdown&kalarm);di();flagalarm=0; /清除闹钟标志。 if(kmenu=0) /检测功能键。if(kmenu=0)kmenunum+; /记录功能键按下次数。if(flagseta
11、=1) / 检测是否在进行闹钟设置。if(kmenunum=4) kmenunum=1; /因为进行闹钟设置时,只调节/时分秒,所以,kmenunum 只能等于1,2,3。flagset=1; /设置标志位,表示在进行各种时间设置。kmenu);switch(kmenunum) /定位光标闪烁点。 writecom(0x80+0x40+7); /秒闪烁。writecom(0x0f); /开光标闪烁。 writecom(0x80+0x40+4); /分闪烁。 writecom(0x80+0x40+1); /时闪烁。 writecom(0x80+12); /星期闪烁. writecom(0x80+
12、9); /日闪烁. writecom(0x80+6); /月闪烁. writecom(0x80+3); /年闪烁.case 8: kmenunum=0;writecom(0x0c); /取消光标闪烁。flagset=0; /取消时间调节标志。dswrite(0x8e,0x00); /*允许写操作*/dswrite(0x80,second/10*16+second%10); /退出时间设置功能时,往DS1302dswrite(0x82,minute/10*16+minute%10); /中保存所有时间变量的值。dswrite(0x84,hour/10*16+hour%10);dswrite(0x
13、8a,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); /*禁止写操作*/if(kmenunum!=0) /只有当功能键按下时,才检测增大,减小键.if(kup=0)delay(2);kup); /根据功能键被按下的次数,调节相应数值。 second+;if(second=60)second=0;writetime(7,second);writecom(0x80+0x4
14、0+7); /因为,上面送液晶显示 /一次,光标后移一位,所以要将光标复位. minute+;if(minute=60)minute=0;writetime(4,minute);writecom(0x80+0x40+4); hour+;if(hour=24)hour=0;writetime(1,hour);writecom(0x80+0x40+1); week+;if(week=8)week=1;writeweek(week); day+;if(day=32)day=1;writenyr(9,day);writecom(0x80+9); month+;if(month=13)month=1;w
15、ritenyr(6,month);writecom(0x80+6); year+;if(year=100)year=0;writenyr(3,year);writecom(0x80+3);if(kdown=0)kdown); /根据功能键被按次数调节相应数值. 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; month-;if(month=0)month=12; year-
16、;if(year=-1)year=99;if(kalarm=0) /检测闹钟调节键是否按下,此条if语句与 if(kmenunum!=0) /在同一个层次。if(kalarm=0)flagseta=flagseta;kalarm);if(flagseta=0) /此时,退出闹钟设置,保存各相关数值。 /清除时间设置标志,在if(kalarm=0)这个if语句writecom(0x80+0x40);/中,不用flagset=1这条语句来设置/flagset标志位,因为,如果进行了闹钟时间的设置/,就会执行前面if(kmenunum=0)语句中的flagset=1这条语句。 /清除液晶上的“Ri”闹钟调节标志。/writedata(/*for(i=0;i i-)dsdata = ACC0;dsclk = 1; /为什么这里时钟先为1后为0,因为dsclk初始化为0,而,每次循环最后,都将其置0,这样就形成一个从0开始的上升沿,恰好满足ds1302写数据在上升沿,但是,时钟必须从0开始的要求.dsclk = 0;ACC = ACC 1; uchar dsreadbyte() /从DS1302读出一个
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2