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

发布者:平安守护最新更新时间:2023-08-09 来源: elecfans关键字:51单片机  数字温度计  传感器 手机看文章 扫描二维码
随时随地手机看文章

一、项目介绍

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


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


DS18B20是一种数字温度传感器,由Maxim Integrated公司生产。采用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;

 

 // 定义数码管段码

 unsigned char code SegCode[] = {

     0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F

 };

 

 void main()

 {

     unsigned int num = 1234;  // 要显示的数字

     unsigned char i, 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;

 

 // 定义全局变量

 unsigned char code DisplayChar[] = {

     0xc0, 0xf9, 0xa4, 0xb0, 0x99,

     0x92, 0x82, 0xf8, 0x80, 0x90}; // 数码管显示字符编码

 unsigned char TempData[4] = {0, 0, 0, 0}; // 显示温度值的数组

 unsigned char SetTemp = 25; // 设定温度上限阀值

 unsigned char LastKeyStatus = 0x07; // 按键状态

 unsigned char Count = 0; // 数码管扫描计数器

 bit IsAlarm = 0; // 报警状态

 

 // 定时器中断服务函数

 void Timer0_ISR() interrupt 1 {

     TH0 = 0xfc;

     TL0 = 0x67;

 

     DIG_1 = DIG_2 = DIG_3 = DIG_4 = 1; // 关闭所有数码管

     Count++; // 数码管扫描计数器加1

 

     switch (Count) {

         case 1: // 扫描第1位数码管

             DIG_1 = 0;

             P0 = TempData[3];

             break;

         case 2: // 扫描第2位数码管

             DIG_2 = 0;

             P0 = TempData[2];

             break;

         case 3: // 扫描第3位数码管

             DIG_3 = 0;

             P0 = TempData[1];

             break;

         case 4: // 扫描第4位数码管

             DIG_4 = 0;

             P0 = TempData[0];

             break;

         default:

             Count = 0;

             break;

     }

 }

 

 // 延时函数

 void Delay(unsigned int n) {

     unsigned int i, j;

 

     for(i=0; i< n; i++) {

         for(j=0; j< 125; j++);

     }

 }

 

 // 数字温度计初始化函数

 void Init() {

     TMOD |= 0x01; // 定时器0工作在模式1

     TH0 = 0xfc; // 定时器0初始值

     TL0 = 0x67;

     ET0 = 1; // 允许定时器0中断

     TR0 = 1; // 启动定时器0

 

     EA = 1; // 允许中断

 }

 

 // DS18B20复位函数

 bit Reset() {

     bit res;

 

     DQ = 0;

     Delay(480);

     DQ = 1;

     Delay(60);

     res = DQ;

     Delay(420);

 

     return res;

 }

 

 // DS18B20写字节函数

 void WriteByte(unsigned char dat) {

     unsigned char i;

 

     for(i=0; i< 8; i++) {

         DQ = 0;

         Delay(2);

         DQ = dat & 0x01;

         Delay(60);

         DQ = 1;

         Delay(2);

         dat > >= 1;

     }

 }

 

 // DS18B20读字节函数

 unsigned char ReadByte() {

     unsigned char i, j, dat = 0;

 

     for(i=0; i< 8; i++) {

         DQ = 0;

         Delay(2);

         DQ = 1;

         Delay(2);

         j = DQ;

         Delay(60);

         dat |= (j < < i);

     }

 

     return dat;

 }

 

 // DS18B20温度转换函数

 void TempConv() {

     if(!Reset()) {

         WriteByte(0xCC); // 跳过ROM操作,直接访问DS18B20

         WriteByte(0x44); // 发送温度转换命令

     }

 }

 

 // DS18B20读取温度函数

 void ReadTemp() {

     unsigned char TL, TH;

 

     if(!Reset()) {

         WriteByte(0xCC); // 跳过ROM操作,直接访问DS18B20

         WriteByte(0xBE); // 发送读取温度命令

         TL = ReadByte(); // 读取温度值低8位

         TH = ReadByte(); // 读取温度值高8位

 

         if(TH > 7) { // 温度值为负数,进行补码转换

             TH = ~TH;

             TL = ~TL;

             TempData[0] = ((unsigned short)(TH < < 8) | TL) * -0.0625 * 10 + 0.5; // 计算温度值并保存

             TempData[1] = DisplayChar[10]; // 显示字符“-”

         } else { // 温度值为正数

             TempData[0] = ((unsigned short)(TH < < 8) | TL) * 0.0625 * 10 + 0.5; // 计算温度值并保存

             TempData[1] = DisplayChar[TempData[0] / 10]; // 显示整数部分

         }

 

         TempData[2] = DisplayChar[TempData[0] % 10]; // 显示小数部分

     }

 }

 

 // 按键检测函数

 void KeyCheck() {

     unsigned char key_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) {

                 case 0x01: // 设定按键被按下

                     SetTemp++; // 温度上限阀值加1

                     if(SetTemp > 50) { // 上限阀值不能超过50℃

                         SetTemp = 50;

                     }

                     break;

                 case 0x02: // 加温按键被按下

                     break;

[1] [2]
关键字:51单片机  数字温度计  传感器 引用地址:基于51单片机设计的数字温度计设计

上一篇:51单片机的cpu主要由什么组成_51单片机的字长是多少
下一篇:MCS51单片机的指令时序

推荐阅读最新更新时间:2024-11-17 16:02

松下发布1400万像素高画质MOC传感器
  松下1400万像素高画质MOC传感器 -->   松下正式发布采用高感光度及高画质技术的新款MOC传感器(MN34110)。该新款传感器对松下公司的vMaicovicon MOC传感器的感光度进行了提升,并压缩了不均匀的颜色和亮度分布,确保提供更加均匀的画质。   新款MOS传感器尺寸为1/2.33",拥有1400万有效像素。该传感器将于2011年12月开始量产,用于数码相机及智能手机等设备,并且未来还会继续开发多种版本。
[安防电子]
51单片机最小系统
电路原理图: 最小系统组成: 单片机、复位电路、晶振(时钟)电路、电源 最小系统所用到的引脚: 1、主电源引脚 VCC: 电源输入,接5v电源,第40根引脚 GND:接地线,第20根引脚 2、外接晶振引脚(两根)一般晶振无方向 XTAL1:片内电路的晶振输入端 XTAL2:片内电路的晶振输出端 电容的作用:过滤掉晶振部分的高频信号,让晶振工作更加稳定 3、复位引脚 RST:复位引脚(高电平复位)    T = RC 刚上电时,引脚为高电平(不少于两个时钟周期),单片机自动复位,从零开始执行程序。 1个状态周期 = 2 个震荡周期;1个机器周期= 6个状态周期;1-4个机器周期 = 1个指令周期 震荡周期 = 1/f
[单片机]
<font color='red'>51单片机</font>最小系统
51单片机自定义函数实现任意串口的printf()
在嵌入式开发过程中,往往需要多个串口进行通讯,使用printf函数是个不错的选择,格式化输出后方便实用; 不论什么型号的单片机,只要支持标准C的编译器,都可以实现此功能, 添加如下头文件; #include stdio.h #include string.h #include stdarg.h 下面是函数定义,可以移植到任意的串口; bit S1_busy; unsigned char idata Put_buf ; //最大数量 void my_printf(char* fmt,...) { unsigned char i,len; va_list ap; va_start(ap,fmt);
[单片机]
<font color='red'>51单片机</font>自定义函数实现任意串口的printf()
51单片机的4×4键盘识别与74LS164驱动数码显示
;P1口外接4×4键盘,输出使用74LS164驱动一位数码显示器。 ;当按下任一键时,在数码显示器上显示键值。 ;程序用汇编语言编写,用PROTEUS仿真调试的画面如下: ;程序如下: ORG 0000H LJMP START ORG 0030H START: MOV P1, #255 MOV 60H, #16 MAIN: CALL DISPLAY ;SJMP $ M_LOOP: CALL K_SCAN ;扫描程序 JB ACC.4, M_LOOP LJMP MAIN ;--------------------------------------- DISPLAY: MOV
[单片机]
<font color='red'>51单片机</font>的4×4键盘识别与74LS164驱动数码显示
开发并开始量产数字气压传感器 “HSPPAD042A”
近年来,智能手机、平板电脑、可穿戴设备向多功能、高功能化发展,同时随着导航系统、健康管理、各种运动数据记录等形形色色的软件和应用程序的出现,这些设备的用途正在不断扩大。 随着此类软件和应用程序的多样化与高度化, 对设备搭载的元器件也提出了高性能的要求,而由于耗电量的增加,CPU 和各种元器件的低消耗电流化成为一大课题。尤其是传感器类,由于搭载元件数量的增加,除了低消耗电流化之外,还有小型化的要求。 为了应对这些需求,我公司开发出低消耗电流的高精度气压传感器 HSPPAD042A ,并已加入至产品系列。本产品通过对 ASIC 的大幅度调整优化,实现了行业界最高级别(注 1) 的低消耗电流(1.8 A:Low Power Mode 时
[传感器]
开发并开始量产数字气压<font color='red'>传感器</font> “HSPPAD042A”
蓄电池在线监控解决方案
UPS 据统计,在中国大陆约有95%以上的UPS电池没有安装监测设备,90%以上的UPS电池没有进行必要的维护,这为日后UPS供电故障埋下了重大隐患。实际维修也表明,约有50%以上的UPS电源故障与UPS蓄电池有关,所以UPS蓄电池的维护是非常重要的,也是非常必要的。 UPS设备作为通信最重要的后备电源,是我们非常重视和关注的问题。在UPS蓄电池组中只要存在任何一只落后单体,将直接导致电源无法正常供电,从而引起通信中断等重大事故。如何有效地检测蓄电池的健康状态(SOH)也越来越多地成为专业人士的重要话题。 瑞士LEM集团推出的一款蓄电池智能传感器正好能够满足测量蓄电池各种重要参数的要求,具体可以测量的参数有:蓄电池的内阻、电压、温
[测试测量]
蓄电池在线监控解决方案
基于89C2051单片机的织机监测器键盘显示装置设计
  1前 言   在嵌入式计算机系统设计中,经常要考虑键盘显示装置的设置问题。尽管有多种方案可以满足键盘显示的要求,但是这些方案都各有其优缺点,比如采用专用的键盘显示器管理芯片8279,在系统的按键及显示器位数较多时是一种好的方案,但目前键盘的设置趋于简单化(即采用一键多用方式或利用增加键和减少键来取代数字键等),因此,一般系统按键不多,其显示器的位数一般也不超过8位。这样,采用 8279由于需要较多的外围 电路 器件,因此显得不是很方便了。而14499是显示器管理芯片,它虽然可以管理四位显示器,但它没有按键管理功能。此外, PS7219是高性能的多位 LED 显示驱动器,可管理8位显示器,并有很强的显示管理功能,如位闪、复位等功
[单片机]
基于89C20<font color='red'>51单片机</font>的织机监测器键盘显示装置设计
Melexis创新推出集成唤醒功能的汽车制动踏板位置传感器芯片方案
2024年10月24日,比利时泰森德洛—— 全球微电子工程公司Melexis宣布,推出MLX90424,这是一款简化汽车刹车踏板传感过程的经济高效的解决方案 。为实现功能安全,该产品将两个位置传感器芯片和一个唤醒开关集成于单一封装组件中。此外,该解决方案能够直接由12V电源供电,并实现高达30mm的线性位移精确测量。 针对安全关键且空间受限的应用,如汽车刹车系统等,迈来芯今天推出的这款传感器芯片MLX90424以其量身定制的设计引领行业趋势。该芯片不仅通过双线性位置传感提供冗余,还通过集成的磁性开关实现节能。与现有包含分离位置传感器芯片和开关的刹车踏板模块相比,MLX90424将位置传感和开关元件集成于一体,可理想地置于
[汽车电子]
Melexis创新推出集成唤醒功能的汽车制动踏板位置<font color='red'>传感器</font>芯片方案
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved