基于51单片机设计的温度检测与高低温报警系统仿真设计

演示视频

基于51单片机设计的温度检测与高低温报警系统仿真

系统功能简介

1、实时温度测量,可调整温度值
2、显示测量的温度值,按键切换可查看高温和低温报警值
3、可通过按键输入报警最高值以及最低值,通过两个LED指示灯指示当前设置状态指示
4、当温度大于报警最高值或温度低于报警最低值时进行LED和蜂鸣器声光报警。

注:单片机芯片是通用的,无论51还是52、无论STC还是AT都一样,引脚功能都是一样的,程序也是一样的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。

目录

1. 引言

2. 硬件电路设计

2.1 AT89C51 单片机

2.2 DS18B20 温度传感器

2.3 显示模块

2.4 报警模块

2.5 电路原理图

3. 软件设计

3.1 温度传感器初始化函数

3.2 读取 DS18B20 温度值

3.3 显示温度值

3.4 温度报警功能

3.5 按键扫描与处理

3.6 延时函数

3.7 主程序

 仿真&源码等系统完整资料下载链接


1. 引言

温度监测在工业和日常生活中有广泛的应用,特别是在冷链运输、仓库管理等对温度要求严格的场合。本系统利用DS18B20温度传感器和AT89C51单片机,实现了实时温度监测及超限报警功能。本文将详细描述硬件电路设计和各个功能模块的程序设计。

2. 硬件电路设计

2.1 AT89C51 单片机

AT89C51 是一个功能强大的 8 位单片机,具有丰富的 I/O 端口和外围设备接口。在本系统中,AT89C51 用于读取温度传感器的数据、显示温度并控制报警装置。

2.2 DS18B20 温度传感器

DS18B20 是一种数字温度传感器,具有高精度和易于使用的特点。它通过单总线与单片机连接,能够提供精确的温度读数。

2.3 显示模块

本系统采用 LED 显示器显示温度值。通过多路复用技术,使用少量的 I/O 端口实现对多个数码管的控制。

2.4 报警模块

报警模块包括 LED 指示灯和蜂鸣器。当温度超过设定的高温或低温报警值时,LED 灯闪烁,蜂鸣器发出警报声。

2.5 电路原理图

电路原理图如下所示:

  • AT89C51 单片机连接 DS18B20 传感器
  • 数码管通过 P0 端口连接显示模块
  • LED 指示灯和蜂鸣器分别连接 P1.6 和 P1.7 端口
  • 按键通过 P1 端口连接,用于温度设置

3. 软件设计

3.1 温度传感器初始化函数

初始化 DS18B20 温度传感器,确保其进入工作状态。

void Init_DS18B20(void) {
    unsigned char x = 0;
    DQ = 1;
    Delay_DS18B20(8);
    DQ = 0;
    Delay_DS18B20(80);
    DQ = 1;
    Delay_DS18B20(14);
    x = DQ;
    Delay_DS18B20(20);
}

3.2 读取 DS18B20 温度值

读取 DS18B20 传感器的温度数据,并进行相应的转换。

unsigned int ReadTemperature(void) {
    unsigned char a, b;
    int t = 0;
    float tt = 0.0;

    Init_DS18B20();
    WriteOneChar(0xCC);
    WriteOneChar(0x44);
    Init_DS18B20();
    WriteOneChar(0xCC);
    WriteOneChar(0xBE);

    a = ReadOneChar();
    b = ReadOneChar();
    t = b;
    t <<= 8;
    t |= a;
    tt = t * 0.0625 * 10;
    tt += 0.05;
    return (unsigned int)tt;
}

3.3 显示温度值

将读取到的温度值显示在 LED 显示器上。

void Disp_Temperature(void) {
    P0 = ~0x98;
    P2 = 0x7F;
    Delay(100);
    P2 = 0xff;

    P0 = ~LEDData[n];
    P2 = 0xDF;
    Delay(100);
    P2 = 0xff;

    P0 = ~LEDData[m % 10];
    DIAN = 0;
    P2 = 0xF7;
    Delay(100);
    P2 = 0xff;

    P0 = ~LEDData[m / 10];
    P2 = 0xFD;
    Delay(100);
    P2 = 0xff;
}

3.4 温度报警功能

当温度超出设定的高温或低温阈值时,触发报警装置。

void check_wendu(void) {
    char tempStr[16];
    unsigned int c = ReadTemperature();
    if (c >= 0) {
        sprintf(tempStr, "%u.%u", c / 10, c % 10);
    } else {
        sprintf(tempStr, "-%u.%u", (unsigned int)(-c) / 10, (unsigned int)(-c) % 10);
    }
    LCD_DisplayString(tempStr);

    if(c >= gaowen || c <= diwen) {
        LED = 0;
        BEEP = 0;
    } else {
        LED = 1;
        BEEP = 1;
    }
}

3.5 按键扫描与处理

扫描按键状态并处理按键输入,用于温度设置和其他功能的实现。

void KeyScan() {
    static uchar keybuf[4] = {0xFF, 0xFF, 0xFF, 0xFF};
    uchar i;
    keybuf[0] = (keybuf[0] << 1) | KEY1;
    keybuf[1] = (keybuf[1] << 1) | KEY2;
    keybuf[2] = (keybuf[2] << 1) | KEY3;
    keybuf[3] = (keybuf[3] << 1) | KEY4;
    for(i = 0; i < 4; i++) {
        if(keybuf[i] == 0x00)
            keystr[i] = 0;
        else if(keybuf[i] == 0xFF)
            keystr[i] = 1;
    }
}

void KeyAction(uchar key) {
    switch(key) {
        case 0:
            if(display_mode == 0) {
                display_mode = 1;
                LED_SET_HIGHT = 0;
                LED_SET_LOW = 1;
            } else if(display_mode == 1) {
                display_mode = 2;
                LED_SET_HIGHT = 1;
                LED_SET_LOW = 0;
            } else {
                display_mode = 0;
                LED_SET_HIGHT = 1;
                LED_SET_LOW = 1;
            }
            break;
        case 1:
            gaowen++;
            break;
        case 2:
            diwen++;
            break;
        case 3:
            gaowen--;
            break;
        case 4:
            diwen--;
            break;
    }
}

3.6 延时函数

提供各种延时功能,用于在数据传输和显示刷新时控制时间。

void Delay(uint num) {
    while(--num);
}

void Delay_DS18B20(int num) {
    while(num--);
}

3.7 主程序

主程序中,初始化单片机、温度传感器和显示模块,进入主循环,实时读取温度值并根据设置的高温和低温报警值进行判断,控制显示和报警。

void main(void) {
    P1 = 0xFF;
    P2 = 0xFF;
    LED = 1;
    BEEP = 1;
    Disp_init();
    while(1) {
        KeyScan();
        check_wendu();
        switch(display_mode) {
            case 0:
                Disp_Temperature();
                break;
            case 1:
                Disp_Temperature_Set_Hight();
                break;
            case 2:
                Disp_Temperature_Set_Low();
                break;
        }
    }
}

 仿真&源码等系统完整资料下载链接

基于51单片机设计的温度检测与高低温报警系统仿真&源码&设计文档&演示视频.zip(毕设/课设/竞赛/实训/大作业/项目开发)资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/m0_61712829/89623235

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部