预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

基于STC89C52单片机的智能温控报警系统设计 随着科学技术的发展,温度控制在我们的日常生活中扮演着越来越重要的角色,在一些需要保持温度恒定的场所,如实验室、生产车间、温室等等都需要准确的温度控制系统,以保障生产、实验和生活的质量。温控报警系统是其中的一种应用,它可以在温度达到预先设定的阈值时发出警报,及时提醒用户采取措施。本文讨论的是基于STC89C52单片机的智能温控报警系统。 一、系统功能 本系统主要有温度采集、数据处理、控制输出和报警提示等四个主要功能。系统实现逻辑如下: 1.通过温度传感器采集环境温度,并将数据送至STC89C52单片机。 2.STC89C52单片机读入数据处理后,判断温度是否超过设定阈值。 3.如果超过阈值,则控制输出通道发出警报,并显示当前温度值。 4.同时保存温度数据供后续分析使用。 二、硬件部分 整个系统的硬件部分主要包括温度采集模块、STC89C52单片机、显示模块、报警模块四个模块。 1.温度采集模块 温度采集模块主要由数字温度传感器(DS18B20)、电容(C1)和电阻(R1)组成。图1为模块电路图。 图1温度采集模块电路图 DS18B20温度传感器是一款数字式温度传感器,传感器的输出信号是数字量,它采用3线式传输方式,分别是VCC、GND和DATA。电容C1和电阻R1主要是为了保护DS18B20温度传感器,稳定电源和保护数据线。 2.STC89C52单片机 STC89C52是一款基于MCS-51内核的单片机,它具有高性能、低功耗、价格低廉等特点。图2为STC89C52单片机电路图。 图2STC89C52单片机电路图 STC89C52单片机通过数据总线(D0~D7)、地址总线(A0~A15)和控制总线(PSEN、WR、RD、ALE)与外部电路相连。其中,PSEN为片内程序存储器使能位,WR为写控制位,RD为读控制位,ALE为地址锁存控制位。STC89C52单片机还有丰富的模拟数字转换(ADC)、定时器/计数器(TIMER)、串口通信等功能。 3.显示模块 显示模块主要由数码管和驱动芯片共同组成。数码管显示当前温度值,驱动芯片接收STC89C52单片机的指令,控制数码管显示。 4.报警模块 报警模块主要由蜂鸣器和驱动芯片共同组成。当温度超过设定阈值时,驱动芯片接收STC89C52单片机的指令,控制蜂鸣器发出警报声。 三、软件部分 软件部分主要包括程序设计和算法设计。其中,程序设计主要负责温度采集、数据处理、控制输出和报警提示等功能;算法设计主要涉及温度数据采样处理、温度判断及报警控制算法等内容。 1.程序设计 程序设计主要涉及两个方面:一个是DS18B20数字温度传感器数据采集,另一个是温度判断及报警信号输出。下面是程序设计的主要步骤。 1.初始化STC89C52单片机。 2.初始化DS18B20数字温度传感器,并开始温度转换。 3.读入DS18B20传感器输出数据,并进行温度计算。 4.温度判断:如果当前温度小于或等于设定阈值,则该模式下温度合法,重新回到步骤2;否则,控制输出通道发出警报,并显示当前温度值。 5.保存温度数据:将当前温度值存入EEPROM中,便于后期统计分析。 2.算法设计 算法设计主要涉及温度数据采样处理、温度判断及报警控制算法等内容。 1.温度数据采样处理:DS18B20数字温度传感器采用3线式数据传输方式,数据传输过程中包含初始化、温度转换和读取三个步骤。具体算法实现如下: ```c voidDs18b20RD(void) { uchari=0; DSPORT=1; DSDQ=1; Delay1ms(); DSPORT=0; Delay1us(500); DSPORT=1; Delay1us(15); i=DSPORT; Delay1us(480); DSPORT=1; } ``` 2.温度判断及报警控制算法:将DS18B20传感器采集得到的温度值与预设温度阈值进行比较,如果超过阈值,则控制蜂鸣器发出警报声,并显示当前温度值。具体算法实现如下: ```c if(temp>=SET_TEMP){ //超过温度阈值,控制led闪烁和蜂鸣器响 P0=0x01; while(1) { DS1302_Read_Time();//获取时间,从2309只需调整年、月、日、时、分、秒的位置即可 LCD1602_Write_String(0x80,2,str1); LCD1602_Write_String(0xC0,2,str2); Delay_S(500); P0=~P0; if(P0==0xff) { BEEP=0; } else{ BEEP=1; } if(temp_bef==temp_fab)continue; temp_bef=temp; if(temp<=SET_TE