led数码管、led数码彩屏专业生产厂家,承接各种数码管显示屏的定制业务,手机(微信):15626546861 关于我们 | 联系我们 | 在线留言
国内业务热线
15626546861
当前位置: 主页 > led数码管知识 > 行业动态

LED数显温度控制器设计论述

文章出处:-1 人气:发表时间:2020-12-14 12:17

现代社会, 单片机技术已经成为一种比较成熟的技术, 它已经普及到我们生活、 工作、科研、 各个领域中, 温度也是日常生活中最基本的环境参数, 它与我们的生活工作密切相关, 本文主要介绍了一个基于AT89C51单片机的温度控制报警系统, 采用温度传感器DS18B20的温度上下限报警器, 能够自动测量当前环境温度, 由单片机AT89C2051控制, 并通过三位段数码管显示提示, 如果目前环境温度超过此温度, 系统会发出报警。 采用的单片机AT89C51做信号处理单元, 其成本低廉, 精确度高, LED显示测量数值, 选用红外传感器采集人体信号, 经过放大整形电路后传送给单片机AT89C51来处理, 最后该信号传送至LED显示屏。
该系统能够方便的实现温度的采集和显示, 并根据需要可任意设定报警温度, 它使用起来非常方便, 具有体积小、 精度高、 量程宽、 灵敏度高、 功耗低等优点, 适用于我们日常生活和工、 农业生产中的温度控制, 也可以作为其他主系统的辅助扩展, 当作温度处理模块嵌入其它系统中。 DS18B20与AT89C51的结合实现了最简温度控制系统, 该系统抗干扰能力强, 结构简单, 对恶劣环境下进行现场温度的控制也适合, 应用前景较为广泛。

关键词 : 单片机; 温度控制; AT89C51; DS18B20;

1 引言

1.1 研究的背景与意义

无论是在日常生活中, 还是在工业生产过程中温度控制都起着非常重要的作用。 本次毕业设计选题的目的主要是让生活在信息发达时代的我们, 把所学的知识应用于生活生产当中, 熟练掌握系统总体设计的流程, 方案的论证, 选择, 实施与完善。 随着社会经济的快速发展, 现在越来越多的生产部门及生产环节对温度控制精度的可靠性和稳定性等有了更高的要求。 由于苛刻的生产环节对温度要求较高, 而传统的温度控制器控制精度却普遍不高, 已经不能满足其要求。当今社会, 温度是工业对象中的一个重要的被控参数, 它的测量与控制系统在生产与生活的各个领域中扮演着越来越重要的角色, 大到工业炼金, 环境检测, 分离物质, 机房电力, 粮仓, 冻库, 卫生医疗等方面, 小到家庭空调, 冰箱, 电饭煲, 太阳能热水器等方面都得到了广泛的应用, 温度控制系统的广泛应用也使得这方面研究意义非常的重要。

1.2 国内外研究现状

虽然温度控制系统在国内各行各业己经得到广泛应用, 但从国内生产的温度控制器来说, 总体发展水平仍然不高, 同美国、 日本、 德国等先进发达国家相比, 仍有着较大的差距。 20世纪70年代, 国外就对温度控制技术有研究。 先是采用模拟式的组合仪表, 采集现场信息并进行指示、 记录和控制。 80年代末就出现了分布式控制系统。 现在正在开发和研制计算机数据采集控制系统的多因子综合控制系统。 现在世界各国的温度测控技术发展很快, 一些国家在实现自动化的基础上正向着完全自动化、 无人化的方向发展。 我国研究温度测控技术较晚, 20世纪80年代开始, 在吸收发达国家温度测控技术的基础上, 我国工程技术人员才掌握了温度室内微机控制技术, 这项技术仅限于对温度的单项环境因子的控制。 我国温度测控设施的计算机应用, 在总体上正从消化吸收、 简单应用阶段过渡和发展。在技术上, 以单片机控制的单参数单回路系统居多, 尚无真正意义上的多参数综合控制系统, 与发达国家相比, 存在较大差距。

2 设计的内容及性能指标

本设计主要是介绍了单片机控制下的温度报警系统, 详细介绍了其硬件和软件设计,并对其各功能模块做了详细介绍, 其主要功能和指标如下: 单片机实时检测温度传感器DS18B20 的状态, 并将 DS18820 得到的数据进行处理。 上电后数码管显示当前的环境温度,通过按键可设置高低温报警值, 当检测到的温度高于设置的报警值的时候, 蜂鸣器报警同时报警灯闪烁, 温度检测精确到 0. 1 度。并具有掉电保存功能, 数据保存在单片机内部 EEPOM中, 进入设置界面后如果没有键按下系统会在 15 秒后自动退出设置界面。

