DHT11数据显示不正常,显示的数据值跟实际值相差很大,有没大神帮忙看看是不是数据解析的是错了
//ICC-AVR application builder : 2008-4-28 9:22:37
// Target : M8
// Crystal: 8.0000Mhz
/*************************************************************************
程序:ICC-AVR
功能:波特率9600 串口发送温湿度数据
数据格式:湿度 温度 校验和
例如串口发送数据 59 00 24 00 53 则湿度为59 温度为24 校验和为53
公司:DHT11
芯片:M8
晶振:外部 7.3728Mhz
创建人:
创建时间:09.06.18
修改人:
修改时间:
修改原因:
**************************************************** **********************/
#include <iom16v.h>
#include <macros.h>
#include "1602.h"
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
/**************************************************************************
I/O空间定义
***************************************************************************/
// B0_IN DDRB &= ~(1 << PB0) /*设置输入*/
// B0_OUT DDRB |= (1 << PB0) /*设置输出*/
// B0_CLR PORTB &= ~(1 << PB0) /*置低电平*/
// B0_SET PORTB |= (1 << PB0) /*置高电平*/
// B0_R PINB & (1 <<PB0) /*读了电平*/
#define C4_IN DDRC &= ~(1 << PC4) /*设置输入*/
#define C4_OUT DDRC |= (1 << PC4) /*设置输出*/
#define C4_CLR PORTC &= ~(1 << PC4) /*置低电平*/
#define C4_SET PORTC |= (1 << PC4) /*置高电平*/
#define C4_R PINC & (1 <<PC4) /*读了电平*/
/**************************************************************************
通讯I/O空间定义
***************************************************************************/
#define COM_IN C4_IN
#define COM_OUT C4_OUT
#define COM_CLR C4_CLR
#define COM_SET C4_SET
#define COM_R C4_R
/**************************************************************************
全局变量定义区
***************************************************************************/
U8 i;
U8 U8FLAG,k;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
U16 ReceiveHighByte;
U16 ReceiveLowByte;
/**************************************************************************
***************************************************************************/
void DelaymS (U16 dly)
{
U16 i;
for ( ; dly>0; dly--)
{
WDR();
for (i=0; i<1032; i++);
}
}
void Delay_10us(void)
{
U8 i;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;
}
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!(COM_R))&&U8FLAG++);
if(U8FLAG==1)break;
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(COM_R)U8temp=1;
U8FLAG=2;
while((COM_R)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}//rof
}
//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
void RH(void)
{
//主机拉低18ms
COM_OUT;
COM_CLR;
DelaymS(18);
COM_IN;
COM_SET;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
//P2_0=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
// if(!P2_0) //T !
if(COM_R)U8FLAG=1;
while(!(COM_R))
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
//while((!P2_0)&&U8FLAG++);
while((!(COM_R))&&U8FLAG++);
if(U8FLAG==1)break;
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
//while((P2_0)&&U8FLAG++);
while((COM_R)&&U8FLAG++);
if(U8FLAG==1)break;
//数据接收状态
COM();
if(U8FLAG==1)break;
U8T_data_H_temp=U8comdata;
COM();
if(U8FLAG==1)break;
U8T_data_L_temp=U8comdata;
COM();
if(U8FLAG==1)break;
U8RH_data_H_temp=U8comdata;
COM();
if(U8FLAG==1)break;
U8RH_data_L_temp=U8comdata;
COM();
if(U8FLAG==1)break;
U8checkdata_temp=U8comdata;
break;
}//while
//P2_0=1;
COM_IN;
COM_SET;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8T_data_H_temp;
U8RH_data_L=U8T_data_L_temp;
U8T_data_H=U8RH_data_H_temp;
U8T_data_L=U8RH_data_L_temp;
U8checkdata=U8checkdata_temp;
}//fi
COM_IN;
COM_SET;
}
void main(void)
{
U8 RH_data_H1,RH_data_H2,RH_data_H3;
U8 TH_data_H1,TH_data_H2,TH_data_H3;
U8 check1,check2,check3;
LCD_IO_Init();
COM_IN;
COM_SET;
while(1)
{
//读DHT11
RH();
//把DHT11的十六进制数据转换成10进制
//格式 湿度 温度 校验和
//例如串口发送数据 59 00 24 00 53 则湿度为59 温度为24 校验和为53
U8temp=U8RH_data_H/10;
U8temp<<=4;
U8temp|=U8RH_data_H%10;
U8RH_data_H=U8temp;
RH_data_H1=U8RH_data_H/100;
RH_data_H2=U8RH_data_H%100/10;
RH_data_H3=U8RH_data_H%100%10;
LCD_Write_Cmd(0x80);
LCD_Write_Data(RH_data_H1+0x30);
LCD_Write_Data(RH_data_H2+0x30);
LCD_Write_Data(RH_data_H3+0x30);
DelaymS (70) ;
U8temp=U8T_data_H/10;
U8temp<<=4;
U8temp|=U8T_data_H%10;
U8T_data_H=U8temp;
TH_data_H1=U8T_data_H/100;
TH_data_H2=U8T_data_H%100/10;
TH_data_H3=U8T_data_H%100%10;
LCD_Write_Cmd(0x84);
LCD_Write_Data(TH_data_H1+0x30);
LCD_Write_Data(TH_data_H2+0x30);
LCD_Write_Data(TH_data_H3+0x30);
DelaymS (70) ;
check1=U8checkdata/100;
check2=U8checkdata%100/10;
check3=U8checkdata%100%10;
LCD_Write_Cmd(0x88);
LCD_Write_Data( check1+0x30);
LCD_Write_Data(check2+0x30);
LCD_Write_Data(check3+0x30);
DelaymS (70) ;
}
}
此帖出自
小平头技术问答
2.对照DATASHEET的 相关时序,确认下程序中的 时延
3.你的DHT11的接法如何
一周热门 更多>