温湿度控制器有上下键和设置键可设置温度湿度上限控制继电器输出的C51例程
时间: 2024-02-29 16:53:23 浏览: 31
以下是一个基于C51单片机的温湿度控制器的例程,可通过上下键和设置键设置温度湿度上限,并控制继电器输出。
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; // 数码管显示0-9的编码表
sbit DHT11 = P1^0; // 温湿度传感器引脚
sbit DHT11_OUT = P1^0;
sbit RELAY = P1^1; // 继电器引脚
uchar TH = 30; // 温度上限
uchar HU = 60; // 湿度上限
uchar dis[3] = {0, 0, 0}; // 三个数码管要显示的数字
void delay(uint ms) // 延时函数
{
uint i, j;
for(i = ms; i > 0; i--)
for(j = 114; j > 0; j--);
}
void send_start_signal(void) // 发送起始信号
{
DHT11_OUT = 0; // 主机将总线拉低,发送起始信号
delay(20); // 延时20ms
DHT11_OUT = 1; // 主机将总线拉高,等待DHT11响应
while(DHT11);
while(!DHT11);
while(DHT11);
}
uchar read_byte(void) // 读取一个字节
{
uchar i, dat = 0;
for(i = 0; i < 8; i++) // 读取8位数据
{
while(!DHT11);
delay(30);
if(DHT11) // 高电平表示1,低电平表示0
dat |= 1 << (7-i);
while(DHT11 == 1);
}
return dat;
}
void read_dht11_data(void) // 读取温湿度数据
{
uchar dht11_data[5] = {0};
uchar i, check_sum = 0;
send_start_signal(); // 发送起始信号
for(i = 0; i < 5; i++)
dht11_data[i] = read_byte(); // 读取5个字节数据
check_sum = dht11_data[0] + dht11_data[1] + dht11_data[2] + dht11_data[3];
if(check_sum == dht11_data[4]) // 校验数据是否正确
{
dis[0] = dht11_data[0] / 10; // 显示温度的十位数
dis[1] = dht11_data[0] % 10; // 显示温度的个位数
dis[2] = dht11_data[2] / 10; // 显示湿度的十位数
}
}
void display(void) // 数码管显示函数
{
uchar i;
uchar code display_pos[] = {0xfe, 0xfd, 0xfb}; // 数码管的位选信号
for(i = 0; i < 3; i++)
{
P2 = display_pos[i]; // 选择要显示的数码管
P0 = table[dis[i]]; // 显示数字
delay(10); // 延时10ms
P0 = 0x00; // 关闭数码管
}
}
void main()
{
uchar key = 0;
uchar temp = 0;
uchar humi = 0;
uchar i;
while(1)
{
read_dht11_data(); // 读取温湿度数据
display(); // 数码管显示温湿度
if(P3 == 0x7e) // 按下上键
{
key = 1;
delay(10);
if(P3 == 0x7e) // 等待按键松开
{
if(temp == 0) // 如果是第一次按下上键
{
TH++; // 温度上限加1
if(TH > 50) TH = 50; // 温度上限不能超过50度
temp = 1;
}
}
}
else if(P3 == 0xbd) // 按下下键
{
key = 1;
delay(10);
if(P3 == 0xbd) // 等待按键松开
{
if(temp == 0) // 如果是第一次按下下键
{
TH--; // 温度上限减1
if(TH < 0) TH = 0; // 温度上限不能小于0度
temp = 1;
}
}
}
else if(P3 == 0xe7) // 按下设置键
{
key = 1;
delay(10);
if(P3 == 0xe7) // 等待按键松开
{
if(humi == 0) // 如果是第一次按下设置键
{
HU++; // 湿度上限加1
if(HU > 100) HU = 100; // 湿度上限不能超过100%
humi = 1;
}
}
}
else
{
key = 0;
temp = 0;
humi = 0;
}
if(dis[0] > TH || dis[2] > HU) // 如果温度或湿度超过上限
RELAY = 0; // 继电器输出低电平
else
RELAY = 1; // 继电器输出高电平
}
}
```
该例程利用了C51单片机的PWM信号控制继电器输出高低电平,实现了温湿度控制器的功能。用户可以通过上下键和设置键来设置温度湿度上限,当温度或湿度超过上限时,继电器输出低电平,控制设备进行相应的处理。