3 系统方案比较、 设计与论证该系统主要由温度测量和温度设置及系统状态显示三部分电路组成, 下面介绍实现此系统功能的方案。

3.1 主控制器模块

采用 STC89C52 单片机作为整个系统的核心, 用其控制行进中的小车, 以实现其既定的性能指标。 充分分析我们的系统, 其关键在于实现小车的自动控制, 而在这一点上, 单片机就显现出来它的优势——控制简单、 方便、 快捷。 这样一来, 单片机就可以充分发挥其资源丰富、 有较为强大的控制功能及可位寻址操作功能、 价格低廉等优点。 STC89C52 单片机具有功能强大的位操作指令, I/O 口均可按位寻址, 程序空间多达 8K, 对于本设计也绰绰有余, 更可贵的是 STC89C52 单片机价格非常低廉。

3.2 温度测量

采用数字温度芯片 DS18B20 测量实际温度, 输出信号全数字化。 便于单片机处理及控制, 省去传统的测温方法的很多外围电路。 且该芯片的物理化学性很稳定, 它能用做工业测温元件, 此元件线形较好。 在0—100 摄氏度时, 最大线形偏差小于1摄氏度。 DS18B20的最大特点之一采用了单总线的数据传输, 由数字温度计 DS18B20和微控制器 STC89C52构成的温度测量装置, 它直接输出温度的数字信号, 可直接与计算机连接。 这样, 测温系统的结构就比较简单, 体积也不大。 采用51单片机控制, 软件编程的自由度大, 可通过编程实现各种各样的算术算法和逻辑控制, 而且体积小, 硬件实现简单, 安装方便。 既可以单独对多 DS18B20控制工作, 还可以与 PC 机通信上传数据, 另外 AT89C51在工业控制上也有着广泛的应用, 编程技术及外围功能电路的配合使用都很成熟。

3.3 设置温度
采用键盘输入设置温度, 键盘则可以用4个按键, 一个复位键, 一个功能设定键, 一个加减一个减键。 四个键比较常用, 而且用到的接口得到了极好的利用, 仅需要4个接口。

3.4 显示模块
用 LED 数码管实现数值的显示, LED 数码管显示相对来说比较直观、 明亮, 可以用动态显示和静态显示两种方法编程实现, 数码管由于显示速度快, 使用简单, 显示效果简洁明了而得到了广泛应用。 LCD 虽然其显示清晰, 显示内容丰富、 清晰, 显示信息量大,使用方便, 显示快速。 但对于此系统我们不需要显示丰富的内容, 而且 LCD 液晶价格贵,因此我们选择用数码管显示。

3.5 电源选取
采用干电池供电。 干电池价格低廉、 携带方便、 运用灵活, 经过实验验证系统工作时, 单片机、 传感器的工作电压稳定能够满足系统的要求, 而且电池更换方便。

3.6 报警设备的论证与选择

采用声、 光同时报警, 既可以利用不同颜色的等对应不同的状态判别出此时的温度处于的状况, 又可以使工作人员在一定距离范围内监测到温度异常进行及时处理。

4 系统器件选择

. 温度传感器的选择
由于传统的热敏电阻等测温元件测出的一般都是电压, 再转换成对应的温度, 需要比较多的外部元件支持, 且硬件电路复杂, 制作成本相对较高。 这里采用 DALLAS 公司的数字温度传感器 DS18B20 作为测温元件。
数显温度传感器 DS18B20 作为测温元件

5 硬件实现及单元电路设计

5.1 主控制模块

主控制最系统电路如图 4 所示。
主控制最系统电路如图
图 4 单片主控电路

5.2 显示模块电路

显示采用四位数码管显示, 当位选打开时, 送入相应的段码, 则相应的数码管打开,关掉位选, 打开另一个位选, 送入相应的段码, 则数码管打开, 而每次打开关掉相应的位选时, 时间间隔低于20ms, 从人类视觉的角度上看, 就仿佛是全部数码管同时显示的一样。显示电路如图5
数码管显示电路
5.3 数码管显示驱动电路

