}
shi=dat/10; ge=dat;
write_com(0x98+add); write_dat(0x30+shi); write_dat(0x30+ge);
/*温度显示子函数*/
void write_tem(uchar add) { write_com(0x88+add); write_dat(tab[4]); write_dat(tab[5]); write_dat(tab[6]); write_dat(tab[7]); }
/*湿度显示子函数*/
void write_hum(uchar add) { write_com(0x98+add); write_dat(tab[0]); write_dat(tab[1]); write_dat(tab[2]); write_dat(tab[3]); }
void COM(void) { U8 i; for(i=0;i<8;i++) { U8FLAG=2; while((!AM2301)&&U8FLAG++); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0; if(AM2301)U8temp=1; U8FLAG=2; while((AM2301)&&U8FLAG++); //超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1 U8comdata<<=1; U8comdata|=U8temp; } }
/***温湿度读取子函数***/ void RH(void) {
//主机拉低18ms AM2301=0; Delay2(180); AM2301=1;
//总线由上拉电阻拉高 主机延时40us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us();
//主机设为输入 判断从机响应信号 AM2301=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!AM2301) //T ! { U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束 while((!AM2301)&&U8FLAG++); U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while((AM2301)&&U8FLAG++); //数据接收状态 COM();
U8RH_data_H_temp=U8comdata; COM();
U8RH_data_L_temp=U8comdata; COM();
U8T_data_H_temp=U8comdata; COM();
U8T_data_L_temp=U8comdata; COM();
U8checkdata_temp=U8comdata; AM2301=1; //数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp
); }
if(U8temp==U8checkdata_temp) if(1) {
U8RH_data_H = U8RH_data_H_temp;//湿度 U8RH_data_L = U8RH_data_L_temp; U16temp1 = U8RH_data_H; U16temp1 <<= 8;
U16temp1 |= U8RH_data_L;//获得完整的湿度 tab[0]=U16temp1/100+0x30; //湿度百位 tab[1]=U16temp10/10+0x30;//湿度十位 tab[3]=U16temp1+0x30; //湿度个位 U8T_data_H = U8T_data_H_temp;//温度 U8T_data_L = U8T_data_L_temp; U16temp2 = U8T_data_H; U16temp2<<=8;
U16temp2 |= U8T_data_L;//获得完整的温度 tab[4]=U16temp2/100+0x30;//温度百位 tab[5]=U16temp20/10+0x30;//温度十位 tab[7]=U16temp2+0x30;//温度个位 U8checkdata=U8checkdata_temp;//校验位 } }
/*******主界面显示*********/ void display1() {
uchar i; init();
/***从第一行第一个字符的位置开始显示***/ lcd_pos(0,0); i=0; while(dis1[i]!='\\0') { write_dat(dis1[i]); i++; }
/***从第二行第一个字符的位置开始显示***/ lcd_pos(1,0); i=0; while(dis2[i]!='\\0')
{ }
write_dat(dis2[i]); i++;
/***从第三行第一个字符的位置开始显示***/ lcd_pos(2,0); i=0; while(dis3[i]!='\\0') { write_dat(dis3[i]); i++; } /***从第四行第一个字符的位置开始显示***/ lcd_pos(3,0); i=0; while(dis4[i]!='\\0') { write_dat(dis4[i]); i++; } }
/*****温湿度上下限及报警开关设置界面***********/ void display2() {
uchar i; init(); /***从第一行第一个字符的位置开始显示***/ lcd_pos(0,0); i=0; while(dis5[i]!='\\0') { write_dat(dis5[i]); i++; } write_lim1(5,temp_H); write_dat(0x2e); write_dat(0x30); if(flag3) { write_com(0x80+7); write_dat(0xbf); write_dat(0xaa); }