基于单片机的数字温度计设计

这篇具有很好参考价值的文章主要介绍了基于单片机的数字温度计设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、项目背景

数字温度计是一种用于测量和显示环境温度的设备。本文章介绍基于STC89C52主控芯片的数字温度计的设计过程和实现原理。该设计采用DS18B20温度传感器进行温度采集,使用LCD1602显示屏进行温度显示,通过按键设置温度的上限和下限阀值,并通过蜂鸣器进行报警。

单片机数字温度计设计,STM32单片机开发基础,单片机,嵌入式硬件

单片机数字温度计设计,STM32单片机开发基础,单片机,嵌入式硬件

单片机数字温度计设计,STM32单片机开发基础,单片机,嵌入式硬件

二、系统架构

数字温度计的系统架构如下所示:

(1)硬件部分:主控芯片STC89C52、DS18B20温度传感器、LCD1602显示屏、按键、蜂鸣器;

(2)软件部分:嵌入式C语言程序。

三、系统功能设计

【1】温度采集:通过DS18B20温度传感器采集环境温度;

【2】温度显示:使用LCD1602显示屏显示当前环境温度;

【3】阈值设置:通过按键设置温度的上限和下限阀值;

【4】报警功能:当温度超出阀值时,蜂鸣器发出报警信号。

四、整体设计

4.1 硬件设计

【1】主控芯片选择:STC89C52,具有较好的性能和丰富的外设资源,适合作为数字温度计的核心处理器;

【2】温度传感器:采用DS18B20温度传感器,利用其一线通信功能实现温度采集;

【3】显示屏:使用LCD1602显示屏,通过并口连接到主控芯片,实时显示温度信息;

【4】按键:通过按键设置温度阀值,包括上限和下限;

【5】蜂鸣器:当温度超出阀值时,蜂鸣器发出报警信号。

4.2 软件设计

【1】GPIO配置:配置主控芯片的GPIO引脚,包括DS18B20温度传感器的引脚、LCD1602显示屏的引脚、按键的引脚和蜂鸣器的引脚;

【2】DS18B20通信:利用主控芯片的IO口实现与DS18B20温度传感器的一线通信,获取温度数据;

【3】LCD显示:通过并口通信协议,将温度数据发送给LCD1602显示屏进行显示;

【4】按键检测:使用外部中断方式监听按键引脚的状态变化,当按键被按下时,进入设置模式,并根据按键次数调整温度阀值;

【5】温度比较和报警:在主循环中,不断比较当前温度与设置的阀值,当温度超出阈值时,触发蜂鸣器报警。

五、源代码

#include <reg52.h>

// 定义IO口
sbit DQ = P2^0;
sbit RS = P2^1;
sbit RW = P2^2;
sbit E = P2^3;
sbit K1 = P2^4;
sbit K2 = P2^5;
sbit Buzzer = P2^6;

// 定义全局变量
unsigned int highTemp = 30; // 温度上限
unsigned int lowTemp = 20; // 温度下限
unsigned int currentTemp = 0; // 当前温度

// 延时函数
void delay(unsigned int ms) {
    unsigned int i, j;
    for (i = ms; i > 0; i--)
        for (j = 110; j > 0; j--);
}

// DS18B20初始化
bit Init_DS18B20() {
    bit presence;
    
    DQ = 1; // 设置DQ为输出
    delay(1);
    DQ = 0; // 主机拉低DQ线
    delay(75);
    DQ = 1; // 主机释放DQ线
    delay(4);
    presence = DQ; // 从机检测到的应答信号
    
    delay(20);
    
    return presence;
}

// DS18B20写字节
void Write_DS18B20(unsigned char dat) {
    unsigned char i;
    
    for (i = 0; i < 8; i++) {
        DQ = 0; // 主机拉低DQ线
        _nop_();
        DQ = dat & 0x01; // 写数据位
        delay(5);
        DQ = 1; // 主机释放DQ线
        dat >>= 1;
    }
}

// DS18B20读字节
unsigned char Read_DS18B20() {
    unsigned char i, dat;
    
    for (i = 0; i < 8; i++) {
        DQ = 0; // 主机拉低DQ线
        _nop_();
        DQ = 1; // 主机释放DQ线
        _nop_();
        dat >>= 1;
        if (DQ)
            dat |= 0x80; // 读数据位
        delay(5);
    }
    
    return dat;
}

// 读取温度
unsigned char ReadTemperature() {
    unsigned char temp_h, temp_l;
    
    Init_DS18B20();
    Write_DS18B20(0xCC); // 跳过ROM指令
    Write_DS18B20(0xBE); // 发送读温度命令
    
    temp_l = Read_DS18B20(); // 读低字节
    temp_h = Read_DS18B20(); // 读高字节
    
    currentTemp = temp_h;
    
    return temp_l;
}

