基于51单片机的温度控制系统的设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于单片机的温度控制系统设计
1、设计要求
要求设计一个温度测量系统,在超过限制值的时候能进行声光报警。

具体设计要求如下:
①数码管或液晶显示屏显示室内当前的温度;
②在不超过最高温度的情况下,能够通过按键设置想要的温度并显示;设有四个按键,分别就是设置键、加 1 键、减 1 键与启动/复位键;
③DS18B20温度采集;
④超过设置值的芳C时发出超限报警,采用声光报警,上限报警用红灯指示,下限报警用黄灯指示,正常用绿灯指示。

2、方案论证
根据设计要求,本次设计就是基于单片机的课程设计, 由于实现功能比较简单我们学习中接触到的51 系列单片机完全可以实现上述功能, 因此可以选用
AT89C51单片机。

温度采集直接可以用设计要求中所要求的DS18B20。

报警与指示模块中,可以选用 3 种不同颜色的LED 灯作为指示灯,报警鸣笛采用蜂鸣器。

显示模块有两种方案可供选择。

方案一:使用LED 数码管显示采集温度与设定温度;
方案二:使用LCD 液晶显示屏来显示采集温度与设定温度。

LED 数码管结构简单, 使用方便,但在使用时,若用动态显示则需要不断更改位选与段选信号,且显示时数码管不断闪动,使人眼容易疲劳;若采用静态显示则又需要更多硬件支持。

LCD 显示屏可识别性较好,背光亮度可调,而且比LED 数码管显示更多字符,但就是编程要求比LED 数码管要高。

综合考虑之后,我选用了LCD 显示屏作为温度显示器件, 由于显示字符多,在进行上下限警戒值设定时同样可以采集并显示当前温度, 可以直观的瞧到实际温度与警戒温度的对比。

LCD 显示模块可以选用RT1602C。

3、硬件设计
根据设计要求,硬件系统主要包含6个部分,即单片机时钟电路、复位电路、键盘接口模块、温度采集模块、LCD显示模块、报警与指示模块。

其相互联系如下图1所示:
图1硬件电路设计框图
3、1单片机时钟电路
形成单片机时钟信号的方式有内部
时钟方式与外部时钟方式。

本次设计采用
内部时钟方式,如图2所示。

单片机内部有一个用于构成振荡器
的高增益反相放大器,引脚XTAL1与
XTAL2分别为此放大器的输入端与输出端,
其频率范围为1、2~12MHz,经由片外晶体
振荡器或陶瓷振荡器与两个匹配电容一起
形成了一个自激振荡电路,为单片机提供时钟源。

3、2复位电路
复位就是单片机的初始化操作,其作用就是使CPU与系统中的其她部件都处于一个确定的初始状态,并从这个状态开始
工作,以防止电源系统不稳定造成CPU 工作
不正常。

在系统中,有时会出现工作不正常
的情况,为了从异常状态中恢复,同
图2单片机内部时钟方式电路
图3单片机按键复位电路
时也为了系统调试方便,需要设计一个复位电路。

单片机的复位电路有上电复位与按键复位两种形式 ,因为本次设计要求需要 有启动/复位键,因此本次设计采用按键复位,如图3。

复位电路主要完成系统的上 电复位与系统在运行时用户的按键复位功能。

3、3键盘接口模块
本次设计需要的按键有 4个,除去 圖 一个复位按键外,还有3个功能按键,因 千 口
此选择独立式键盘。

如图4,将键盘直接 与单片机 P1 口的 P1、0、P1、1、P1、 2相连。

3个键设计思路如下:当按下S1 键时,系统进入上下限警戒值调整状态; 当第一次按下S1键时,进行上限警戒值 设定,当第二次按下S1键时,进行下限警 戒值设定,当第三次按下S1键时,回到正常工作
状态。

在警戒值调整状态下,按下 S2键,上下限警戒值加1,按下S3键,上下限警戒值减1,正常工作状态下,按下S2 与S3键无作用。