三极管 8550 来驱动 4 位数码管, 不仅简单, 而且价格便宜。
数码管显示驱动电路


5.4 温度传感器(DS18B20)电路

5. 4. 1 DS18B20 基本介绍

DS18B20 是美国 DALLAS 半导体公司推出的第一片支持“一线总线” 接口的温度传感器, 它具有微型化、 低功耗、 高性能、 抗干扰能力强、 易配微处理器等优点, 可直接将温度转化成串行数字信号处理器处理。 DS18B20 进行精确的温度转换, I/O 线必须保证在温度转换期间提供足够的能量, 由于每个 DS18B20 在温度转换期间工作电流达到 1mA, 当几个温度传感器挂在同一根 I/O 线上进行多点测温时, 只靠 4. 7K 上拉电阻就无法提供足够的能量, 会造成无法转换温度或温度误差极大。因此, 下图电路只适应于单一温度传感器测温情况下使用, 不适宜采用电池供电系统中。 并且工作电源 VCC 必须保证在 5V, 当电源电压下降时, 寄生电源能够汲取的能量也降低, 会使温度误差变大。
温度传感器(DS18B20)电路引脚图

5. 4. 2 DS18B20 控制方法DS18B20 有六条控制命令:
温度转换 44H 启动 DS18B20 进行温度转换
读暂存器 BEH 读暂存器 9 个字节内容
写暂存器 4EH 将数据写入暂存器的 TH、 TL 字节
复制暂存器 48H 把暂存器的 TH、 TL 字节写到 E2RAM 中
重新调 E2RAM B8H 把 E2RAM 中的 TH、 TL 字节写到暂存器 TH、 TL 字节
读电源供电方式 B4H 启动 DS18B20 发送电源供电方式的信号给主 CPU

5. 4. 3 DS18B20 供电方式

DS18B20可以采用两种方式供电, 一种是采用电源供电方式, 此时 DS18B20的1脚接地,2脚作为信号线, 3脚接电源。 另一种是寄生电源供电方式, 如图3. 1所示单片机端口接单线总线, 为保证在有效的 DS18B20时钟周期内提供足够的电流, 可用一个三极管来完成对总线的上拉。 本设计采用电源供电方式, P2. 2口接单线总线为保证在有效的 DS18B20时钟周期内提供足够的电流, 可用一个上拉电阻和 STC89C52的 P2. 2来完成对总线的上拉。 当DS18B20处于写存储器操作和温度 A/D 变换操作时, 总线上必须有强的上拉, 上拉开启时间最大为10 μ s。 采用寄生电源供电方式是 VDD 和 GND 端均接地。 由于单线制只有一根线,因此发送接收口必须是三状态的。 主机控制 DS18B20完成温度转换必须经过3个步骤: 

l 初始化。
l ROM 操作指令。
l 存储器操作指令。

5. 6 蜂鸣器、 发光二极管报警电路

电路如图8主要是用来设定温度报警温度的、 有高温和低温报警。

 蜂鸣器、 发光二极管引脚图

6 系统软件设计

6. 1 程序结构分析

主程序调用了 3 个子程序, 分别是数码管显示程序、 温度信号处理程序、 按键设定报
警温度程序。 温度信号处理程序: 对温度芯片送过来的数据进行处理, 进行判断和显示。 数码管显示程序: 向数码管的显示送数, 控制系统的显示部分。 按键设定程序: 可以设定低温和高温报警可精确到 0. 1 度。

6. 2 系统程序流图

主程序的主要功能是负责温度的实时显示、 读出并处理 DS18B20 的测量的当前温度值,温度测量每 1s 进行一次。 这样可以在一秒之内测量一次被测温度, 主程序的主要功能是负责温度的实时显示, 读出并处理 DS18B20 的当前温度值, 与设定的报警温度比较, 其程序流程见图 9 所示。通过调用读温度子程序把存入内存储中的整数部分与小数部分开分存放在不的的两个单元中, 然后通过调用显示子程序显示出来。
数显温度流程图
6. 2. 1 DS18B20初始化程序流程图在 DS18B20 工作之前需要进行初始化, 流程图如下:
数显温控器初始化程序流程图

6. 2. 2 读温度子程序流程图

读温度子程序的主要功能是从DS18B20中读出温度数据, 移入温度暂存器保存。 其程序流程图如下:
读温度子程序流程图

7 系统的安装与调试

7. 1 安装步骤

1. 检查元件的好坏

