本文将介绍一种基于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单片机的温度控制系统设计,该系统可以实现温度控制和显示的功能。本文从系统硬件设计、软件设计以及实验结果等方面进行了详细的介绍和分析,可以为读者了解温度控制系统设计提供参考。

基于51单片机的温度控制系统设计

原文地址: http://www.cveoy.top/t/topic/ohcw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录