您的当前位置:首页正文

温度报警控制系统

2023-08-11 来源:布克知识网
目 录

1.课程设计目的……………………………………………………2 2.课程设计的主要内容和任务分析………………………………2 3.控制系统的总体要求……………………………………………2 4.温度报警控制系统硬件部分设计分析…………………………3 4.1 温度传感器DSl8B20 ………………………………………3 4.2 AT89C51单片机简介 ………………………………………9 4.3 74HC138功能介绍 …………………………………………11 4.4 74HC377功能介绍 …………………………………………12 4.5 74HC245功能介绍 …………………………………………12 4.6 温度报警控制系统电路图……………………………………13 5.温度报警控制系统软件部分设计分析 …………………………14 5.1 程序实现功能…………………………………………………14 5.2 程序流程图……………………………………………………14 5.3温度报警控制程序 ……………………………………………17 6. 系统调试 …………………………………………………………17 课程设计体会…………………………………………………………18 参考文献………………………………………………………………18 附件 ……………………………………………………………………19

1

温度报警控制系统设计

1.设计目的:

1、通过温度报警控制系统的设计,了解数字式温度传感器DS18B20的工作原理及其控制方法;

2、通过温度报警控制系统的设计,掌握单片机AT89C51的结构原理及其控制指令的应用,熟练应用AT89C51完成一个系统的控制;

3、通过温度报警控制系统的设计,使学生了解一个控制系统设计的基本步骤,程序设计的基本方法,培养学生分析问题和解决问题的能力,将理论联系到实践中去,提高我们的动脑和动手的能力,通过课程设计,还可以使学生树立正确的世界观,培养实事求是、严肃认真、具有高度责任感的工作作风;

4、学习完成控制系统的硬件设计、软件设计、仿真调试的过程。

2.课程设计的主要内容和任务分析

任务:以单片机AT89C51作为核心,基于数字式温度传感器DS18B20的功能,

设计一个具有LED显示功能、按键功能、温度检测功能及控制操作功能的控制系统。

内容:设计基于DS18B20的数字式烤箱温度控制系统,控制电路主要包括,

led显示电路、按键电路、温度检测电路及控制电路。控制程序主要包括主程序、读出温度子程序、按键子程序、显示子程序、控制子程序等。要求能检测、显示烤箱温度,并控制烤箱温度在一可设定区域。

3.控制系统的总体要求:

1. 对烤箱温度进行检测及控制。温度显示范围: 0゜C~+99゜C,精度误差 在

2

1゜C以内。

2. 温度控制在设置的上下限范围。

3. 能设置并保存温度上、下限值,并可随时修改。

4. LED数码管直读显示实测温度,设置温度上限温度,下限温度(用键控制设定温度)。

5. 温度超出上、下限值时,报警;根据所测温度所在的界限控制烤箱是否加热。

6. 启/停键用以启动和停止加热,上电复位后,不论启动还是停止状态,人机界面显示烤箱内温度值,同时也要求显示界面区分停止和运行状态。

4.温度报警控制系统硬件部分设计分析: 4.1 温度传感器DSl8B20

由美国DALLAS半导体公司生产的DSl8B20型单线智能温度传感器,属于新一代适配微处理器的智能温度传感器,可广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中,例如多路温度测控仪、中央空调、大型冷库、恒温装置等。此外巧妙利用DSl8B20内部64位激光ROM中具有惟一性的48位产品序号,还可设计成专供大型宾馆客房或军事仓库使用的保密性极佳的电子密码锁。DSl8B20的电源电压范围均扩展到+3~+5.5V,DSl8B20还能对温度分辨力进行编程,选择9位~12位模式下工作,在12位模式下的最高分辨力可达0.0625℃。

4.1.1 DS18B20的性能特点

(1)DSl8B20采用DALLAS公司独特的“单线(1-Wire)总线”专有技术,通过串行通信接口(I/O)直接输出被测温度值(9位二进制数据,含符号位)。

(2)在测温范围是-55~+125℃时,测量误差不超过±2℃,在-10~+85℃范围内,可确保测量误差不超过±0.5℃。温度/数字量转换时间的典型值仅需93.75ms,比DS1820有很大的提高.

3