// LCD初始化
void LCD_Init() {
    delay(15);
    Write_Command(0x38); // 设置8位数据总线,2行显示,5x7点阵
    Write_Command(0x0C); // 显示器打开,光标关闭
    Write_Command(0x06); // 光标右移,显示器不移动
    Write_Command(0x01); // 显示清屏
}

// LCD写命令
void Write_Command(unsigned char com) {
    RS = 0;
    RW = 0;
    E = 1;
    P0 = com;
    delay(1);
    E = 0;
}

// LCD写数据
void Write_Data(unsigned char dat) {
    RS = 1;
    RW = 0;
    E = 1;
    P0 = dat;
    delay(1);
    E = 0;
}

// LCD显示温度
void Display_Temperature(unsigned char temp) {
    unsigned char temp_str[5];
    
    temp_str[0] = temp / 10 + '0';
    temp_str[1] = temp % 10 + '0';
    temp_str[2] = '.';
    temp_str[3] = ReadTemperature() / 10 + '0';
    temp_str[4] = ReadTemperature() % 10 + '0';
    
    Write_Command(0x80); // 第一行第一个字符位置
    Write_String("Temp: ");
    Write_Command(0x86); // 第一行第七个字符位置
    Write_String(temp_str);
    Write_Command(0xC0); // 第二行第一个字符位置
    Write_String("High: ");
    Write_Command(0xC6); // 第二行第七个字符位置
    Write_Char(highTemp / 10 + '0');
    Write_Char(highTemp % 10 + '0');
    Write_Command(0xCB); // 第二行第十个字符位置
    Write_String("Low: ");
    Write_Command(0xCF); // 第二行第十四个字符位置
    Write_Char(lowTemp / 10 + '0');
    Write_Char(lowTemp % 10 + '0');
}

// LCD写字符串
void Write_String(unsigned char *str) {
    while (*str != '\0') {
        Write_Data(*str);
        str++;
    }
}

// LCD写字符
void Write_Char(unsigned char dat) {
    Write_Data(dat);
}

// 蜂鸣器报警
void Alarm() {
    Buzzer = 0;
    delay(500);
    Buzzer = 1;
    delay(500);
}

// 按键扫描
void Key_Scan() {
    if (K1 == 0) { // K1按下,设置高温
        delay(5);
        if (K1 == 0) {
            highTemp++;
            Write_Command(0xCB); // 第二行第十个字符位置
            Write_Char(highTemp / 10 + '0');
            Write_Char(highTemp % 10 + '0');
            while (!K1);
        }
    }
    
    if (K2 == 0) { // K2按下,设置低温
        delay(5);
        if (K2 == 0) {
            lowTemp--;
            Write_Command(0xCF); // 第二行第十四个字符位置
            Write_Char(lowTemp / 10 + '0');
            Write_Char(lowTemp % 10 + '0');
            while (!K2);
        }
    }
}

// 主函数
void main() {
    LCD_Init();
    
    while (1) {
        ReadTemperature(); // 读取温度
        Display_Temperature(currentTemp); // 显示温度
        
        if (currentTemp > highTemp || currentTemp < lowTemp) { // 温度超出阈值,触发报警
            Alarm();
        }
        
        Key_Scan(); // 按键扫描
    }
}

代码最开始定义了一些用于控制硬件的IO口,如DQ用于连接温度传感器、RS、RW、E用于连接LCD显示屏、K1、K2用于连接按键、Buzzer用于连接蜂鸣器。接下来定义了一些全局变量,包括高温上限、低温下限以及当前温度。然后是一些函数的定义和实现,包括延时函数、DS18B20温度传感器初始化函数、写字节函数、读字节函数等。

ReadTemperature() 函数用于读取温度传感器的温度值,并将其保存到 currentTemp 变量中。

LCD_Init() 函数用于初始化LCD显示屏。

Write_Command() 和 Write_Data() 函数用于向LCD显示屏写入命令和数据。

Display_Temperature() 函数用于在LCD显示屏上显示当前温度、高温上限和低温下限。

Alarm() 函数用于触发蜂鸣器报警。

Key_Scan() 函数用于扫描按键状态,根据按键状态来修改高温上限和低温下限。

主函数 main() 中的逻辑:

  • 调用 LCD_Init() 初始化LCD显示屏。
  • 进入一个无限循环,不断读取当前温度并显示在LCD上。
  • 如果当前温度超过设定的高温上限或低于设定的低温下限,就触发报警。
  • 通过按键扫描函数来修改高温上限和低温下限。

六、总结

