一、前言
基于51单片机的智能温控器,使用DS18B20温度传感器来测量温度,并通过驱动风扇降温,同时使用LCD1602显示屏显示当前温度和设定温度。
二、51单片机代码
#include <reg52.h>
//显示
#include <lcd.h>#define uchar unsigned char
#define uint unsigned intsbit 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; // 延时约732uswhile(i > 0)i--;DQ = 1; // 拉高总线i = 4; // 延时约40uswhile(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(); // 初始化lcd1602init_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)