基于51单片机的温湿度控制器代码
时间: 2023-12-12 11:01:57 浏览: 98
以下是基于51单片机的温湿度控制器代码:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DHT11_PIN = P2^0; //DHT11数据线接在P2.0口上
/* DHT11数据结构 */
typedef struct {
uchar humi_int; //湿度的整数部分
uchar humi_deci; //湿度的小数部分
uchar temp_int; //温度的整数部分
uchar temp_deci; //温度的小数部分
uchar check_sum; //校验和
} DHT11_DATA;
/* 延时函数 */
void delay(uint i) {
while(i--);
}
/* DHT11初始化 */
void DHT11_Init() {
DHT11_PIN = 1;
delay(1000);
}
/* 从DHT11读取数据 */
uchar DHT11_Read_Byte() {
uchar i, dat;
dat = 0;
for(i=0; i<8; i++) {
while(!DHT11_PIN); //等待DHT11拉低数据线
delay(30); //等待30us
if(DHT11_PIN) { //如果DHT11仍为高电平,表示数据为1
dat |= (1<<(7-i)); //将第i位设为1
while(DHT11_PIN); //等待DHT11拉低数据线
}
}
return dat;
}
/* 从DHT11读取温湿度数据 */
uchar DHT11_Read_Data(DHT11_DATA *dht) {
uchar i;
DHT11_Init(); //DHT11初始化
DHT11_PIN = 0; //主机拉低数据线
delay(18000); //等待18ms
DHT11_PIN = 1; //主机拉高数据线
delay(30); //等待30us
if(!DHT11_PIN) { //DHT11响应主机
while(!DHT11_PIN); //等待DHT11拉低数据线
delay(30); //等待30us
dht->humi_int = DHT11_Read_Byte(); //读取湿度的整数部分
dht->humi_deci = DHT11_Read_Byte(); //读取湿度的小数部分
dht->temp_int = DHT11_Read_Byte(); //读取温度的整数部分
dht->temp_deci = DHT11_Read_Byte(); //读取温度的小数部分
dht->check_sum = DHT11_Read_Byte(); //读取校验和
return 1; //读取成功
}
else {
return 0; //读取失败
}
}
/* 显示温湿度数据 */
void Show_DHT11_Data(DHT11_DATA *dht) {
uchar temp[5], humi[5];
temp[0] = dht->temp_int/10+'0'; //转换温度的十位数
temp[1] = dht->temp_int%10+'0'; //转换温度的个位数
temp[2] = '.'; //小数点
temp[3] = dht->temp_deci+'0'; //转换温度的小数部分
temp[4] = '\0'; //字符串结束符
humi[0] = dht->humi_int/10+'0'; //转换湿度的十位数
humi[1] = dht->humi_int%10+'0'; //转换湿度的个位数
humi[2] = '.'; //小数点
humi[3] = dht->humi_deci+'0'; //转换湿度的小数部分
humi[4] = '\0'; //字符串结束符
printf("Temperature: %s C, Humidity: %s%%\n", temp, humi); //输出温湿度数据
}
/* 温湿度控制器主函数 */
void main() {
DHT11_DATA dht;
while(1) {
if(DHT11_Read_Data(&dht)) { //读取温湿度数据成功
Show_DHT11_Data(&dht); //显示温湿度数据
if(dht.temp_int > 25) { //如果温度大于25度
P1 = 0x01; //开启风扇
}
else {
P1 = 0x00; //关闭风扇
}
}
delay(1000); //延时1s
}
}
```
该代码通过DHT11传感器读取温湿度数据,并根据温度控制风扇开关。在主函数中,先调用`DHT11_Read_Data()`函数从DHT11读取温湿度数据,如果读取成功,则调用`Show_DHT11_Data()`函数显示温湿度数据,并根据温度控制风扇开关。该代码需要连接DHT11传感器和风扇,并将P1口设置为输出。
阅读全文