(3)内含64位经过激光修正的只读存储器ROM,扣除8位产品系列号和8位循环冗余校验码CRC之后,产品序号占48位。出厂前就作为DSl8B20惟一的产品序号,存入其ROM中。在构成大型温控系统时,允许在单线总线上挂接多片DSl8B20。

4.1.2 DS18B20的工作原理

DSl8B20的原理与DS1820的原理是一样的。DS18B20继承了DS1820的所有优点。DS18B20采用3脚PR—35封装或8脚SOIC封装,引脚排列如图1-1所示。I/O为数据输入/输出端(即单线总线),它属于漏极开路输出,外接上拉电阻后,常态下呈高电平。UDD是可供选用的外部+5V电源端,不用时需接地。GND为地,NC为空脚。其内部框图如图1-2所示。主要包括7部分:①寄生电源;②温度传感器; ③64位激光(laser)ROM与单线接口;④高速暂存器,即便笺式RAM,用于存放中间数据;⑤TH 触发寄存器和TL触发寄存器,分别用来存储用户设定的温度上、下限tH、tL值;⑥存储与控制逻辑;⑦8位循环冗余校验码(CRC)发生器。下面分别介绍各部分的工作原理。

(a) (b) 图1-1 DS1820/DS18B20的引脚排列

(a) PR—35封装 (b) SOIC封装

4

图1-2 DS18B20的内部框图

(1)测温电路原理

DSl8B20内部测温电路框图如图1-4 所示。低温度系数振荡器用于产生稳定的频率ƒ0,高温度系数振荡器则相当于T/ƒ转换器,能将被测温度t转换成频率信号ƒ0图中还隐含着计数门,当计数门打开时,DSl8B20就对低温度系数振荡器产生的时钟脉冲ƒ0进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定。每次测量前,首先将-55℃所对应的基数分别置入减法计数器、温度寄存器中。在计数门关闭之前若计数器已减至零,温度寄存器中的数值就增加0.5℃。然后,计数器依斜率累加器的状态置入新的数值,再对时钟计数,然后减至零,温度寄存器值又增加0.5℃。只要计数门仍未关闭,就重复上述过程,直至温度寄存值达到被测温度值。这就是DSl8B20的测温原理。斜率累加器能对振荡器的非线性予以补偿,提高测量准确度。

需要指出,温度值本应为9位(其中,符号占一位),但因符号位又被扩展成高8位,故实际以16位补码的形式读出。其中,高8位代表符号,“0”表示t>0℃,“1”表示t<0℃;低8位则以0.5℃/LSB。

5

图1-3 内部测温电路框图

表1—1 温度—数据的对应关系

温度/℃ +125 +85 +25.0625 +10.125 +0.5 0 -0.5 -10.125 -25.0625 -55

温度与数据的对应关系见表1—1。欲测量华氏温度(0F),需进行下述换算:

数字输出(二进制) 数字输出(十六进制) 0000 0111 1101 0000 0000 0101 0101 0000 0000 0001 1001 0001 0000 0000 1010 0010 0000 0000 0000 1000 0000 0000 0000 0000 1111 1111 1111 1000 1111 1111 0101 1110 1111 1110 0101 1111 1111 1100 1001 0000 07D0H 0550H 0191H 00A2H 0008H 0000H FFF8H FF5EH FE6FH FC90H t(0F)=9/5(0C)+32 (1—1)

DS18B20中温度字节中的位定义

低八位 23 高八位 S

22 S 21 S 20 S 2-1 S 2-2 26 2-3 25 2-4 24 6

DSl8B20型单线智能温度传感器典型的测温误差在0~70℃范围内,DSl8B20的上、下限测温误差分别为+0.5℃、-0.5℃,而典型产品的误差仅为±0.25℃。 (4)高速暂存器(简称暂存器)

它由便笺式RAM、非易失性电擦写E2RAM所组成,后者用来存储tH和tL值。

图1-4 暂存器的操作命令流程图

数据先写入RAM,经校验后再传给E2RAM。便笺式RAM占9个字节,第0、1字节是测量出的温度信息,第2、3字节分别是tH 、tL值,第4、5字节不用。第6、7字节为计数寄存器,可用于提高温度分辨力。第8字节用来存储上述8字节的循环冗余校验码。详见表3—2。暂存器的命令集见表3—3。6条命令分别为温度转换、读暂存器、写暂存器、复制暂存器、重新调出E2RAM、读电源供电方式。

