dht11测量温度的单片机代码
时间: 2023-05-28 20:05:52 浏览: 141
以下是DHT11测量温度的单片机代码:
```
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define DHT11_PORT P2
sbit DHT11_IO = P2^0;
uchar code DHT11_RLT[5]; // DHT11返回的数据
uchar DHT11_CHK; // 校验和
/* 延时函数 */
void Delay_us(uint us){
while(us--){
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/* DHT11初始化 */
void DHT11_Init(){
DHT11_IO = 1; // 置高电平
Delay_us(30);
DHT11_IO = 0; // 拉低20ms
Delay_us(20000);
DHT11_IO = 1; // 置高电平
Delay_us(30);
}
/* 读取DHT11返回的数据 */
uchar DHT11_ReadByte(){
uchar i, dat;
dat = 0;
for(i=0; i<8; i++){
while(DHT11_IO == 0); // 等待高电平
Delay_us(30); // 等待30us
if(DHT11_IO == 1){
dat |= (1 << (7-i)); // 读取数据
}
while(DHT11_IO == 1); // 等待低电平
}
return dat;
}
/* 读取DHT11数据 */
uchar DHT11_ReadData(){
uchar i;
DHT11_Init(); // 初始化DHT11
while(DHT11_IO == 1); // 等待DHT11响应
Delay_us(80); // 延时80us
if(DHT11_IO == 0){
while(DHT11_IO == 0); // 等待DHT11发出数据
for(i=0; i<5; i++){
DHT11_RLT[i] = DHT11_ReadByte(); // 读取数据
}
DHT11_CHK = DHT11_RLT[0] + DHT11_RLT[1] + DHT11_RLT[2] + DHT11_RLT[3]; // 计算校验和
if(DHT11_CHK == DHT11_RLT[4]){ // 校验和正确
return 1;
}
else{ // 校验和错误
return 0;
}
}
else{ // 未接收到DHT11数据
return 0;
}
}
/* 主函数 */
void main(){
uchar i;
while(1){
if(DHT11_ReadData()){ // 读取DHT11数据成功
printf("湿度=%d.%d%% 温度=%d.%d℃\n", DHT11_RLT[0], DHT11_RLT[1], DHT11_RLT[2], DHT11_RLT[3]); // 显示数据
}
else{ // 读取DHT11数据失败
printf("读取DHT11数据失败!\n");
}
for(i=0; i<50; i++){ // 延时一段时间
Delay_us(10000);
}
}
}
```