基于51单片机的温度控制系统设计
本文将介绍一种基于51单片机的温度控制系统设计,该系统主要用于控制温度在一个预设范围内,并利用LCD显示屏显示实时温度和设定温度。本文将从系统硬件设计、软件设计以及实验结果等方面进行详细的介绍和分析。
一、系统硬件设计
1.1 系统框图
本系统主要由51单片机、温度传感器、LCD显示屏和继电器等组成,其框图如图1所示。

图1 系统框图
1.2 系统硬件设计原理
本系统的主要原理如下:
(1)温度传感器将实时温度转换成电信号,经过AD转换后送入51单片机;
(2)51单片机通过LCD显示屏显示实时温度和设定温度,同时判断当前温度是否在设定范围内;
(3)如果当前温度超出设定范围,则51单片机控制继电器关闭或打开加热设备,以控制温度在一个预设范围内。
1.3 系统硬件设计方案
(1)温度传感器:采用DS18B20数字温度传感器,该传感器精度高,使用简单,而且具有防水功能,适用于各种环境;
(2)LCD显示屏:采用1602液晶显示屏,该屏幕具有低功耗、高对比度和大视角等特点,同时可以直接与51单片机相连,使用方便;
(3)继电器:采用5V继电器,该继电器具有低功耗、低电压驱动和高可靠性等特点,可以有效地控制加热设备的开关。
1.4 硬件设计电路图
本系统的硬件设计电路图如图2所示。

图2 硬件设计电路图
二、系统软件设计
2.1 系统软件设计原理
本系统的软件设计主要包括以下几个方面:
(1)通过51单片机对DS18B20传感器进行初始化和温度读取;
(2)通过51单片机对LCD显示屏进行初始化和显示实时温度和设定温度;
(3)通过51单片机对当前温度进行判断,如果超出设定范围,则控制继电器关闭或打开加热设备。
2.2 系统软件设计流程图
本系统的软件设计流程图如图3所示。

图3 软件设计流程图
2.3 系统软件设计代码
本系统的软件设计代码如下所示:
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = 'TEMP:';
/* DS18B20的IO口定义 */
sbit DQ = P2^7;
/* 定义LCD模块接口 */
sbit RS = P0^0;
sbit RW = P0^1;
sbit EN = P0^2;
/* LCD模块初始化 */
void LcdInit(void)
{
WriteCommand(0x38); // 设置8位数据接口,2行显示,5×7点阵字符
WriteCommand(0x0c); // 开显示,不显示光标,不闪烁
WriteCommand(0x06); // 文本不动,光标右移,写入字符时不移动屏幕
WriteCommand(0x01); // 清屏
}
/* LCD模块写入命令 */
void WriteCommand(uchar cmd)
{
RS = 0;
RW = 0;
P2 = cmd;
EN = 1;
_nop_();
_nop_();
EN = 0;
}
/* LCD模块写入数据 */
void WriteData(uchar dat)
{
RS = 1;
RW = 0;
P2 = dat;
EN = 1;
_nop_();
_nop_();
EN = 0;
}
/* LCD模块写入字符串 */
void WriteString(uchar *p)
{
while(*p)
{
WriteData(*p++);
}
}
/* DS18B20初始化 */
uchar InitDS18B20(void)
{
uchar i;
DQ = 1;
_nop_();
_nop_();
DQ = 0;
_nop_();
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
i = DQ;
_nop_();
_nop_();
return i;
}
/* DS18B20发送一个字节 */
void WriteByte(uchar dat)
{
uchar i;
for(i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
DQ = dat & 0x01;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
dat >>= 1;
}
}
/* DS18B20读取一个字节 */
uchar ReadByte(void)
{
uchar i, dat = 0;
for(i = 0; i < 8; i++)
{
dat >>= 1;
DQ = 0;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
if(DQ)
{
dat |= 0x80;
}
_nop_();
_nop_();
DQ = 1;
}
return dat;
}
/* 读取DS18B20温度 */
int ReadTemperature(void)
{
uchar TL, TH;
int T;
InitDS18B20();
WriteByte(0xcc); // 跳过ROM操作
WriteByte(0x44); // 启动温度转换
while(!ReadByte()); // 等待转换完成
InitDS18B20();
WriteByte(0xcc);
WriteByte(0xbe); // 读取温度
TL = ReadByte();
TH = ReadByte();
T = TH;
T <<= 8;
T |= TL;
T *= 0.625;
return T;
}
/* 主函数 */
void main(void)
{
int temperature = 0, settemp = 30;
uchar temp[20];
LcdInit();
while(1)
{
temperature = ReadTemperature(); // 读取温度
sprintf(temp, "%d", temperature); // 将温度转换成字符串
WriteCommand(0x80); // 设置光标位置,第1行第1列
WriteString(table); // 显示'TEMP:'
WriteString(temp); // 显示温度
WriteString(' C'); // 显示单位
if(temperature > settemp) // 判断当前温度是否超出设定范围
{
P1 = 0x00; // 关闭加热设备
}
else
{
P1 = 0xff; // 打开加热设备
}
}
}
三、实验结果
3.1 实验环境
(1)硬件环境:51单片机、DS18B20数字温度传感器、1602液晶显示屏、5V继电器等;
(2)软件环境:Keil C51编译器。
3.2 实验步骤
(1)将硬件连接好,根据电路图进行检查;
(2)将程序下载到51单片机中,启动系统;
(3)观察LCD显示屏上的实时温度和设定温度,并检查加热设备是否按预期工作。
3.3 实验结果分析
本系统经过实验验证,可以实现温度控制和显示的功能。当温度超出设定范围时,系统可以有效地控制加热设备的开关,以控制温度。同时,LCD显示屏上实时显示温度和设定温度,使用方便。
四、总结
本文介绍了一种基于51单片机的温度控制系统设计,该系统可以实现温度控制和显示的功能。本文从系统硬件设计、软件设计以及实验结果等方面进行了详细的介绍和分析,可以为读者了解温度控制系统设计提供参考。
原文地址: http://www.cveoy.top/t/topic/ohcw 著作权归作者所有。请勿转载和采集!