表1—2 暂存器的内容 便笺式RAM 温度低字节 温度高字节 报警上限/用户定义字节1 报警下限/用户定义字节2 保留 字节 0 1 2 3 4 E2RAM 报警上限/用户定义字节1 报警下限/用户定义字节2 7

保留 计数余数值 每度计数值 CRC 5 6 7 8

表1—3 暂存器命令集 指 令 温度转换 读暂存器 写暂存器 复制暂存器 说 明 启动DSl8B20进行温度转换 读暂存器9个字节的内容 将数据写入暂存器的TH和TL字节 把暂存器的TH、TL字节写入E2RAM中 把E2RAM中的TH、'FL字节分别调入暂存器TH、TL字节 启动DSl8B20发送电源供电方式的信号给主CPU 约定代码 44H BEH 4EH 48H B8H 发生约定代码后单线总线 主CPU读DSl8B20的“忙状态” 主CPU读9个字节的数据 主CPU给DSl8B20发出两个字节的数据 主CPU读DSl8B20的“忙状态” 主CPU读DSl8B20的“忙状态” 重新调E2RAM 读电源供电方式 (5)初始化

B4H 主CPU读DSl8B20的“电源状态” 对DSl8B20的操作是首先进行初始化,然后执行ROM操作命令,再执行暂存器操作命令,最后完成数据处理。 (6)报警信号

在完成温度转换之后,DSl8B20就把测得的温度值,同tH、tL作比较。若t>tH或t8

用报警搜索命令即可识别正在报警的DSl8B20,并且读出其序号,而不必考虑其他未报警的DSl8B20。

4.2 AT89C51 单片机简介

AT89C51 是一种带4K 字节闪烁可编程可擦除只读存储器(FPEROM)的低电压,高性能CMOS8 位微处理器(俗称单片机)。该器件采用ATMEL 高密度非易失存储器制造技术制造,与工业标准的MCS-51 指令集和输出管脚相兼容。由于将多功能8 位CPU 和闪烁存储器组合在单个芯片中,ATMEL 的AT89C51 是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

AT89C51 单片机管脚如图所示。

图1-5 AT89C51 管脚

各管脚功能:

VCC:供电电压。 GND:接地。

P0 口:P0 口为一个8 位漏级开路双向I/O 口,每脚可吸收8TTL 门电流。当P1 口的管脚第一次写1 时,被定义为高阻输入。P0 能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH 编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0 外部必须被拉高。

P1 口:P1 口是一个内部提供上拉电阻的8 位双向I/O 口,P1 口缓冲器能接收

9

输出4TTL门电流。P1 口管脚写入1 后,被内部上拉为高,可用作输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1 口作为第八位地址接收。

P2 口:P2 口为一个内部上拉电阻的8 位双向I/O 口,P2 口缓冲器可接收,输出4 个TTL 门电流,当P2 口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存储器或16 位地址外部数据存储器进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的内容。P2 口在FLASH 编程和校验时接收高八位地址信号和控制信号。

RST:复位输入。当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE 脉冲。如想禁止ALE 的输出可在SFR8EH 地址上置0。此时,ALE 只有在执行MOVX,MOVC 指令是ALE 才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE 禁止,置位无效。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN 有效。但在访问外部数据存储器时,这两次有效的/PSEN 信号将不出现。

/EA/VPP:当/EA 保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1 时,/EA 将内部锁定为RESET;当/EA

10