3、4温度采集模块
本次设计中的温度传感器使用的就是 DALLAS 公司的单总线数字温度传感 器DS18B20,这就是一种常用的温度传感器,具有体积小、硬件开销低、抗干扰能 力强、精度高的特点。

DS18B20采用独特的一线接口,具有只需要一条口线通信多点的能力,简化了 分布式温度传感应用,无需外部元件。

可用数据总线供电,电压范围为3、0 V 至5、 5V,测量温度的范围为-55C 至+125 C ,在-10C 至+85C 范围内精度为±)、5C 。

图4键盘接口模块
S3
温度传感器可编程的分辨率为 9~12位,温度转换为12位数字格式最大值为 750毫秒,用户可定义的非易失性温度报警设置,应用范围包括恒温控制、工业系
统、消费电子产品温度计、或任何热敏感系统。

由于
DS18B20就是一条口线通
信,所以中央微处理器与DS18B20只有一个一条口线连接。

因为每一个DS18B20 的包含一个独特的序号,多个DS18B20可以同时存在于一条总线,这使得温度传 感器放置在许多不同的地方。

它的用途很多,包括空调环境控制,感测建筑物内温 设备或机器,并进行过程监测与控制。

图5 DS18B20封装及引脚
DS18B20的核心功能就是它的直接读数字的温度传感器。

温度传感器的精 度为用户可编程的9、10、11或12位,分别以0、5C ,0、25C ,0、125 E 与0、0625C 增量递增。

在上电状态下默认的精度为 12位。

DS18B20启动后保持低功耗等待 状态;当需要执行温度测量与AD 转换时,总线控制器必须发出[44h ]命令。

在那之 后,产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器
中QS18B20继续保持等待状态。

当 DS18B20由外部电源供电时,总线控制器在 温度转换指令之后发起“读时序”
QS18B20正在温度转换中返回0,转换结束返
回1。

如果DS18B20由寄生电源供电,除非在进入温度转换时总线被一个强上拉 拉高,否则将不会由返回值。

在硬件上QS18B20与单片机的连接有两种方法:一种就是VDD 接外部电 源,GND 接地,DQ 与单片机的I/O 口相连;另一种就是用寄生电源供电,此时,VDD 、 GND 接地,DQ 接单片机的I/O 口。

无论就 是接外部电源还就是用内部寄生电源 ,I/O 口线要接5k Q 左右的上拉电阻。

本次设计中,采用外部电源方式,其连
GND
DALLAS
DS1B20
1 2 3
sh 】1 NC
7
1 NC
©
]NC
5
可脚
功能 GND
接地
DQ
数掳输入丿输出,对于单线操 作,漏概幵路°当工作在寄生 电源棋式时用来提供电瀬<■
VDD
可选的VDD 引即。

