15295872993 15295872993
关注数: 5 粉丝数: 79 发帖数: 636 关注贴吧数: 30
关于温湿度传感器DHT11的数据读取问题,请大神帮看看程序吧 #ifndef __dht11_H__ #define __dht11_H__ typedef unsigned char unint8; typedef unsigned char unint16; unsigned char str1[4]; sbit DATA= P3^2;//温湿度传感器DHT11数据接入 unint8 TH_data,TL_data,RH_data,RL_data,CK_data; unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp; unint8 com_data,untemp,temp; unint8 respond; /*********************************************************************************/ void delayNOP() { _nop_(); _nop_(); _nop_(); _nop_(); } /*********************************************************************************/ /*********************************************************************************/ // 毫秒级延时子程序 /*********************************************************************************/ void delay_ms(unsigned char ms) { unsigned char i; while(ms--) { for(i = 0; i< 150; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } /*********************************************************************************/ /*********************************************************************************/ //5us级延时程序 /*********************************************************************************/ void delay_us() { unint8 i; i--; i--; i--; i--; i--; i--; } /****************************************************************************/ //收发信号检测,数据读取 /****************************************************************************/ char receive() { unint8 i; //ST=0; com_data=0; for(i=0;i<=7;i++) { respond=2; while((!DATA)&&respond++); delay_us(); delay_us(); delay_us(); if(DATA) { temp=1; respond=2; while((DATA)&&respond++); } else temp=0; com_data<<=1; com_data|=temp; } return(com_data); } /****************************************************************************/ /****************************************************************************/ //湿度读取子程序 //湿度高8位== RH_data //湿度低8位== RH_data //校验 8位 == CK_data //调用的程序有 delay();, Delay_5us();,RECEIVE(); /***************************************************************************/ void read_DATA() { //主机拉低18ms DATA=0; delay_ms(18); DATA=1; //DATA总线由上拉电阻拉高 主机延时20us delay_us(); delay_us(); delay_us(); delay_us(); delay_us(); delay_us();delay_us();delay_us();delay_us(); //主机设为输入 判断从机响应信号 DATA=1; //判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!DATA) { respond=2; //判断DHT11发出 80us 的低电平响应信号是否结束 while((!DATA)&& respond++); respond=2; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while(DATA&& respond++); //数据接收状态 RH_temp = receive(); RL_temp = receive(); TH_temp = receive(); TL_temp = receive(); CK_temp = receive(); DATA=1;//ST=1; //数据校验 untemp=(RH_temp+RL_temp+TH_temp+TL_temp); if(untemp==CK_temp) { RH_data = RH_temp; RL_data = RL_temp; TH_data = TH_temp; TL_data = TL_temp; CK_data = CK_temp; } } //湿度整数部分 str1[0] = (char)(0X30+RH_data/10); str1[1] = (char)(0X30+RH_data%10); str1[2] = 0x2e; //小数点 //湿度小数部分 str1[3] =(char)(0X30+RL_data/10); void main() 显示程序,位置什么的都设定好了,主要是以上程序问题 { uchar i; delay(100); //上电,等待稳定 lcd_pos(3,3); //室外湿度 read_DATA(); for(i=0;i<4;i++) { lcd_wdat(str1[i]); } }
1 下一页