0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

DS小龙哥-嵌入式技术 来源: DS小龙哥-嵌入式技术 作者: DS小龙哥-嵌入式技 2023-06-14 09:04 次阅读

一、项目介绍

数字温度计是一种广泛应用于日常生活和工业领域中的电子测量仪器,用于检测环境温度并将其转换为数字信号进行显示。随着现代科技的发展,数字温度计逐渐取代了传统的水银温度计等方式,具有快速响应、高精度、便携式等优点。

基于51单片机设计的数字温度计具体应用于制造业中的温度检测,例如温度控制器、烤箱温度控制、食品加工、工业炉等领域。通过DS18B20这种数字温度传感器来进行温度采集,使用STC89C52这种常用的单片机控制芯片,配合4位共阳数码管实现温度数据显示,并通过按键设置温度上限阀值,一旦温度超过阀值,系统会触发蜂鸣器进行报警提示,从而保证了温度的精准控制和安全性。

DS18B20是一种数字温度传感器,由MaximIntegrated公司生产。采用1-Wire总线接口,只需要一个数据线就可以同时实现数据传输和供电。主要特点是精度高、响应速度快、体积小、价格低廉,被广泛应用于各种温度测量场合。

DS18B20可以测量的温度范围为-55℃~+125℃,精度为±0.5℃(在-10℃~+85℃范围内)。内部集成了温度传感器、A/D转换器和数字信号处理电路,可以直接输出数字温度值。

DS18B20的工作原理是利用温度对半导体材料电阻值的影响,将温度转化为电阻值,再通过A/D转换器将电阻值转化为数字信号输出。1-Wire总线接口可以实现多个DS18B20传感器的串联,只需要一个控制器就可以同时读取多个传感器的温度数据。

在热敏电阻测温系统中,可以使用DS18B20传感器来测量环境温度,并将温度值传输到控制器中进行处理和显示。

下面是仿真图:

image-20230607175253647

二、设计思路

2.1 系统架构

系统硬件主要由单片机控制模块、温度传感器模块、数码管显示模块、按键模块、蜂鸣器模块组成。其中单片机控制模块采用STC89C52作为主控芯片,通过连接数码管、按键、蜂鸣器、温度传感器等外围电路实现温度检测、控制和报警功能。

2.2 技术方案

(1)温度传感器模块 本项目采用DS18B20数字式温度传感器进行温度检测,该传感器具有精度高、响应快、可靠性强等优点。通过将其与单片机进行串口通信,实现温度数据的采集。

(2)数码管显示模块 本项目采用4位共阳数码管进行温度数据的显示,通过设置单片机控制IO口实现数据的动态扫描和显示。

(3)按键模块 本项目通过设置按键模块实现对温度上限阀值的设定,采用矩阵按键实现多个按键功能。

(4)蜂鸣器模块 本项目采用蜂鸣器作为报警提示器,当温度超过上限阀值时,触发单片机控制后,蜂鸣器会发出一定频率的报警信号

2.3 系统实现流程

(1)主程序初始化:设置IO口模式、串口配置、定时器中断等参数

(2)温度检测:通过DS18B20进行温度采集,并将采集到的数据解析为实际温度值。

(3)数码管显示:将温度值通过数码管进行数据的显示。

(4)上限阀值设置:通过按键设置温度上限阀值,将阀值存储在单片机内部的EEPROM中。

(5)报警提示:当温度值超过阀值时,触发蜂鸣器发出报警信号。

三、代码实现

3.1 4位共阳极数码管显示代码

下面是控制STC89C52通过P1口控制4位共阳极数码管显示数字1234的实现代码:

#include< reg52.h >// 定义数码管端口连接的IO口sbit Dig1 = P1^0; sbit Dig2 = P1^1; sbit Dig3 = P1^2; sbit Dig4 = P1^3;// 定义数码管段码unsignedcharcode SegCode[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};voidmain(){unsignedintnum =1234;// 要显示的数字unsignedchari, j, k, l;// 分别表示千位、百位、十位和个位while(1) {// 将数字分解为千位、百位、十位和个位i = num /1000; j = num %1000/100; k = num %100/10; l = num %10;// 显示千位Dig1 =1; P0 = SegCode[i]; Dig1 =0;// 显示百位Dig2 =1; P0 = SegCode[j]; Dig2 =0;// 显示十位Dig3 =1; P0 = SegCode[k]; Dig3 =0;// 显示个位Dig4 =1; P0 = SegCode[l]; Dig4 =0; } }

这段代码中,定义了数码管端口连接的IO口,然后定义了数码管段码。在main函数中,将要显示的数字1234分解为千位、百位、十位和个位,并通过控制P1口的四个IO口,依次显示出来。这里使用共阳极数码管,需要将对应位的IO口置为0才能点亮数码管。

3.2 数字温度计实现代码

下面是数字温度计完整的代码。