按电路图买好元件后首先检查买回元件的好坏, 按各元件的检测方法分别进行检测,一定要仔细认真。 而且要认真核对原理图是否一致, 在检查好后才可上件、 焊件, 防止出现错误焊件后不便改正。

2. 放置、 焊接各元件

按原理图的位置放置各元件, 在放置过程中要先放置、 焊接较低的元件, 后焊较高的和要求较高的元件。 特别是容易损坏的元件要后焊, 在焊集成芯片时连续焊接时间不要超过 10s, 注意芯片的安装方向。

7. 2 电路的调试

首先烧入显示程序, 看显示正不正常。 在调试程序时, 发现有的指令用的不正确, 导
致电路功能不能完全实现, 另外软件程序中的延时有的过长、 有的过短。 类似的现象还有
很多就不一一列举了。

7. 3 本章小结

本章的主要内容是电路的测试和调试注意事项

结 论

本温度报警器, 通过单片机实时检测温度传感器 DS18B20的状态, 并将 DS18820得到的数据进行处理。 上电后数码管显示当前的环境温度, 通过按键可设置高低温报警值, 当检测到的温度高于设置的报警值的时候, 蜂鸣器报警同时报警灯闪烁, 温度检测精确到0. 1度。 并具有掉电保存功能, 数据保存在单片机内部 EEPOM 中, 进入设置界面后如果没有键按下系统会在15秒后自动退出设置界面。 由于采用了4节干电池供电使系统的抗干扰性得到加强。 在软件上, 充分利用了 STC89C52的系统资源, 系统运行流畅。本设计结构简单, 调试方便, 系统反映快速灵活, 经实验测试, 该温度报警系统设计方案正确、 可行, 各项指标稳定、 可靠。


附录 1 整体电路原理图
数显温控器整体电路原理图
附录 2 部分源程序:

#include <reg52.h>
#include "eepom52.h"
#define uchar unsigned char
#define uint unsigned int
//数码管段选定义 0 1 2 3 4 5 6 7 8 9
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //断码
//数码管位选定义
uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};
uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
uchar smg_i = 3; //显示数码管的个位数
sbit dq = P2^4; //18b20 IO 口的定义
sbit beep = P2^5; //蜂鸣器 IO 口定义
uchar a_a;
uint temperature ; //
bit flag_300ms ;
uchar key_can;
//按键值的变量
uchar menu_1; //菜单设计的变量
uint t_high = 300,t_low = 100;
bit flag_lj_en;
//按键连加使能
bit flag_lj_3_en; //按键连 3 次连加后使能 加的数就越大了
uchar key_time,flag_value; //用做连加的中间变量
bit key_500ms ;
uchar flag_clock;
uchar zd_break_en,zd_break_value; //自动退出设置界面
/***********************1ms 延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/***********************小延时函数*****************************/
void delay_uint(uint q)
{
while(q--);
}
/***********************数码显示函数*****************************/
void display()
{
uchar i;
for(i=0;i<smg_i;i++)
{
P3 = smg_we[i];
//位选
P1 = dis_smg[i];
//段选
delay_1ms(1);
P3 = 0xff;
//位选
P1 = 0xff;
//消隐
}
}
/******************把数据保存到单片机内部 eepom 中******************/
void write_eepom()
{
SectorErase(0x2000);
byte_write(0x2000, t_high % 256);
byte_write(0x2001, t_high / 256);
byte_write(0x2002, t_low % 256);
byte_write(0x2003, t_low / 256);
byte_write(0x2055, a_a);
}
/******************把数据从单片机内部 eepom 中读出来*****************/
void read_eepom()
{
t_high = byte_read(0x2001);
t_high <<= 8;
t_high |= byte_read(0x2000);
t_low = byte_read(0x2003);
t_low <<= 8;
t_low |= byte_read(0x2002);
a_a = byte_read(0x2055);
}
/***********************18b20 初始化函数*****************************/
void init_18b20()
{
bit q;
dq = 1;
//把总线拿高
delay_uint(1); //15us
dq = 0;
//给复位脉冲
delay_uint(80);
//750us
dq = 1;
//把总线拿高 等待
delay_uint(10);
//110us
q = dq;
//读取 18b20 初始化信号
delay_uint(20);
//200us
dq = 1;
//把总线拿高 释放总线
}
/*************写 18b20 内的数据***************/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
//写数据是低位开始
dq = 0;
//把总线拿低写时间隙开始
dq = dat & 0x01; //向 18b20 总线写数据了
delay_uint(5); // 60us
dq = 1;
//释放总线
dat >>= 1;
}
}
/*************读取 18b20 内的数据***************/
uchar read_18b20()
{
uchar i,value;
for(i=0;i<8;i++)
{
dq = 0;
//把总线拿低读时间隙开始
value >>= 1; //读数据是低位开始
dq = 1;
//释放总线
if(dq == 1)
//开始读写数据
value |= 0x80;
delay_uint(5); //60us 读一个时间隙最少要保持 60us 的时间
}
return value;
//返回数据
}
/*************读取温度的值 读出来的是小数***************/
uint read_temp()
{
uint value;
uchar low;
//在读取温度的时候如果中断的太频繁了, 就应该把中断给关了, 否则
会影响到 18b20 的时序
init_18b20(); //初始化 18b20
write_18b20(0xcc); //跳过 64 位 ROM
write_18b20(0x44); //启动一次温度转换命令
delay_uint(50);
//500us
init_18b20(); //初始化 18b20
write_18b20(0xcc); //跳过 64 位 ROM
write_18b20(0xbe); //发出读取暂存器命令
EA = 0;
low = read_18b20(); //读温度低字节
value = read_18b20(); //读温度高字节
EA = 1;
value <<= 8;
//把温度的高位左移 8 位
value |= low; //把读出的温度低位放到 value 的低八位中
value *= 0.625; //转换到温度值 小数
return value;
//返回读出的温度 带小数
}
/*************定时器 0 初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器 0、 定时器 1 工作方式 1
ET0 = 1;
//开定时器 0 中断
TR0 = 1;
//允许定时器 0 定时
}
/****************独立按键处理函数************************/
void key()
{
static uchar key_new = 0,key_old = 0,key_value = 0;
if(key_new == 0)
{
//按键松开的时候做松手检测
if((P2 & 0x0f) == 0x0f)
key_value ++;
else
key_value = 0;
if(key_value >= 10)
{
write_eepom();
key_value = 0;
key_new = 1;
flag_lj_en = 0; //关闭连加使能
flag_lj_3_en = 0; //关闭 3 秒后使能
flag_value = 0;
//清零
}
}
else
{
if((P2 & 0x0f) != 0x0f)
key_value ++; //按键按下的时候
else
key_value = 0;
if(key_value >= 7)
{
key_value = 0;
key_new = 0;
flag_lj_en = 1; //连加使能
zd_break_en = 1; //自动退出设置界使能
zd_break_value = 0; //自动退出设置界变量清零
}
}
key_can = 20;
if(key_500ms == 1)
{
key_500ms = 0;
zd_break_en = 1; //自动退出设置界使能
zd_break_value = 0; //自动退出设置界变量清零
key_new = 0;
key_old = 1;
}
if((key_new == 0) && (key_old == 1))
{
switch(P2 & 0x0f)
{
case 0x0e: key_can = 4; break; //得到 k1 键值
case 0x0d: key_can = 3; break; //得到 k2 键值
case 0x0b: key_can = 2; break; //得到 k3 键值
case 0x07: key_can = 1; break; //得到 k4 键值
}
}
key_old = key_new;
}
/****************按键处理数码管显示函数***************/
void key_with()
{
if(key_can == 4)
{
menu_1 ++;
if(menu_1 >= 3)
{
menu_1 = 0;
}
if(menu_1 == 0)
{
dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示
dis_smg[1] = smg_du[temperature / 10 % 10] & 0x7f; //取温度的个位显示
dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示
smg_i = 3;
}
if(menu_1 == 1)
{
dis_smg[0] = smg_du[t_high % 10]; //取小数显示
dis_smg[1] = smg_du[t_high / 10 % 10] & 0x7f; //取个位显示
dis_smg[2] = smg_du[t_high / 100 % 10] ; //取 low 十位显示
dis_smg[3] = 0x89;
smg_i = 4;
}
if(menu_1 == 2)
{
dis_smg[0] = smg_du[t_low % 10]; //取 low 小数显示
dis_smg[1] = smg_du[t_low / 10 % 10] & 0x7f; //取个位显示
dis_smg[2] = smg_du[t_low / 100 % 10] ; //取十位显示
dis_smg[3] = 0xc7;
smg_i = 4;
}
}
if(menu_1 == 1)
//设置高温报警
{
if(key_can == 3)
{
if(flag_lj_3_en == 0)
t_high ++ ;
//按键按下未松开自动加三次
else
t_high += 10; //按键按下未松开自动加三次之后每次自动加 10
if(t_high > 990)
t_high = 990;
dis_smg[0] = smg_du[t_high % 10]; //取小数显示
dis_smg[1] = smg_du[t_high / 10 % 10] & 0x7f; //取个位显示
dis_smg[2] = smg_du[t_high / 100 % 10] ; //取十位显示
dis_smg[3] = 0x89; //H
}
if(key_can == 1)
{
if(flag_lj_3_en == 0)
t_high -- ; //按键按下未松开自动加三次
else
t_high -= 10; //按键按下未松开自动减三次之后每次自动减 10
if(t_high <= t_low)
t_high = t_low + 1;
dis_smg[0] = smg_du[t_high % 10]; //取小数显示
dis_smg[1] = smg_du[t_high / 10 % 10] & 0x7f; //取个位显示
dis_smg[2] = smg_du[t_high / 100 % 10] ; //取十位显示
dis_smg[3] = 0x89; //H
}
// write_eepom();
}
if(menu_1 == 2)
//设置低温报警
{
if(key_can == 3)
{
if(flag_lj_3_en == 0)
t_low ++ ;
else
t_low += 10;
if(t_low >= t_high)
t_low = t_high - 1;
dis_smg[0] = smg_du[t_low % 10]; //取小数显示
dis_smg[1] = smg_du[t_low / 10 % 10] & 0x7f; //取个位显示
dis_smg[2] = smg_du[t_low / 100 % 10] ; //取十位显示
dis_smg[3] = 0xc7; //L
}
if(key_can == 1)
{
if(flag_lj_3_en == 0)
t_low -- ;
else
t_low -= 10;
if(t_low <= 10)
t_low = 10;
dis_smg[0] = smg_du[t_low % 10]; //取小数显示
dis_smg[1] = smg_du[t_low / 10 % 10] & 0x7f; //取个位显示
dis_smg[2] = smg_du[t_low / 100 % 10] ; //取十位显示
dis_smg[3] = 0xc7; //L
}
// write_eepom();
}
}
/****************报警函数***************/
void clock_h_l()
{
if((temperature <= t_low) || (temperature >= t_high))
{
flag_clock = 1;
}
else
{
flag_clock = 0;
beep = 1;
}
}
void main()
{
temperature = read_temp();
//先读出温度的值
time_init(); //初始化定时器
read_eepom();
if(a_a == 0xff)
//新的单片机初始单片机内问 EEPOM
{
t_high = 300;
t_low = 100;
a_a = 1;
write_eepom();
}
delay_1ms(650);
temperature = read_temp();
//先读出温度的值
dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示
dis_smg[1] = smg_du[temperature / 10 % 10] & 0x7f; //取温度的个位显示
dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示
while(1)
{
display();
//显示函数
key();
//按键程序
if(key_can < 10)
{
key_with();
//设置报警温度
}
temperature = read_temp(); //先读出温度的值
if(flag_300ms == 1) //300ms 处理一次温度程序
{
clock_h_l(); //报警函数
if(flag_clock == 1)
beep = ~beep;
flag_300ms = 0;
if(menu_1 == 0)
{
smg_i = 3;
dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示
dis_smg[1] = smg_du[temperature / 10 % 10] & 0x7f; //取温度的个位显示
dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示
}
if(zd_break_en == 1) //自动退出设置界面程序
{
zd_break_value ++; //每 300ms 加一次
if(zd_break_value > 50) //15 秒后自动退出设置界面
{
menu_1 = 0;
zd_break_en = 0;
zd_break_value = 0;
}
}
}
}
}
/*************定时器 0 中断服务程序***************/
void time0_int() interrupt 1
{
static uchar value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
if(value % 6 == 0)
{
flag_300ms = 1; //300ms
value = 0;
}
if(flag_lj_en == 1) //按下按键使能
{
key_time ++;
if(key_time >= 10) //500ms
{
key_time = 0;
key_500ms = 1; //500ms
flag_value ++;
if(flag_value > 3)
{
flag_value = 10;
flag_lj_3_en = 1; //3 次后 1.5 秒连加大些
}
}
}
}

此文关键字:led数显温控器,led数显温度控制器

FPC柔性线路板 LED数码管显示屏 led触控方案开发