端保持高电平时,此间内部程序存储器。在FLASH 编程期间,此引脚也用于施加12V 编程电源(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。

4.3 74HC138功能介绍

74HC138有3个输入A0、A1、A3,它们共有8种状态组合,即可译出8个输出信号Y0-Y7. 引脚图及直值表如下示:

图1-6 74HC138引脚图

表 1-5 74HC138真值表

11

4.4 74HC377功能介绍

74HC377引脚及真值表如下图所示,当允许控制端(1脚)为低电平时,在时钟端(CP)脉冲上升沿作用下,输出端(Q)与数据端(D)相一致。当CLK为高电平或低电平时,D对Q没有影响。

图1-7 74HC37

7引脚图 表1-6 74HC377真值表 4.5

74HC245功能介绍

74HC245引脚图及其真值表如下图所示。

图1-8 74HC245引脚图 表1-7 74HC245真值表

12

4.6

温度报警控制系统电路图

13

5.温度报警控制系统软件部分设计分析:

5.1 程序实现功能

开机显示当前温度,并进入停止运行烤箱状态。按下SW1选择显示上、下限温度。若进入上、下限温度显示则可修改上、下限值(程序默认值上限为60摄氏度,下限为10摄氏度,并且上限永比下限值高5摄氏度以上)。SW2为加1摄氏度键,SW3为减1摄氏度键。若当前温度低于下限值,LED2亮并自动进入运行烤箱状态(加热)。若当前温度在上、下限值之间,则手动选择是否加热。SW4为运行键。运行状态下LED1亮。在运行状态下,若当前温度高于上限值则自动停止运行。此外,运行状态下按住SW1显示设置的上限值,按住SW2显示设置的下限值。

5.2 程序流程图

5.2.1 测温程序流程图

初始化传感器 跳过读序号列号 高位左移8位 跳过读序号列号 读取温度寄存器 (前两个寄存器值为温度) 高位与低位相或 组合成温度值 启动温度转换 读取低位 初始化传感器 读取高位 返回检测温度值

14

5.2.2 主程序流程图

15

5.2.3运行子程序流程

当前温度赋给temp Y 温度>=上限? N Y 温度在上下限之间? 加热,运行灯亮 停止加热,报警 N Y 温度<=下限? 报警,自动加热 N 结束

5.2.4 运行时按键功能程序

16

5.2.5 加减键子程序流程

N Y 按下SW2? N Y 按下SW3? N 输入值-1℃ 显示修改后的数值 输入值+1℃ 显示修改后的数值 按键释放? Y 返回输入值

5.3温度报警控制程序

该系统的控制程序见附件1。

6. 系统调试

该系统的调试结果如下:

开机显示当前温度,并进入停止运行烤箱状态。LED数码管显示实时温度。 当按一下SW1(选择键)选择显示上限温度,此时按SW2(加键)、SW3(减键)可加减上限温度设定值;再按一SW1选择显示下限温度,按SW2、SW3可加减该下限温度设定值;再按一下SW1,恢复显示当前温度。SW4为运行烤箱的启动\\停止控制键。SW1的选择只是在烤箱停止运行时有效,即当按SW4停止运行烤箱时,可进行以上操作;当按SW4启动烤箱时,只能显示上下限的温度值,而不能修改温度值(运行状态下按住SW1显示设置的上限值,按住SW2显示设置的下限值)。

若进入上、下限温度显示则可修改上、下限值(程序默认值上限为60摄氏度,下限为10摄氏度,并且上限永比下限值高5摄氏度以上)。SW2为加1摄氏度键,SW3为减1摄氏度键。

若当前温度低于下限值,系统的指示灯LED2亮(警报)并自动进入运行烤箱状态(加热),当前温度高于下限值时,指示灯LED2灭(取消警报)。在运行状态下,若当前温度高于上限值指示灯LED2亮并自动停止运行,温度低于下限值灯灭。

若当前温度在上、下限值之间,则手动选择是否加热。SW4为运行键。运行状态下指示灯LED1亮。

17

7.课程设计体会:

通过两个星期的实训,我对8051的结构及编程语言有了更多的认识,更深的了解了8051的工作方式,并能对硬件调试时出现的一些故障进行合理的分析与改正,保证控制系统的正常控制要求外,我们还尽量使设计的系统符合实际的需求。通过对控制系统的控制要求的分析,理解控制其控制思想,构思、编写控制程序,并通过调试,修改,使其具备系统要求的功能。

这次的课程设计让我把理论知识用在实践中,实现了理论和实践相结合,从中更懂得理论的是实践的基础,实践有能检验理论的正确性,让我受誉非浅,同时提高了自己的发现问题,分析问题与解决问题的能力。对我以后参加工作或者继续学习将会产生巨大的帮助和影响。

8. 参考文献:

1. 赖麒文 8051单片机C语言彻底应用 科学出版社 2005 2. 陈龙三 8051单片机 C语言控制与应用 清华大学出版社 1998 3. 钟富昭 8051单片机典型模块设计与应用 人民邮电出版社 2007 4. 百度百科 DS18B20 http://baike.baidu.com/view/1341776.htm

18

附件1:总程序

#include #include #include

//LED选择端口 起始地址

#define led_sel XBYTE[0xc000] //LED数据端口 起始地址

#define led_data XBYTE[0xe000] //按键端口 起始地址

#define key_addr XBYTE[0xA000] //定义数码管内容

char code table[22]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x39,0x00,0x40,0x76,0x70,0x38, 0x21,0x30,0x18,0x0c,0x06,0x03};