#include< reg52.h >// 定义温度传感器引脚sbit DQ = P3^7;// 定义数码管引脚sbit DIG_1 = P2^0; sbit DIG_2 = P2^1; sbit DIG_3 = P2^2; sbit DIG_4 = P2^3; sbit SEG_A = P1^0; sbit SEG_B = P1^1; sbit SEG_C = P1^2; sbit SEG_D = P1^3; sbit SEG_E = P1^4; sbit SEG_F = P1^5; sbit SEG_G = P1^6; sbit SEG_DP = P1^7;// 定义按键引脚sbit KEY_SET = P0^0; sbit KEY_ADD = P0^1; sbit KEY_SUB= P0^2;// 定义全局变量unsignedcharcode DisplayChar[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 数码管显示字符编码unsignedcharTempData[4] = {0,0,0,0};// 显示温度值的数组unsignedcharSetTemp =25;// 设定温度上限阀值unsignedcharLastKeyStatus =0x07;// 按键状态unsignedcharCount =0;// 数码管扫描计数器bit IsAlarm =0;// 报警状态// 定时器中断服务函数voidTimer0_ISR()interrupt 1{ TH0 =0xfc; TL0 =0x67; DIG_1 = DIG_2 = DIG_3 = DIG_4 =1;// 关闭所有数码管Count++;// 数码管扫描计数器加1switch(Count) {case1:// 扫描第1位数码管DIG_1 =0; P0 = TempData[3];break;case2:// 扫描第2位数码管DIG_2 =0; P0 = TempData[2];break;case3:// 扫描第3位数码管DIG_3 =0; P0 = TempData[1];break;case4:// 扫描第4位数码管DIG_4 =0; P0 = TempData[0];break;default: Count =0;break; } }// 延时函数voidDelay(unsignedintn){unsignedinti, j;for(i=0; i< n; i++) {for(j=0; j<125; j++); } }// 数字温度计初始化函数voidInit(){ TMOD |=0x01;// 定时器0工作在模式1TH0 =0xfc;// 定时器0初始值TL0 =0x67; ET0 =1;// 允许定时器0中断TR0 =1;// 启动定时器0EA =1;// 允许中断}// DS18B20复位函数bitReset(){ bit res; DQ =0;Delay(480); DQ =1;Delay(60); res = DQ;Delay(420);returnres; }// DS18B20写字节函数voidWriteByte(unsignedchardat){unsignedchari;for(i=0; i<8; i++) { DQ =0;Delay(2); DQ = dat &0x01;Delay(60); DQ =1;Delay(2); dat > >=1; } }// DS18B20读字节函数unsignedcharReadByte(){unsignedchari, j, dat =0;for(i=0; i<8; i++) { DQ =0;Delay(2); DQ =1;Delay(2); j = DQ;Delay(60); dat |= (j < < i); }returndat; }// DS18B20温度转换函数voidTempConv(){if(!Reset()) {WriteByte(0xCC);// 跳过ROM操作,直接访问DS18B20WriteByte(0x44);// 发送温度转换命令} }// DS18B20读取温度函数voidReadTemp(){unsignedcharTL, TH;if(!Reset()) {WriteByte(0xCC);// 跳过ROM操作,直接访问DS18B20WriteByte(0xBE);// 发送读取温度命令TL =ReadByte();// 读取温度值低8位TH =ReadByte();// 读取温度值高8位if(TH >7) {// 温度值为负数,进行补码转换TH = ~TH; TL = ~TL; TempData[0] = ((unsignedshort)(TH < <8) | TL) *-0.0625*10+0.5;// 计算温度值并保存TempData[1] = DisplayChar[10];// 显示字符“-”}else{// 温度值为正数TempData[0] = ((unsignedshort)(TH < <8) | TL) *0.0625*10+0.5;// 计算温度值并保存TempData[1] = DisplayChar[TempData[0] /10];// 显示整数部分} TempData[2] = DisplayChar[TempData[0] %10];// 显示小数部分} }// 按键检测函数voidKeyCheck(){unsignedcharkey_status =0;if(KEY_SET ==0) {// 设定按键被按下key_status |=0x01; }if(KEY_ADD ==0) {// 加温按键被按下key_status |=0x02; }if(KEY_SUB ==0) {// 减温按键被按下key_status |=0x04; }if(key_status != LastKeyStatus) {// 判断是否有按键事件发生Delay(10);// 延时去抖if(key_status != LastKeyStatus) {// 再次判断是否有按键事件发生switch(key_status) {case0x01:// 设定按键被按下SetTemp++;// 温度上限阀值加1if(SetTemp >50) {// 上限阀值不能超过50℃SetTemp =50; }break;case0x02:// 加温按键被按下break;case0x04:// 减温按键被按下break;default:break; } } LastKeyStatus = key_status;// 保存当前按键状态} }// 报警函数voidAlarm(){if(TempData[0] > SetTemp *10&& !IsAlarm) {// 当温度超过设定的阀值且没有报警时触发报警IsAlarm =1;// 设置报警标志while(TempData[0] > SetTemp *10) {// 循环等待P1 =0xff;// 关闭数码管P0 =0x00;// 关闭蜂鸣器Delay(500);// 延时P1 =0x00;// 打开数码管P0 =0xff;// 打开蜂鸣器Delay(500);// 延时} }elseif(TempData[0] <= SetTemp *10) {// 当温度低于等于设定的阀值时,取消报警IsAlarm =0;// 清除报警标志} }// 主函数voidmain(){Init();// 初始化数字温度计while(1) {TempConv();// 温度转换ReadTemp();// 读取温度值KeyCheck();// 按键检测Alarm();// 报警处理} }

