基于51单片机的智能温控器设计与实现
一、前言
基于51单片机的智能温控器,使用DS18B20温度传感器来测量温度,并通过驱动风扇降温,同时使用LCD1602显示屏显示当前温度和设定温度。
二、51单片机代码
#include <reg52.h>
//显示
#include <lcd.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P2^7; // 温度传感器引脚
sbit fan = P3^3; // 风扇
sbit LED = P3^5; // LED指示灯
sbit Key4 = P2^1; // 开机/关机键
uchar Mode = 0; // 0表示确定状态,1表示设置温度上限状态,2表示设置温度下限状态
uchar MODE_OK = 0;
uchar MODE_SET_TEMP_UP = 1;
uchar MODE_SET_TEMP_DOWN = 1;
uint dat = 0; // 温度值
// 温度
char wendu;
uchar down =30; //温度下限
uchar wendu_up =50; //温度上限
uchar status_machine = 1;
uchar status_shutdown = 1; // 关机
uchar status_power_on = 2; // 开机
// 初始化温度传感器
void init_ds18b20() {
uint i;
DQ = 0; // 拉低电平
i = 80; // 延时约732us
while(i > 0)
i--;
DQ = 1; // 拉高总线
i = 4; // 延时约40us
while(i > 0)
i--;
}
// 读取一位温度传感器的数据
bit read_bit() {
uint i;
bit dat;
DQ = 0;
i++; // 延时
DQ = 1;
i++; // 延时
i++;
dat = DQ;
i = 8;
while(i > 0)
i--;
return dat;
}
// 读取一个字节温度传感器的数据
uchar read_byte() {
uchar i, j, dat;
dat = 0;
for (i = 1; i <= 8; i++) {
j = read_bit();
dat = (j << 7) | (dat >> 1);
}
return dat;
}
// 向温度传感器写入一个字节
void write_byte(uchar dat) {
uint i;
uchar j;
bit testbit;
for (j = 1; j <= 8; j++) {
testbit = dat & 0x01;
dat = dat >> 1;
if (testbit) {
DQ = 0;
i++; // 延时
DQ = 1;
i = 8; // 延时
while(i > 0)
i--;
} else {
DQ = 0;
i = 8;
while(i > 0)
i--;
DQ = 1;
i++; // 延时
i++;
}
}
}
// 读取温度
unsigned int read_temperature(void) {
uchar a = 0;
uchar b = 0;
uint u_temp = 0;
float f_temp = 0;
init_ds18b20();
delay(1);
write_byte(0xCC); //跳过读序号列号的操作
write_byte(0x44); //启动温度转换
init_ds18b20();
delay(1);
write_byte(0xCC); //跳过读序号列号的操作
write_byte(0xBE); //读取温度寄存器
a = read_byte(); //读低8位
b = read_byte(); //读高8位
u_temp = b;
u_temp <<= 8;
u_temp = u_temp | a;
f_temp = u_temp * 0.0625; // 获取实际温度
u_temp = f_temp * 10;
return u_temp;
}
// 按键控制
void Key() {
// 开机/关机键
if(Key4 == 0)
{
while(Key4 == 0);
// 如果是关机状态
if (status_machine == status_shutdown)
{
// 开机
status_machine = status_power_on;
}
// 如果是开机状态
else if (status_machine == status_power_on)
{
// 关机
status_machine = status_shutdown;
}
}
}
// 主函数
void main() {
init_lcd(); // 初始化lcd1602
init_ds18b20(); // 初始化ds18b20
// 第一次读取温度
read_temperature();
delay(2000);
while(1) {
// 获取温度
dat = read_temperature();
if (Mode == MODE_OK) {
// 水温显示在液晶显示屏上
display(dat, wendu_up, down);
wendu = dat / 10; // 取温度值得整数位
}
// 按键控制
Key();
// 判断当前机器状态
// 如果是要关机
if (status_machine == status_shutdown)
{
LED = 1;
fan = 1;
}
// 如果是开机状态
else if (status_machine == status_power_on)
{
// 如果当前温度小于温度上限
if (wendu < wendu_up)
{
fan = 1;
LED = 1;
}
else
{
fan = 0;
LED = 0;
}
}
}
}
三、Proteus仿真
四、完整资料下载
基于51单片机的智能温控器: https://url83.ctfile.com/d/45573183-65297122-ca5848?p=7526 (访问密码: 7526)