工作于寄 生电源橫式时VDD 必须接地心
HOTTCJM VII-W
DS IKB20 To-^2
NC
口1
NC III v m czn DU [ "[J
接方式如图6所示。

单总
线DQ端接单片机的
P1、7 口,DQ端接一个
4、7k Q的上拉电阻,
这样单总线DQ在闲置状
态时为高电平。

图6 DS18B20外部电源连接方式
3、5 LCD显示模块
在本次设计中,使用RT1602C字符型液晶显示模块(LCM)来设计当前温度与上下限警戒值的显示电路。

RT1602C字符型液晶显示模块就是16字X 2行的采用5X 7点阵图形来显示字符的液晶显示器,采用标准的16脚接口,其引脚定义如图7所示。

图7 RT1602C的引脚定义
RT1602C的内部结构可以分为3个部分:LCD控制器、LCD驱动器、LCD
显示器,其中LCD控制器采用的就是HD44780。

RT1602C与单片机的连线如图8所示。

LCM的数据总线与单片机的P0 口通过一个上拉电阻排相连丄CM的三条控制线RS、RW、EN分别与单片机的I/O 口P2、0、P2、1、P2、2相连,第1、2 引脚分别与地、电源相连,第3引脚使用一个10k Q的可调电阻对显示屏的明亮进行调整。

亮黄色发光二极管。

整个报警与指示电路如图9所示,其中绿、红、黄色指示灯分别接单片机P2、0、P2、1、P2、2 口,电平拉低时点亮LED,蜂鸣器电路接单片机的P2、7 口,电平拉高时蜂鸣器响。

至此便完成了整个硬件电路的设计工作,整个系统的原理图见附录二,系统
声;温度在正常范围内时,点图9报警与指示模块
3、6报警与指示模块
发光二极管,蜂鸣器发出响
I/O分配表如下:
I/O 口功能说明I/O 口功能说明
PO、0~P0、7 LCM数据口P2、1 LCM读/写控制
P1、0~P1、3 键盘输入P2、2 LCM使能P1、7 DS18B20温度米集P2、4~P2、6 LED信号输出
P2、0 LCM数据/命令控制P2、7 报警信号输出
4、软件设计
单片机应用系统的设计中,软件设计占有重要的位置。

在本次设计中,根据功能要求,可以把系统程序划分为5个模块,即主程序模块、显示模块、温度测量模块、键盘扫描模块、其它子程序模块,如图10所示。

图10软件设计框图
4、1主程序设计
主程序的内容包括单片机初始化、相关部件初始化与一些其它子程序的调用等。

主程序清单如下,程序流程图如图11所示。

.主稈^序************/
void main (void)
P1=0xff; //初始化P1 口以便读入P2|=0x70;
P2&=0x7f;
Temp_set 仁90; Temp_set2=10; Delay(500);
ini t_LCD();
in it_18B20(); Display_str(0,0,str2); Display_str(0,1,str2); Delay(2000); Display_str(0,0,str0); //上限报警温度初值90
//下限报警温度初值10
//延时500ms启动
//LCD初始化//DS18B20
初始化
//开机界面
//开机界面
图11主程序流程图
Display_str(0,1,str1);
while(1)
{
Key_sca n(); //扫描键盘
Read_temp(); 〃读取温度
Cha nge();
Display(); //显示
Alarm(); //指示灯与报警程序
Delay(1000);
}
}
4、2显示模块
显示程序主要完成的功能就是模式、上下限警戒值与测量温度值的显示,
模块中包含LCD初始化、显示单个字符子函数、显示一个字符串子函数。

程序流
程图如图12所示丄CD初始化程序如下,其它子函数程序详见附录一。