//LED数码管 数字内容: 0, 1, 2, 3, 4, 5, 6, 7, //8, 9, c, 空 , -, H , 卜, L, //运行时当前温度下的动态显示 //定义传感器转换所用到内容

unsigned char code table2[16]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9}; //定义各个变量 //标志状态变量

unsigned int tr1=0,tr0=0,fan;

unsigned char flag; //运行标志0为运行,1为停止 //上限,下限,当前温度 unsigned int Th,Tl,Tm,Tn;

//定义温度传感器通讯端口为P1.0 sbit DQ = P1^0; sbit fan1 = P1^5; sbit lgh1=P1^6; sbit lgh2=P1^7;

//------------------各个子程序------------------ void delay(unsigned int i)//测温用到的延时 { while(i--); }

/*******************************************************************/ /* 初始化ds18b2子函数* */

19

/*******************************************************************/ void Init_DS18B20(void)//初始化传感器函数 { unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(14); x=DQ; //稍做延时后 //如果x=0则初始化成功 x=1则初始化失败 delay(20); }

/*******************************************************************/ /* 读字节子函数 */ /*******************************************************************/ unsigned char ReadOneChar(void)//读一个字节 { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(4); } return(dat); }

/********************************************************************/ /* 写字节子函数 */ /********************************************************************/ void WriteOneChar(unsigned char dat)//写一个字节 { unsigned char i=0;

20

for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; } }

/********************************************************************/ /* 读温度模块 */ /********************************************************************/ unsigned int Temperature(void)//读取温度 { unsigned char a=0; unsigned char b=0; unsigned int t=0; Init_DS18B20(); //初始化传感器 delay(200); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20(); //初始化传感器 delay(1); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 (共可读9个寄存器)前两个是温度 //双字节 8位,高字节和低字节高4位组成温度整数值,低4位为温度小数值 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 t=b; t<<=8; //左移8位 t=t|a; //t=b8位+a8位 组成一个16位数 return(t); }

/********************************************************************/ /* LED显示子函数 */ /********************************************************************/ void delayms(int ms)//显示延时

21

{

int i; while(ms--) {for(i=20;i>0;i--); } }

void display(int pa,int pb,int pc)//显示函数 { //使用动态显示,LED数码管逐个点亮 //从LED5开始点亮目的是将键盘的公共端拉为底电平 //因为键盘的公共端接在LED0的选通信号上 led_sel=0xdf; //1.选通LED5 led_data=table[10]; //2.输入显示数据,此处数据为\"℃\" delayms(5); //3.延时显示内容 led_data=0x00; //4.将输入数据清零 消除拖影现象 led_sel=0xef; //选通LED4 小数位 led_data=table[pc]; delayms(5); led_data=0x00; led_sel=0xf7; //选通LED3 个位+小数点 led_data=table[pb]+0x80; delayms(5); led_data=0x00; led_sel=0xfb; //选通LED2 十位 led_data=table[pa]; //2+3=整数 delayms(5); led_data=0x00; led_sel=0xfd; //选通LED1 led_data=table[tr0]; //与选通LED0组合为 状态标志位 delayms(5); led_data=0x00; led_sel=0xfe; //选通LED0 led_data=table[tr1]; //数据输入

22

delayms(5); //延时 led_data=0x00; //数据清零 }