这份代码的设计主要分为4个模块:

(1)数码管显示模块:使用四位共阴数码管进行温度值的显示,采用定时中断扫描四个数码管的方式进行显示。

(2)DS18B20模块:通过DS18B20温度传感器获取当前温度值,并将温度值保存到数组中,以便于数码管显示模块进行显示。

(3)按键检测模块:通过检测按键状态,实现设定温度上限阀值、加温和减温等操作。

(4)报警模块:当当前温度超过设定的温度上限阀值时,触发蜂鸣器报警。

代码主要使用51单片机进行设计,其中主要包含了DS18B20温度传感器的读取、按键检测、数码管显示、蜂鸣器控制等多种功能。通过使用定时中断和循环结构,实现了各个模块之间的协作,从而一同完成数字温度计的设计。
审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2541

    文章

    49689

    浏览量

    746303
  • 51单片机
    +关注

    关注

    272

    文章

    5685

    浏览量

    121913
  • 数字温度计
    +关注

    关注

    2

    文章

    108

    浏览量

    21641
收藏 人收藏

    评论

    相关推荐

    数字温度计

    `关于 51 单片机数字 温度计`
    发表于11-18 15:33

    基于D的数字温度计的设计

    基于D的 数字 温度计的设计:介绍了高分辨率 数字 温度讣/恒温器DSl626/DSl726的特点、功能和测温原理,并以它为 温度传感器,与89C
    发表于09-14 09:49 68次下载

    单片机设计的超低功耗电子温度计方案

    单片机设计的超低功耗电子 温度计方案 本文设计的超低功耗电子 温度计能够通过 温度
    发表于04-16 14:32 1468次阅读
    <b class='flag-5'>单片机设</b>计的超低功耗电子<b class='flag-5'>温度计</b>方案

    基于51单片机温度计

    基于 51 单片机温度计,包括protues仿真,程序。
    发表于04-28 09:49 51次下载

    51单片机与DS18B20的数字温度计

    51 单片机与DS18B20的 数字 温度计
    发表于05-19 15:32 117次下载

    基于单片机数字温度计资料

    一款基于 单片机设计的 温度计,有兴趣的朋友可以下来看看。
    发表于12-17 16:18 5次下载

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

    51 单片机, 数字 温度计
    发表于01-04 14:52 56次下载

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

    基于 单片机数字 温度计的设计及显示
    发表于01-14 12:29 77次下载

    51单片机数字温度计+灯光报警(仿真|+源程序)

    51 单片机数字 温度计+灯光报警(仿真|+源程序)
    发表于01-18 20:23 204次下载

    使用51单片机设温度计的程序免费下载

    本文档的主要内容详细介绍的是使用 51 单片机设温度计的程序免费下载。通过 温度感应元件 DS18B20 能感应周围的 温度,然后再通过数码管显示
    发表于06-17 17:44 8次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机设</b>计<b class='flag-5'>温度计</b>的程序免费下载

    基于51单片机热敏电阻温度计仿真设计

    基于 51 单片机热敏电阻 温度计仿真设计
    发表于10-25 10:14 8次下载

    基于单片机温度计设计

    文末下载完整资料摘要:随着时代的进步和发展, 单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于 单片机控制的 数字 温度计,本
    发表于11-04 12:21 38次下载
    基于<b class='flag-5'>单片机</b>的<b class='flag-5'>温度计</b>设计

    基于单片机数字温度计设计-零妖

    1,开发前规划 基于 单片机数字 温度计-开发前规划 关键字 温度计51
    发表于11-05 12:51 46次下载
    基于<b class='flag-5'>单片机</b>的<b class='flag-5'>数字</b><b class='flag-5'>温度计</b>设计-零妖

    基于51单片机的热敏电阻数字温度计设计

    德赢Vwin官网 网站提供《基于 51 单片机的热敏电阻 数字 温度计设计.rar》资料免费下载
    发表于01-03 11:17 33次下载

    基于51单片机的热敏电阻数字温度计设计

    德赢Vwin官网 网站提供《基于 51 单片机的热敏电阻 数字 温度计设计.rar》资料免费下载
    发表于01-12 09:32 8次下载