*LCD 初始化
void ini
t_LCD(void)
{
P0=0; Delay(15);
LCD_Comma nd(0x38,0); Delay(5);
LCD_Comma nd(0x38,0); Delay(5);
LCD_Comma nd(0x38,0); Delay(5);
LCD_Command(0x38,1); 〃8位数据传送,2行显示,5*7字形 LCD_Comma nd(0x08,1); // 关闭显示 LCD_Comma nd(0x01,1); // 清屏
LCD_Comma nd(0x06,1); //显示光标右移设置
LCD_Command(0x0c,1); //显示屏打开,光标不显示不闪烁 }
4、3温度测量模块
温度测量程序主要功能就是读出数字温度传感器的温度值。

要正确地读出温 度值必须严格遵守单总线器件的命令序列,否则单总线器件不会响应主机。

单总 线器件的命令序列如图13所示。

温度测量模块程序流程图如图14所示QS18B20初始化程序如下,其它子程 序详见附录一。

void in it_18B20(void) {
uchar x=0; DQ=1;
〃DQ 复位
Delay_us(4); // 延时 DQ=0;
//将DQ 拉低
Delay_us(250); //精确延时大于 480us DQ=1; //拉高总线
Delay_us(40);
图12显示程序流程图
DS18B20 初始化
*********** */ DS18B20
存在?
N
x=DQ; Delay_us(20);
已介绍。

键盘扫描程序如下,其它子程序详见附录一,相关流程图如图15所示
void Key_sca n(v oid) {
uchar temp; P1=0xff; if(P1!=0xff) {
Delay(20); //延时消抖 if(P1!=0xff) {
temp=P1; switch(temp) {
case 0xfe:Key_set();break;
〃P1、0按下,功能选择
case 0xfd:Key_i nc();break;
本次设计中使用了 4个按键,除了
图14温度测量程序流程图
1个复位键还有3个功能键,具体功能前面 键盘扫描
4、4键盘扫描模3块单总线命令序列
case Oxfb:Key_dec();break;
〃P1、2按下,数字减一
default:break;
}
}
}
} 图15键盘扫描程序流程图
4、5其它子程序
程序中使用的其它子程序,包括延时子程序、显示字符转换子程序等,具体详 见附录一。

5、仿真分析
在本次的设计中,使用了 Proteus 仿真软件进行了功能测试,具体仿真步骤及 分析如下
(1) 按照原理图,从Proteus 元件库中找出对应元件,搭建硬件仿真电路,将程序烧写 到单片机中,仿真图见附录三。

(2) 点击运行按钮开始仿真,初始上下限值为90C 与10C ,当前温度为25C ,当前模
图16正常模式下仿真图
(3) 按下S1键,进入上限警戒值设置模式 H,此时按S2、S3键可以进行上限值设式为N 正常工作,绿灯亮,蜂鸣器不响,如图16
b DnrD p h, can
RF1

同时温度正常显示,设置上限值80C ,如图17
(4) 再次按下S1键,进入下限图戒值设置模值设定仿真时按S2、S3键可以进行下限值
设定,同时温度正常显示,设置下限值20C ,如图18
图18下限值设定仿真图
(5)再次按下S1键,返回正常模式N,调节DS18B20温度,测量温度随之改变,降低 温度,超过下限值5C 以下时黄灯亮,蜂鸣器报警,如图19。

图19下限报警仿真图
I ■ RP1 >M B W Mb *4 匕計「M 一 ■■. ■
匚 1 H i = 8&C L GM =1 de fl 口
de : H De5 s 25C ■- ■ 4 I
rnr*»a
*3?
%卩鼻・ FT !i*l
PJ i-2 ^i*4- s p
J-ifliAl 2 I 卜-
Flagi E
KI ||WL^ ro J^D3 M uk
炉XU
F 3* rn^niri* M I * iul a PT ' t*r *
FT 、yr
“ Y 亠
护J 叶』
Ki imD 冉I 巴2电I n<
3i«jn p>
3<nr~
Eh 赋■対
I 3 F.lN ・
(6)升高温度,超过上限值5C以上时黄灯亮,蜂鸣器报警,如图20。

r
^ss
^VW
p-i-ygSE ■I
■1 "!«M
• 'FT
(7)按下S4键,单片机复位。

图20上限报警仿真图
在本次仿真中,可以瞧出,本次设计的硬件电路与软件程序均能成功仿真出来
设计要求的各种功能均已达到。

6、总结
本次课程设计为期一周,到此已全部结束。

回想一周中的设计过程,我深深感觉收获良多。

由于从前只就是在理论上学习了单片机以及各种其它知识,即使就是实验也只就是按照实验指导书进行操作,并没有实际的独立设计一个系统,因此在刚开始接触本次课程设计时,有一点无从下手的感觉。

后来通过查阅相关资料, 渐渐开始了解课程设计的一般过程,开始明白一些元器件的相关作用与编程实现方法,并在此期间通过不断深入的学习与锻炼,开始渐渐能熟练运用与熟练编程起来。

通过本次计算机控制技术的课程设计,我更深层次的把理论知识与实际设计结合在一起,锻炼了我的综合运用所学的专业基础知识与解决实际工程问题的能力。


时也提升了我查阅文献资料、设计手册、设计规范以及电脑制图等其她知识能力水平。

对各种系统的适用条件,各种设备的选用标准,各种管道的安装方式, 我都就是随着设计的不断深入而逐渐熟悉并学会应用的。

并且,通过对整体的掌控,对局部的取舍,对细节的斟酌处理,以及绘图的技巧都使我在设计领域的能力得到了锻炼,得到了较丰富经验。

最后,通过这次的课程设计,我也深刻地认识到, 只有将书本与具体的实践相结合,才会有真正的收获,才能巩固自己的所学,认识到自己的不足,同时我们也要有一种积极学习的态度,时代在进步我们也要跟着时代前进,要不断学习,不断创新,用自己的知识与行动来证明自己的价值。

本次课程设计以单片机为核心,介绍了用DS18B20 温度传感器进行温度采集并将其传输给AT89C51 单片机进行处理再送到LCD 显示屏显示。

在此期间可以通过按键进行上下限警戒值设置,通过LED 与蜂鸣器进行指示与报警。

本文就是采用模块化的方式进行叙述,对各模块的设计进行了比较详细地阐述,并着重分析硬件搭建过程与系统软件的设计过程,使用单片机 C 语言进行程序没计。

本次设计的基于DS18B20 的温度测量系统就是一个分布式的温度测量系统,它可以远程对温度实现测量与监控,广泛应用于电力工业、煤矿、森林、火灾、高层建筑等场合。

本设计应用性比较强,可以应用在仓库温度、大棚温度、机房温度、水池等的监控。

当然,本次设计还存在一些不足,例如在本次设计中,由于时间较短,警戒值只就是在1~99C之间,没有能够扩展到负温度与100C以上;在本次设计中只就是用了4个独立按键,实现简单的上下限警戒值设定,操作较麻烦,如果能够设计出多按
键的矩阵式键盘,则能够对温度进行很方便的设定。

此外如果把本设计方案扩展为多点温度控制,加上上位机,则可以实现远程温度监控系统,将具有更大的应用价值。

7、参考文献
[1] 潘新民,王燕芳、微型计算机控制技术[M] 、北京:电子工业出版社,2014
[2] 王迎旭、单片机原理与应用[M] 、北京:机械工业出版社,2013
[3] 康华光、电子技术基础[M] 、北京:高等教育出版社,2013
[4] 周正华,唐宁RT1602C与FPGA接口技术[J]、中国科技信息,2008(10)
[5] 廖琪梅,韩彬等、基于DS18B20 的温度测量仪[J] 、国外电子元器
件,2008(2)
附录一:程序清单
#include<reg51、h>
#include<intrins、h>
#include<absacc、h>
#define uchar unsigned char
#define uint unsigned int
#define BUSY 0x80
void Delay(uint);
void init_LCD(void);
void LCD_Command(uchar,uchar);
void LCD_Data(uchar);
void ReadyLCD(void);
void Display_char(uchar,uchar,uchar);
void Display_str(uchar,uchar,uchar code *Data);
void Change(void);
void Display(void);
void init_18B20(void); uchar Read_18B20(void); void Write_18B20(uchar); void Read_temp(void);
void Delay_us(uchar i); void Key_scan(void); void Key_set(void); void Key_inc(void); void Key_dec(void); void Alarm(void);
sbit LCD_RS=P2P;
sbit LCD_RW=P2A1;
sbit LCD_EN=P2A2;
sbit DQ=P1A7;
sbit Normal=P2A4;
sbit Alarm_H=P2A5;
sbit Alarm_L=P2A6; sbit Alarm_BEEP=P2A7;
uchar Set_flag=0;
uchar Temp_mea,Temp_set1,Temp_set2;
uchar Temp_high_1,Temp_high_2;
uchar Temp_low_1,Temp_low_2;
uchar Temp_true_1,Temp_true_2;
extern uchar code str0[]={"High: C Low: C"}; extern uchar code str1[]={"Mode: Deg: C"};
extern uchar code str2[]={" Hellow!! "}; extern uchar code str3[]={"0123456789"}; extern uchar code mode[]={"NHL"};
主程序
void main(void)
P1=0xff;
P2|=0x70;
P2&=0x7f;
Temp_set1=90;
Temp_set2=10;
Delay(500);
init_LCD();
init_18B20();
Display_str(0,0,str2);
Display_str(0,1,str2);
Delay(2000);
Display_str(0,0,str0);
Display_str(0,1,str1);
while(1)
Delay(1000);
}
}
void Delay(uint k) {
uint i,j;
for(i=0;i<k;i++) 延时 kms
// 上限报警温度初值 90 // 下限报警温度初值 10 // 延时 500ms 启动 //LCD 初始化 //DS18B20 初始化 // 开机界面 // 开机界面 {
Key_scan();
Read_temp();
Change();
Display();
Alarm();
// 扫描键盘 // 读取温度 // 显示 // 指示灯与报警程序
for(j=0;j<60;j++)
{
}
显示模块
*LCD 初始化
void init_LCD(void)
{
P0=0;
Delay(15);
LCD_Command(0x38,0);
Delay(5);
LCD_Command(0x38,0);
Delay(5);
LCD_Command(0x38,0);
Delay(5);
LCD_Command(0x38,1); //8 位数据传送,2 行显示,5*7 字形LCD_Command(0x08,1); // 关闭显示
LCD_Command(0x01,1); // 清屏
LCD_Command(0x06,1); // 显示光标右移设置
LCD_Command(0x0c,1); // 显示屏打开,光标不显示不闪烁}写指令数据到LCD********/
void LCD_Command(uchar LC,uchar BC) {
if(BC) ReadyLCD();
P0=LC;
LCD_RS=0; // 选中指令寄存器
LCD_RW=0; // 写模式
LCD_EN=1;
_nop_();
_nop_();
_nop_();
LCD_EN=0;
}
写显示数据到LCD********/ void LCD_Data(uchar LD)
{
ReadyLCD();
P0=LD;
LCD_RS=1; // 选中数据寄存器
LCD_RW=0; // 写模式
LCD_EN=1;
_nop_();
_nop_();
_nop_();
LCD_EN=0;
}
检测LCD忙状态********/ void ReadyLCD(void)
{
P0=0xff;
LCD_EN=1;
LCD_RS=0;
LCD_RW=1;
_nop_();
while(P0&BUSY) {
LCD_EN=0;
_nop_();
_nop_();
LCD_EN=1;
_nop_();
_nop_();
}
LCD_EN=0;
}
显示个字符******* */
void Display_char(uchar X,uchar Y,uchar Data)
{
Y&=0x01;
X&=0x0f;
if(Y) X|=0x40;
X|=0x80;
LCD_Command(X,0);
LCD_Data(Data);
}
显示一串字符********/
void Display_str(uchar X,uchar Y,uchar code *Data) {
uchar List=0;
Y&=0x01;
X&=0x0f; while(X<16) {
Display_char(X,,YData[List]);
List++;
X++;
}
}
显示字型转换********/
void Change(void)
{
Temp_high_1=Temp_set/10;
Temp_high_2=Temp_set1%10;
Temp_low_1=Temp_set/210;
Temp_low_2=Temp_set2%10;
Temp_true_1=Temp_mea/10;
Temp_true_2=Temp_mea%10;
}
显示子程序********/
void Display(void)
{
Display_char(5,0,str3[Temp_high_1]);
Display_char(6,0,str3[Temp_high_2]);
Display_char(13,0,str3[Temp_low_1]);
Display_char(14,0,str3[Temp_low_2]);
Display_char(5,1,mode[Set_flag]);
Display_char(13,1,str3[Temp_true_1]);
Display_char(14,1,str3[Temp_true_2]);
温度测量模块********/
/******** DS18B20 初始化
void init_18B20(void)
{
uchar x=0;
DQ=1; //DQ 复位
Delay_us(4); // 延时
DQ=0; //将DQ拉低
Delay_us(250); // 精确延时大于480us
DQ=1; // 拉高总线
Delay_us(40);
x=DQ;
Delay_us(20);
/******** 从DS18B20读取一个字节数据********/ uchar Read_18B20(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;
_nop_();
dat>>=1;
DQ=1;
Delay_us(1);
if(DQ) dat|=0x80;
Delay_us(10);
} return(dat); }
/******** 向DS18B20写入一个字节数据********/ void Write_18B20(uchar dat)
uchar i=0;
for(i=8;i>0;i--)
DQ=0;
_nop_();
DQ=dat&0x01;
Delay_us(10);
DQ=1;
dat>>=1;
Delay_us(10);
/******** 从DS18B20读取温度********/
void Read_temp(void)
{
uchar a=0;
uchar b=0;
uchar t=0;
init_18B20();
Write_18B20(0xcc);
Write_18B20(0x44);
init_18B20();
Write_18B20(0xcc);
Write_18B20(0xbe);
a=Read_18B20();
b=Read_18B20();
t=b;
t<<=8;
t=t|a;
Temp_mea=t*(0、0625);
}
精确延时********/
void Delay_us(uchar i) {
while(--i);
}
键盘扫描程序********/
void Key_scan(void)
{
uchar temp;
P1=0xff;
if(P1!=0xff)
{
Delay(20); // 延时消抖if(P1!=0xff)
{
temp=P1; switch(temp)
{case 0xfe:Key_set();break; //P1、0 按下,功能选择case
0xfd:Key_inc();break; //P1、1 按下,数字加一case
0xfb:Key_dec();break; //P1、2 按下,数字减一default:break;
}
}
}
}
工作模式子程序********/
void Key_set(void)
{
Set_flag++;
if(Set_flag>=3) 〃Set_flag=1,设定上限值
Set_flag=O; 〃Set_flag=2,设定下限值
按键加一子程序********/
void Key_inc(void)
{
switch(Set_flag)
{
case 1:Temp_set1++;
if(Temp_set1>=99) Temp_set1=99;break;
case 2:Temp_set2++;
if(Temp_set2>=Temp_set1) Temp_set2=Temp_set1;break;
default:break;
****** 按键减一子程序********/
void Key_dec(void)
{
//Delay(150);
switch(Set_flag)
{
case 1:Temp_set1--;
if(Temp_set1<=Temp_set2) Temp_set1=Temp_set2;break;
case 2:Temp_set2--;
if(Temp_set2<=1) Temp_set2=1;break; default:break;
}
}
报警与指示程序********/
void Alarm(void)
{
uchar High;
uchar Low;
High=Temp_set1+5;
Low=Temp_set2-5;
if(Temp_mea>High) {
Normal=1;
Alarm_H=0;
Alarm_L=1;
Alarm_BEEP=1;
else
{if(Temp_mea<Low)
{
Normal=1;
Alarm_H=1;
Alarm_L=0;
Alarm_BEEP=1; } else {
Normal=0;
Alarm_H=1;
Alarm_L=1;
Alarm_BEEP=0;

^rA/w
G
tr
s
附录三:程序仿真图
McmlA.aal
U
D
>
-
-
;
.-|'

LQ
U
A
FI
Q.


UN


td
CUN

Ed
Q
F


XUD




c

H
g
Ka
o
Q
Q



m
^l
h
A
A
A
E
^
a
w
ct
^
L
a
M
-e
?R
g


71
6



p
o

CJ
s
m

• ■ • • ■ •
WCM 爱由

S
S
Q
a
V
Q
<
4
£
oovrlDd Q>E
ZH


14
g。

相关文档
最新文档