unsigned int add_dec(unsigned int temp)//加减程序 { unsigned zs,zg; if(key_addr==0xfd)//按下加温度键 { delayms(20);//延时防抖 temp=temp+10; zs=temp/100; zg=temp%100; display(zs,zg,0);//显示加1℃后温度 } if(key_addr==0xfb)//减1℃ { delayms(20); temp=temp-10; zs=temp/100; zg=(temp/10)%10; display(zs,zg,0); } while (key_addr!=0xff)display(zs,zg,0); return(temp); //检查是否已经松开按键,是则显示相加后的温度否则返回 }

void dataplay(unsigned int tmp)//选择显示 { unsigned z,x,xs,zs,zg,temp; if(Th>=990)Th=990; //上限温度最高为99度 if(Th<=100)Th=100; //上限温度最低为10度 if(Tl<=10)Tl=10; //下限温度最低为1度 if(Tl>=500)Tl=500; //下限温度最高为50度 if(Th23

x = (unsigned char)(temp&0x000f); //小数部分 z = (unsigned char)(temp>>4); //整数部分 zs=z/10; //十位 zg=z%10; //个位 xs=table2[x]; //小数位 Tn=z*10+xs; display(zs,zg,xs); break; case 1: //显示上限温度 zs=Th/100; zg=(Th/10)%10; display(zs,zg,0); break; case 2: //显示下限温度 zs=Tl/100; zg=(Tl/10)%10; display(zs,zg,0); break; } }

/********************************************************************/ /* 按键功能子函数 */ /********************************************************************/ void keyscn(void)//运行时按键功能选择 { switch(key_addr) { case 0xfe: tr1=13; //按下SW1显示上限温度 tr0=11; //标志为\"H ××.×C\" dataplay(1); break; case 0xfd: tr1=15; //按下SW2显示下限温度 tr0=11; //标志为\"L ××.×C\" dataplay(2); break; case 0xfb: dataplay(0);

24

break; case 0xf7: delayms(20); //按下SW4显示当前温度 dataplay(0); //并停止运行 flag=1; while(key_addr==0xf7)dataplay(0); break; case 0xff: dataplay(0); //无按键显示当前温度 break; } }

void run(void) { unsigned temp; temp=Tn; //将当前温度赋予给变量 if(temp>=Th) { fan1=0; lgh1=0;

delayms(1000); flag=1; } if(tempTl) { fan1=0; lgh1=1; } if(temp<=Tl) {

fan1=0; lgh1=0; } }

//-----------主程序------------------- void main(void)//主程序 { unsigned ID=0,temp0=0,temp1=16; flag=1;Th=600;Tl=100; //开机设定上限为60℃下限为10℃,进入停止状态

25

while(1)//不断循环 { while(flag)//停止时 { fan1=1; lgh1=1; lgh2=1; tr0=12;//停止时标志 if(Tn>=Th)lgh1=0; switch (ID) { case 0: tr1=12; //停止时标志 dataplay(ID); //显示为\"--××.×C\" break; case 1: tr1=13; //显示上限温度并可进行修改 Th=add_dec(Th); //上限修改 dataplay(ID); //显示为\"H-××.×C\" break; case 2: tr1=15; //显示下限温度并可以修改 Tl=add_dec(Tl); //下限修改 dataplay(ID); //显示为\"L-××.×C\" break; } if (key_addr==0xfe) //按下sw1设定值更改 //当前温度->上限设定->下限设定->当前温度 //不断循环 { delayms(20); ID++; if(ID==3)ID=0; } while (key_addr==0xfe)dataplay(ID); if (key_addr==0xf7)//按下sw4 退出设定 并进入运行状态 { delayms(20); flag=0;

26

}

tr0=11; tr1=temp1; run(); } while(key_addr==0xf7)dataplay(0); if(Tn<=Tl) { flag=0; keyscn(); } } while(flag!=1) //运行 { lgh2=0; tr0=11; //运行标志 LED1为空 temp0++; if(temp0==5) { temp1++; temp0=0; } if(temp1==21)temp1=16; tr1=temp1; //动态显示标志 //标志更改运行时显示为空\" ××.×C\" keyscn(); //进入键位选择 run(); } }

27

因篇幅问题不能全部显示,请点此查看更多更全内容