附 录
uchar temp_value,temp1_value; //temp_value温度值正数部分 temp1_value温度值小数部分
uchar done,count,temp,up_flag,down_flag;
uchar hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数
uchar TempBuffer[8],week_value[3],dht_11[2]; uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍正转编码
void show_time(); //液晶显示程序 void wr_d_lcd(uchar content); void wr_i_lcd(uchar content); void clrram_lcd (void); void init_lcd(void); void busy_lcd(void);
void rev_row_lcd(uchar row);
void rev_co_lcd(uchar row,uchar col,uchar mode); void clr_lcd(void);
void wr_co_lcd(uchar row,uchar col,uchar lcddata1,uchar lcddtta2); void wr_row_lcd(uchar row,char *p); void Delay(U16 z) {
U8 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); }
void delay_10us() {
U8 i; i--; i--; i--; i--; i--; i--; }
void delay1(uint t)
{ uint k; while(t--) {
for(k=0; k<125; k++); } }
void COM(void) //数据0 1确认 {
U8 i;
for(i=0;i<8;i++) {
U8FLAG=2;
40
附 录
while((!P3_0)&&U8FLAG++); //1bit是否结束 delay_10us(); delay_10us(); delay_10us();
U8temp=0;// 26us~28us 表示为0
if(P3_0)U8temp=1; // 超过28us依然为高电平 表示为1 U8FLAG=2;
while((P3_0)&&U8FLAG++);
if(U8FLAG==1)break;//U8FLAG溢出超时则跳出for循环 U8comdata<<=1;
U8comdata|=U8temp; } }
void RH(void) //-----湿温度读取子程序 ------------ {
P3_0=0;
Delay(34); //主机拉低高于18ms P3_0=1;
//总线由上拉电阻拉高 主机延时20us delay_10us(); delay_10us(); delay_10us(); delay_10us();
P3_0=1;//主机设为输入 判断从机响应信号
if(!P3_0)//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 {
U8FLAG=2;
while((!P3_0)&&U8FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
U8FLAG=2;
while((P3_0)&&U8FLAG++);//判断从机是否发出 80us 的高电平, 如发出则进入数据接收状态
COM();//数据接收状态
U8RH_data_H_temp=U8comdata; //湿度整数8位 COM(); U8RH_data_L_temp=U8comdata; //湿度小数8位 COM();
U8T_data_H_temp=U8comdata; //温度整数8位 COM();
U8T_data_L_temp=U8comdata; //温度小数8位 COM();
U8checkdata_temp=U8comdata; //校验位 P3_0=1;
41
附 录
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)//数据校验 正确执行 { U8RH_data_H=U8RH_data_H_temp; U8RH_data_L=U8RH_data_L_temp; U8T_data_H=U8T_data_H_temp; U8T_data_L=U8T_data_L_temp; U8checkdata=U8checkdata_temp; }
} //jj=date/10; }
void write_dht11(U8 date) { dht_11[0]=date/10+'0'; dht_11[1]=date+'0'; ff=date; }
void init_lcd(void) { wr_i_lcd(0x06); wr_i_lcd(0x0c); }
void clrram_lcd (void) { wr_i_lcd(0x30); wr_i_lcd(0x01); }
void wr_d_lcd(uchar content) { busy_lcd(); rs=1; rw=0; lcddata=content; e=1; e=0; }
void wr_i_lcd(uchar content) { busy_lcd(); rs=0; rw=0; lcddata=content; e=1;
42
附 录
; e=0; }
void busy_lcd(void) {
lcddata=0xff; rs=0; rw=1; e =1;
while(busy==1); e =0; }
void gotoxy(unsigned char y, unsigned char x) { if(y==1) wr_i_lcd(0x80|x); if(y==2)
wr_i_lcd(0x90|x); if(y==3) wr_i_lcd((0x80|x)+8); if(y==4)
wr_i_lcd((0x90|x)+8); }
//********************************** //液晶显示字符串程序
//********************************** void print(uchar *str) { while(*str!='\\0') { wr_d_lcd(*str); str++; } }
typedef struct __SYSTEMTIME__ { uchar Second; uchar Minute; uchar Hour; uchar Week; uchar Day; uchar Month; uchar Year; uchar DateString[11]; uchar TimeString[9]; }SYSTEMTIME; //定义的时间类型 SYSTEMTIME CurrentTime;
//********************************** //实时时钟写入一字节(内部函数)
43
附 录
//********************************** void DS1302InputByte(uchar d) {
uchar i; ACC = d;
for(i=8; i>0; i--) {
DS1302_IO = ACC0; //相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } }
//************************************* //实时时钟读取一字节(内部函数)
//************************************* uchar DS1302OutputByte(void) {
uchar i;
for(i=8; i>0; i--) {
ACC = ACC >>1; //相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; }
return(ACC); }
//************************************** //ucAddr: DS1302地址, ucData: 要写的数据 //************************************** void Write1302(uchar ucAddr, uchar ucDa) {
DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); // 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; }
//************************************** //读取DS1302某地址的数据
//************************************** uchar Read1302(uchar ucAddr) {
uchar ucData; DS1302_RST = 0; DS1302_CLK = 0;
44