1、可调多功能温度时钟/多功能时钟(时间+温度+整点报时+可调节)已经调试成功,可以直接移植。#include #includeintrins.h#define uchar unsigned char#define uint unsigned intuchar min,sec=0,hour,counts,flm,hsec,time12;uchar times=0,flag;uchar tian,yue,year=2019;uchar nhour,nmin,nsec;unsigned char T1RH, T1RL;unsigned int j=0; unsigned char dispcode12
2、=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xa7,0xFF; /共阳数码管段码unsigned char dispbuf12; sbit dian=P37;sbit K1=P24; sbit K2=P26;sbit K3=P25;sbit K4=P27;sbit DQ=P32;sbit BEEP=P12;sbit IRIN=P33;sbit SDA = P17;sbit SCL = P16;bit flag_P=0,flag_M=0;bit flag_alarm=0; bit alarm_on=0; /*24C02*/void de
3、lay_us();void start();void stop();void ack();void nack();void write_24c02byte(uchar date);uchar read_24c02byte();void write_24c02(uchar address,uchar date);uchar read_24c02(uchar address);void ConfigTimer1(unsigned int ms);void baoshi();void RiQi_time(void);void alarm();void Clock_time(void);void de
4、lay_us()/5_us延时;void start() /起始信号 /SDA = 1; SCL = 1; SDA = 1; /前后位置都没有关系 delay_us(); SDA = 0; delay_us(); void stop() /终止信号 SDA = 0; SCL = 1; delay_us(); SDA = 1; delay_us();void ack() /应答信号 uchar i; SCL = 1; delay_us(); while(SDA = 1)&(i250)i+; SCL = 0; delay_us();void nack() /无应答信号 SCL = 0; /时序图是
5、在SCL为低电平期间,SDA变高则为非应答信号 delay_us(); SDA = 1; SCL = 0; delay_us();void write_24c02byte(uchar date)/带行参 /写入一个字节到I2C总线 uchar i,temp; temp = date; for(i=0;i8;i+) temp = temp1; SCL = 0; delay_us(); SDA = CY; /移到CY位的1赋给SDA(准备好了数据) delay_us(); SCL = 1; /来个上升沿数据送走 delay_us(); SCL = 0; /拉低是为下一次拉高准备 delay_us(
6、); SDA = 1; /释放数据总线 delay_us(); uchar read_24c02byte() /带返回值, /从I2C读一个字节 uchar i,j,k; SCL = 0; delay_us(); for(i=0;i8;i+) SCL = 1; delay_us(); j = SDA; k = (k1)|j;/k0 ; t-); void di(void) uint i; for (i=0; i=8)&(hour=7) counts=0; sec=0; TR1=1; /调节完后,继续走时 if(K3=0&flag_P=0) /加键 delay(300); if(K3=0) fl
7、ag_P=1; add_time(); if(K2=0&flag_P=0) /减键 delay(300); if(K2=0) flag_P=1; sub_time(); if(K4=0&flag_P=0) /开关闹钟键 delay(300); if(K4=0) while(!K4); flag_P=1; alarm_on = alarm_on; if(flag_P&K1=1&K3=1&K2=1&K4=1) /释放 di(); flag_P=0; return ;/*算法24小时制*/void calculate(void) time0=hour/10; /时十位 time1=hour%10;
8、/时个 time2=min/10; /分十位 time3=min%10; /分个 time4=yue/10; /月十位 time5=yue%10; /月个位 time6=tian/10; /天十位 time7=tian%10; /天个位 time8=nhour/10; /闹时十位 time9=nhour%10; /闹时个 time10=nmin/10; /闹分十位 time11=nmin%10; /闹分个 return; void Clock_time(void) /显示闹钟 if(counts=0|counts=6|counts=7)|flag_M) nmin=read_24c02(5);
9、/先读出闹分 P2=0xfE; P0=dispcodetime11; /段显闹分个位 P0&=0x7f; /加小数点,代表闹钟模式 delay(50); /延时 P0=0xff; /消隐 P2=0xfD; P0=dispcodetime10; /段显闹分十位 delay(50); /延时 P0=0xff; /消隐 if(counts=0|counts=5|counts=7)|flag_M) nhour=read_24c02(6); /先读出闹时 P2=0xFB; if(alarm_on=1) P0=dispcodetime9; /闹时个位 P0&=0x7f; /加固定的一点 else P0=d
10、ispcodetime9; /闹时个位 dian = 0; /加固定的两点 delay(50); /延时 P0=0xff; /消隐 P2=0xF7; P0=dispcodetime8; /段显闹时十位 delay(50); /延时 P0=0xff; /消隐 return;void RiQi_time(void) /显示日期 if(counts=0|counts=4|counts=7)|flag_M) tian=read_24c02(3); /先读出天 P2=0xfE; P0=dispcodetime7; /段显天个位 delay(50); /延时 P0=0xff; /消隐 P2=0xfD; P
11、0=dispcodetime6; /段显天十位 delay(50); /延时 P0=0xff; /消隐 if(counts=0|counts=3|counts=7)|flag_M) yue=read_24c02(4); /先读出月 P2=0xFB; P0=dispcodetime5; /月个位 dian = 1; P0&=0x7f; delay(50); /延时 P0=0xff; /消隐 P2=0xF7; P0=dispcodetime4; /段显月十位 delay(50); /延时 P0=0xff; /消隐 return; void LED_time(void) /显示时间 if(count
12、s=0|counts=2|counts=7|flag_M) min=read_24c02(2); /先读出分钟 P2=0xfE; P0=dispcodetime3; /段显分钟个位 delay(50); /延时 P0=0xff; /消隐 P2=0xfD; P0=dispcodetime2; /段显分钟十位 delay(50); /延时 P0=0xff; /消隐 if(counts=0|counts=1|counts=7|flag_M) hour=read_24c02(1); P2=0xfB; P0=dispcodetime1; /小时的个位 if(hsec0; i-) /在1560ms之间对数
13、据线进行采样,如果是高电平就写1,低写0发生。 DQ = 1;_nop_(); _nop_(); /在开始另一个写周期前必须有1Us以上的高电平恢复期。 DQ = 0;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); /5us DQ = val&0x01; /最低位移出 delay(6) ; /66us val = val/2; /右移1位 delay(1);uchar read_byte (void) uchar i; uchar value = 0; for(i = 8;i0;i-) DQ = 1; / 给脉冲信号 _nop_(); _nop_();
14、 value= 1; DQ = 0; / 给脉冲信号 _nop_(); _nop_(); _nop_(); _nop_();_nop_(); /4us DQ = 1; _nop_();_nop_();_nop_();_nop_();_nop_();/5us if(DQ) value|= 0x80 ; delay(13); /66us 注意延时的长短,如果是delay(6) 会造成LED闪烁 DQ = 1; return(value) ; void Setting_DS18B20(void) ow_reset(); write_byte(0xCC); / 跳过读序号列号的操作 write_byte(0x4e); write_byte(0x64); write_byte(0x8a); /-10 write_byte(0x7f); /*读取温度并完成转化*/void Read_Temperature(void) uchar tplsb,tpmsb; / 温度值低位、高位字节 uchar flag=0; / unsigned int j=0; /暂存计算得温度的整数部分 float tt; ow_reset(); write_byte(0xCC); / 跳过读序号列号的操
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1