基于51单片机的多路温度检测proteus仿真_ds18b20(仿真+程序+原理图) 仿真图proteus 7.8/proteus 8.9 程序编译器:keil 4/keil 5 编程语言:C语言 功能说明: 通过对多路DS18B20温度传感器的数据采集,实现8路/4路温度采集并将数值显示在LCD显示屏上; 通过按键设置温度报警值,逐个显示传感器的温度,当lcd显示温度超过设定值时,系统声光报警。

在电子制作与嵌入式系统学习中,温度检测是一个常见且实用的项目。今天就来聊聊基于51单片机,结合DS18B20温度传感器,实现多路温度检测并在LCD显示屏上显示,同时还具备温度报警功能的Proteus仿真项目。

一、仿真环境

本次仿真可以使用Proteus 7.8或者Proteus 8.9版本。这两款软件在电子电路仿真领域都非常受欢迎,能直观地模拟电路运行情况。

二、程序开发环境

程序编译器选择Keil 4或者Keil 5 ,编程语言为C语言。Keil系列软件在51单片机开发中应用广泛,其对C语言的支持良好,方便我们进行代码的编写、调试与编译。

三、功能实现

(一)多路温度采集

项目要实现8路或者4路温度采集,这里的核心就是DS18B20温度传感器。DS18B20是一款数字温度传感器,使用单总线协议与单片机通信,大大简化了电路设计。

基于51单片机的多路温度检测proteus仿真_ds18b20(仿真+程序+原理图) 仿真图proteus 7.8/proteus 8.9 程序编译器:keil 4/keil 5 编程语言:C语言 功能说明: 通过对多路DS18B20温度传感器的数据采集,实现8路/4路温度采集并将数值显示在LCD显示屏上; 通过按键设置温度报警值,逐个显示传感器的温度,当lcd显示温度超过设定值时,系统声光报警。

下面是一段读取DS18B20温度数据的核心代码:

// 初始化DS18B20
bit init_ds18b20(void)
{
    bit presence;
    DQ = 1;  // 拉高DQ线
    _nop_();
    _nop_();
    DQ = 0;  // 拉低DQ线,发出复位脉冲
    delay(500);  // 保持480us以上
    DQ = 1;  // 释放总线
    delay(60);  // 等待15 - 60us
    presence = DQ;  // 读取存在脉冲
    delay(450);  // 等待剩余时间
    return presence;  // 返回是否存在DS18B20
}

// 读取一个字节数据
unsigned char read_byte(void)
{
    unsigned char i, dat = 0;
    for (i = 0; i < 8; i++)
    {
        DQ = 0;  // 拉低DQ线
        dat >>= 1;  // 数据右移
        DQ = 1;  // 释放总线
        if (DQ)
            dat |= 0x80;  // 如果DQ为高,设置数据的最高位
        delay(40);  // 等待数据稳定
    }
    return dat;  // 返回读取的字节数据
}

// 写入一个字节数据
void write_byte(unsigned char dat)
{
    unsigned char i;
    for (i = 0; i < 8; i++)
    {
        DQ = 0;  // 拉低DQ线
        DQ = dat & 0x01;  // 发送最低位
        delay(40);  // 保持一段时间
        DQ = 1;  // 释放总线
        dat >>= 1;  // 数据右移
    }
    delay(2);  // 稍微延迟
}

在这段代码中,initds18b20函数用于初始化DS18B20传感器,通过拉低和拉高DQ线来发出复位脉冲,并检测传感器的存在脉冲。readbytewrite_byte函数分别用于从DS18B20读取和写入一个字节的数据,通过单总线协议的时序来实现数据的传输。

(二)LCD显示

采集到的温度数据需要显示出来,这里使用LCD显示屏。常见的LCD1602就可以满足项目需求,它能显示两行,每行16个字符。

// 向LCD发送命令
void lcd_command(unsigned char cmd)
{
    lcd_port = cmd;
    rs = 0;
    rw = 0;
    en = 1;
    _nop_();
    _nop_();
    en = 0;
    delay(2);
}

// 向LCD发送数据
void lcd_data(unsigned char dat)
{
    lcd_port = dat;
    rs = 1;
    rw = 0;
    en = 1;
    _nop_();
    _nop_();
    en = 0;
    delay(2);
}

// 初始化LCD
void lcd_init(void)
{
    lcd_command(0x38);  // 8位模式,2行显示,5x7字体
    delay(5);
    lcd_command(0x0C);  // 显示开,光标关
    delay(5);
    lcd_command(0x06);  // 光标移动方向
    delay(5);
    lcd_command(0x01);  // 清屏
    delay(5);
}

这段代码实现了与LCD显示屏的交互。lcdcommand函数用于向LCD发送命令,lcddata函数用于发送显示的数据,而lcd_init函数则完成了LCD的初始化设置,包括工作模式、显示开关、光标设置以及清屏等操作。

(三)按键设置与报警

通过按键来设置温度报警值。当LCD显示的温度超过设定值时,系统触发声光报警。

// 按键扫描
void key_scan(void)
{
    if (key1 == 0)  // 假设key1为设置按键
    {
        delay(20);  // 消抖
        if (key1 == 0)
        {
            while (!key1);  // 等待按键释放
            set_temp++;  // 设置温度值增加
            if (set_temp > 100)  // 假设最大设置温度为100度
                set_temp = 100;
        }
    }
    if (key2 == 0)  // 假设key2为减少按键
    {
        delay(20);  // 消抖
        if (key2 == 0)
        {
            while (!key2);  // 等待按键释放
            set_temp--;  // 设置温度值减少
            if (set_temp < 0)  // 假设最小设置温度为0度
                set_temp = 0;
        }
    }
}

// 温度比较与报警
void check_temp(void)
{
    if (current_temp > set_temp)
    {
        alarm = 1;  // 触发报警标志
        buzzer = 1;  // 蜂鸣器响
        led = 1;  // LED亮
    }
    else
    {
        alarm = 0;
        buzzer = 0;
        led = 0;
    }
}

keyscan函数用于扫描按键状态,实现温度报警值的设置调整,通过简单的消抖处理,避免按键误触发。checktemp函数则负责将当前采集到的温度currenttemp与设置的报警温度settemp进行比较,当超过时触发声光报警,通过控制蜂鸣器buzzer和LED led来实现。

四、原理图设计

在Proteus中绘制原理图时,将51单片机、DS18B20温度传感器、LCD显示屏以及按键、蜂鸣器、LED等元件合理连接。DS18B20通过单总线与单片机相连,LCD的控制引脚和数据引脚分别与单片机对应引脚连接,按键连接到单片机的I/O口用于输入,蜂鸣器和LED也连接到相应I/O口用于报警输出。

通过以上步骤,我们就能基于51单片机,利用DS18B20温度传感器完成一个功能丰富的多路温度检测系统,在Proteus中进行仿真并实际运行,对于学习单片机和电子电路设计很有帮助。无论是温度采集、显示还是报警功能的实现,都涉及到硬件与软件的紧密结合,希望大家能从中收获更多知识与乐趣。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