本文章详细介绍了基于STC89C52主控芯片的数字温度计的设计过程和实现原理。通过集成DS18B20温度传感器、LCD1602显示屏、按键和蜂鸣器等功能,实现了温度的采集、显示和报警功能。通过按键设置温度的上限和下限阀值,用户可以根据需要进行调整,并在超出阀值时触发报警,提醒用户注意环境温度的变化。该设计可以广泛应用于家庭、办公室和实验室等场景,为用户提供了方便、准确和实用的温度监测工具。文章来源地址https://www.toymoban.com/news/detail-740496.html

到了这里,关于基于单片机的数字温度计设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机DS18B20温度传感器使用及数码管温度计、LCD1602温度显示代码详解

    温馨提示:读者若要彻底理解并会灵活使用DS18B20温度传感器,请详细阅读中文手册,并且对照代码注释充分分析代码。请不要觉得中文手册内容繁多!如能静心分析,定能深有体会,获益匪浅! 主函数操作顺序(执行序列) 功能指令 最后希望我的分享对你有所帮助!敬请关

    2024年02月12日
    浏览(50)
  • [模电课程设计]基于TCP7107的数字式温度计设计

    本设计 (仿真+原理图+PCB+报告) 原理图PCB:Altium Designer 仿真原版本:protues 8.9 设计编号:S0020 主要研究内容: 【基本要求】采用电桥法,利用PT-100热电阻对0-200℃测温范围进行测量并发送LED数码管显示,要求测量分辨率为0.5℃,数据测量间隔时间为5秒。 【提高要求】 1)针

    2024年02月11日
    浏览(76)
  • STM32实现数字温度计

    RTC (Real Time Clock):实时时钟 RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。 在断电情况下 RTC仍可以独立运行 只要芯片

    2024年02月21日
    浏览(50)
  • 数字温度计方案芯片CS7193

    CS7193_T16E是带LCD显示的1位小数数字温度计电路。可以通过外部PIN脚,选择摄氏度显示(℃)或者华氏度显示(℉),并通过开关按键完成单位切换。它还包括了测试模式,自动关闭电源和报警功能等。CS7193_T16E适合应用在临床及家用数字温度计等领域。其特点如下: 1、测量范

    2023年04月08日
    浏览(38)
  • 基于51单片机数字温度报警器_DS18B20可调上下限

    (仿真+程序+原理图) 原理图:Altium Designer 仿真版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0009 1、实时温度测量及显示,超出温度范围声光报警,上下限温度可通过按键设定等功能; 2、温度测量范围0到99.9摄氏度,精度为0.1摄氏度; 3、可设置上下

    2024年02月06日
    浏览(43)
  • MLX90614红外温度计介绍

    MLX90614是一款红外非接触温度计。TO-39金属封装里同时集成了红外感应热电堆探测器芯片和信号处理专用集成芯片。 由于集成了低噪声放大器、17位模数转换器和强大的数字信号处理单元,使得高精度和高分辨度的温度计得以实现。温度计具备出厂校准化,有数字PWM和SMBus(系

    2023年04月08日
    浏览(49)
  • 手机怎样使用温度计功能,手机怎样使用北斗导航

    大家好,本文将围绕手机怎样使用百度网盘教程视频展开说明,手机怎样使用搜狗输入法是一个很多人都想弄明白的事情,想搞清楚手机怎样使用谷歌浏览器需要先了解以下几个事情。 Source code download: 本文相关源码 手机编程软件有很多,大部分都很难使用,操作不灵活,甚

    2024年02月03日
    浏览(44)
  • 基于51单片机的温度报警器

    设计任务: 以51单片机为核心,设计和制作一个温度报警器,能在LCD上显示环境的温度与希望温度上下限阀值,并能设置希望温度上下限阀值,系统上电的时候显示的是当前环境温度和设定的温度阀值,通过按键来修改温度上下限阀值,再次上电时保持上一次的温度设置。根

    2024年02月11日
    浏览(42)
  • 0535-基于单片机的温度报警系统设计

    1、采用51/52单片机作为主控; 2、采用18B20传感器检测温度,范围0~99度; 3、采用数码管显示:当前温度值及报警阈值设置; 4、按键可设置温度报警上下限值; 5、当温度低于下限或高于上限温度时,蜂鸣器和LED灯同时报警。 采用Altium Designer作为电路设计工具。Altium Design

    2024年01月24日
    浏览(95)
  • 基于单片机的温度控制器系统设计

    ** 单片机设计介绍, 基于单片机的温度控制器系统设计    基于单片机的温度控制器系统是一种利用单片机来检测环境温度并控制温度的系统。它通常由以下几个部分组成: 温度传感器:用于感知环境温度的传感器。常见的温度传感器有热敏电阻(如NTC、PTC)、热电偶和数

    2024年02月04日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包