DHT11对时钟要求特别高,以下两个程序
前者时钟是221184MHz;
后者是110592MHz,请注意区分
DHT11使用范例
单片机:AT89S52或STC89C52RC
功能:串口发送温湿度数据晶振221184M
i
cludereg52hIO口定义区sbitP2_0P20
定义区
u
sig
edcharU8FLAG0U8temp0
u
sig
ed
char
U8T_data_H0U8T_data_L0U8RH_data_H0U8RH_data_L0U8checkdata0
u
sig
edcharstr5
voidDelay2u
sig
edi
tj
u
sig
edi
ti
forj0j
fori0i150i
voidDelay_10usvoid
u
sig
edifori16i0i
u
sig
edcharCOMvoid
fu
sig
edchariU8comdata
fori0i8i
U8FLAG2whileP2_0U8FLAG
Delay_10usDelay_10usDelay_10usU8temp0ifP2_0U8temp1U8FLAG2whileP2_0U8FLAG超时则跳出for循环ifU8FLAG1break判断数据位是0还是1
如果高电平高过预定0高电平值则数据位为1
U8comdata1
U8comdataU8temp
0
rof
retur
U8comdata
湿度读取子程序以下变量均为全局变量温度高8位U8T_data_H温度低8位U8T_data_L湿度高8位U8RH_data_H湿度低8位U8RH_data_L校验8位U8checkdata调用相关子程序如下DelayDelay_10usCOM
voidRHvoid
u
sig
ed
char
U8T_data_H_tempU8T_data_L_tempU8RH_data_H_tempU8RH_data_L_tempU8c
heckdata_temp
f主机拉低18ms
P2_00
Delay2180
P2_01
总线由上拉电阻拉高主机延时20us
Delay_10us
Delay_10us
Delay_10us
Delay_10us
主机设为输入判断从机响应信号
P2_01
判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
ifP2_0
T
U8FLAG2
判断从机是否发出80us的低电平响应信号是否结束
whileP2_0U8FLAG
U8FLAG2
判断从机是否发出80us的高电平,如发出则进入数据接收状态
whileP2_0U8FLAG
数据接收状态
U8RH_data_H_tempCOM
U8RH_data_L_tempCOM
U8T_data_H_tempCOMU8T_data_L_tempCOMU8checkdata_tempCOM
P2_01数据校验
U8tempU8T_data_H_tempU8T_data_L_tempU8RH_data_H_tempU8RH_data_L_temp
ifU8tempU8checkdata_temp
U8RH_data_HU8RH_data_H_tempU8RH_data_LU8RH_data_L_tempU8T_data_HU8T_data_H_tempU8T_data_LU8T_data_L_tr