当前位置:文档之家› 温度检测显示与报警系统课程设计

温度检测显示与报警系统课程设计

课程设计报告书课设名称:温度检测、显示与报警系统年级专业及班级:姓名:学号:指导老师:指导老师签名:2014年 5月4 日摘要温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。

温度是一个十分重要的物理量,对它的测量与控制有十分重要的意义。

随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与控制温度:如大气及空调房中温度的高低,直接影响着人们的身体健康;粮仓温度的检测,防止粮食发霉,最大限度地保持粮食原有新鲜品质,达到粮食保质保鲜的目的;工业易燃品的存放。

本次课程设计介绍了以STC89C51单片机为核心的温度检测报警系统的工作原理和设计方法。

温度信号由温度传感器芯片DS18B20采集,并以数字信号的方式传送给单片机,单片机再控制数码管驱动芯片74LS573驱动4位分立式数码管显示实时温度,当检测到的温度超出了给定的温度范围(默认下限为20℃,默认上限为35℃),系统将输出报警声。

本系统的主要硬件电路包括:温度检测电路,数码管驱动电路,报警电路。

另外本系统的软件部分占了很大的比重,主要的软件模块包括:温度传感器程序,数码管驱动及显示程序,报警程序。

系统的主要功能及工作流程 总体设计框图:单片机STC89C51温度采集(DBS18B20)阈值设定(键盘)报警(蜂鸣器)显示主要功能:1、能正确检测温度;2、在数码管上实时显示温度;3、当温度超过或低于设定的阈值时,蜂鸣器报警;4、可通过矩阵键盘调整温度报警阈值;5、默认上限报警温度为35℃,默认下限报警温度为20℃。

工作流程:系统设计思路为以单片机为控制中心,通过实时采集温度传感器DBS18B20获得当前的温度值,通过LED显示当前温度,同时使用键盘设定温度阈值,当测定温度大于温度阈值后,利用蜂鸣器报警。

系统包括包括单片机最小系统模块、LED显示模块、蜂鸣器报警模块、矩阵键盘模块、串行口下载模块和电源模块。

1、控制部分控制部分是采用单片机STC89C52。

1.1 STC89C52简介STC89C52是一种带8K字节闪烁可编程可檫除只读存储器的低电压,高性能COMOS8的微处理器,俗称单片机。

该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

单片机总控制电路如下图:1.2 复位操作本系统的复位电路采用按键电平复位方式,通过使复位端经电阻与Vcc电源接通而实现的,其电路如下图所示上述电路图中的电阻、电容参数适用于6MHz晶振,能保证复位信号高电平持续时间大于2个机器周期。

1.3 STC89C52主要功能如下表所示主要功能特性兼容MCS51指令系统8K可反复擦写Flash ROM32个双向I/O口256x8bit内部RAM3个16位可编程定时/计数器中断时钟频率0-24MHz 2个串行中断可编程UART串行通道2个外部中断源共6个中断源2个读写中断口线3级加密位低功耗空闲和掉电模式软件设置睡眠和唤醒功能STC89C52管脚介绍:①主电源引脚(2根)VCC(Pin40):电源输入,接+5V电源GND(Pin20):接地线②外接晶振引脚(2根)XTAL1(Pin19):片内振荡电路的输入端XTAL2(Pin20):片内振荡电路的输出端③控制引脚(4根)RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。

ALE/PROG(Pin30):地址锁存允许信号PSEN(Pin29):外部存储器读选通信号EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,接高电平则从内部程序存储器读指令。

④可编程输入/输出引脚(32根)STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。

PO口(Pin39~Pin32):8位双向I/O口线,名称为P0.0~P0.7P1口(Pin1~Pin8):8位准双向I/O口线,名称为P1.0~P1.7P2口(Pin21~Pin28):8位准双向I/O口线,名称为P2.0~P2.7P3口(Pin10~Pin17):8位准双向I/O口线,名称为P3.0~P3.72、测量部分测量部分我们采用美国DALLAS公司生产的DS18B20温度传感器。

2.1 DS18B20简介DS18B20数字温度传感器,该产品采用美国DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。

2.2封装及接线说明:DS18B20芯片封装结构:特点:独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为 3.0V 至5.5V无需备用电源测量温度范围为-55 °C至+125 ℃。

华氏相当于是-67 °F到257华氏度-10 °C至+85 °C范围内精度为±0.5 °C2.3 DS18B20控制方法DS18B20有六条控制命令:温度转换44H:启动DS18B20进行温度转换读暂存器BEH:读暂存器9个字节内容写暂存器4EH:将数据写入暂存器的TH、TL字节复制暂存器48H:把暂存器的TH、TL字节写到E2RAM中读电源供电方式B4H:启动DS18B20发送电源供电方式的信号给主CPU 2.4 DS18B20的初始化2.5 DS18B20的写操作2.6 DS18B20的读操作3、显示部分内部的四个数码管共用a~dp这8根数据线,为人们的使用提供了方便,因为里面有四个数码管,所以它有四个公共端,加上a~dp,共有12个引脚,下面便是一个共阴的四位数码管的内部结构图(共阳的与之相反)。

引脚排列依然是从左下角的那个脚(1脚)开始,以逆时针方向依次为1~12脚,上图中的数字与之一一对应。

4、报警部分本系统设计三个按键,采用查询方式,一个用于选择切换设置报警温度和当前温度,另外两个分别用于设置报警温度的加和减。

见下面报警流程图模块及程序。

二、硬件电路原理描述见附录1三、软件设计系统软件程序基于Keil uvsion3开发平台,采用C51语言编写。

本程序采用模块化程序方法,主要分为以下三个模块:◆LCD初始化显示模块◆DS18B20数据采集模块◆温度报警上下限设置模块程序流程图:开始初始化LCD1602调用DS18B20模块调用报警模块温度显示主程序流程图DS18B20是否响应?主机发出开始信号主机设置为输入模式NYDS18B20数据采集流程图等待480us接收数据拉低总线,延时45us释放总线跳出进入设置模式(按键)设置温度报警上下限TH与TL调用DS18B20模块Temp>=TH||Temp<=TL? NY报警(LED亮,蜂鸣器响)温度显示报警模块流程图本系统具有较强的实用性,我对DS18B20及一些测量温度的传感器进行了比较,DS18B20不仅测量精度高,稳定性好,体积小巧,而且价格也比较便宜。

另外,本系统还具有较高的扩展性,可以制作时钟,计算器,温度测量于一体,具有较强的实用价值。

在编写DS18B20的测量程序的过程中遇到了很多问题,刚开始总是得不到测量数据,后来仔细读DS18B20说明资料,发现写时序的时候出了点问题,然后我们又按照着DS18B20的通讯时序和接收时序将程序一条条重写,经过调试后,用Proteus仿真软件可以仿真出正确的结果。

但软件仿真与硬件还是有点区别,等我们把电路板做出来的时候,把程序烧录进去,发现出错!经过再三检查,不断的思考,最后我发现软件仿真是在硬件理想状态下运行的。

因此,我对应的将软件程序进行了一些细节修改。

最后可以在我们做的硬件电路板中进行正确的测量与显示。

在硬件方面,最初数码管都亮不了,通过测量各点的电压,发现少接了一根地线,焊电路板真的应该要很细心的,不然很容易丢三落四的。

之后还是有两个数码管不亮,经过测量,有一条导线坏了,换上导线后,还是有一个数码管不亮,经检查,导线没有问题,是虚焊。

实验过程中,不管是硬件还是软件都遇到了一些问题,不过,最老师和同学的帮助下,以及跟小组成员的积极讨论中,最终都能够解决问题。

同时也深刻意识到了,做实验要细心谨慎。

同时也进一步学习了单片机知识。

单片机原理及应用[编著] 徐敏,刘建春,关健生单片机原理与接口技术[编著] 刘军单片机原理与C51编程[编著] 宋彩利孙友仓吴宏岐51单片机开发入门与经典实例[编著] 王守中51单片机C语言教程编著] 杨将新李华军刘东骏51单片机应用实例详解[编著] 杨欣王玉凤刘湘黔附录1 系统总硬件电路原理图附录2 系统源程序代码#include "reg52.h"#include "intrins.h" //_nop_();延时函数用#define dm P0 //段码输出口#define uchar unsigned char#define uint unsigned intsbit DQ=P2^7; //温度输入口sbit w0=P2^0; //数码管4sbit w1=P2^1; //数码管3sbit w2=P2^2; //数码管2sbit w3=P2^3; //数码管1sbit beep=P1^7; //蜂鸣器和指示灯sbit set=P2^6; //温度设置切换键sbit add=P2^4; //温度加sbit dec=P2^5; //温度减int temp1=0; //显示当前温度和设置温度的标志位为0 时显示当前温度uint h;uint temp;uchar r;uchar high=35,low=20;uchar sign;uchar q=0;uchar tt=0;uchar scale;//**************温度小数部分用查表法***********//uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0 x08,0x09,0x09}; //小数断码表uchar code table_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴LED 段码表"0""1""2""3""4""5""6""7""8""9" "不亮" "-"uchar table_dm1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//个位带小数点的断码表uchar data temp_data[2]={0x00,0x00}; //读出温度暂放uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4 个数据和一个运算暂用/*****************11us 延时函数*************************/void delay(uint t){for (;t>0;t--);}void scan(){int j;for(j=0;j<4;j++){switch (j){case 0: dm=table_dm[display[0]];w0=0;delay(50);w0=1;//小数case 1: dm=table_dm1[display[1]];w1=0;delay(50);w1=1;//个位case 2: dm=table_dm[display[2]];w2=0;delay(50);w2=1;//十位case 3: dm=table_dm[display[3]];w3=0;delay(50);w3=1;//百位//else{dm=table_dm[b3];w3=0;delay(50);w3=1;}}}}//***************DS18B20 复位函数************************/ ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();//从高拉倒低DQ=0;delay(50); //550 usDQ=1;delay(6); //66 uspresence=DQ; //presence=0 复位成功,继续下一步}delay(45); //延时500 uspresence=~DQ;}DQ=1; //拉高电平}/****************DS18B20 写命令函数************************///向1-WIRE 总线上写1 个字节void write_byte(uchar val){uchar i;for(i=8;i>0;i--){DQ=1;_nop_();_nop_(); //从高拉倒低DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 usDQ=val&0x01; //最低位移出delay(6); //66 usval=val/2; //右移1 位}DQ=1;delay(1);}/****************DS18B20 读1 字节函数************************/ //从总线上取1 个字节uchar read_byte(void)uchar i;uchar value=0;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 usDQ=1;_nop_();_nop_();_nop_();_nop_(); //4 usif(DQ)value|=0x80;delay(6); //66 us}DQ=1;return(value);}/*****************读出温度函数************************/read_temp(){ow_reset(); //总线复位delay(200);write_byte(0xcc); //发命令write_byte(0x44); //发转换命令ow_reset();delay(1);write_byte(0xcc); //发命令write_byte(0xbe);temp_data[0]=read_byte(); //读温度值的低字节temp_data[1]=read_byte(); //读温度值的高字节temp=temp_data[1];temp<<=8;temp=temp|temp_data[0]; // 两字节合成一个整型变量。

相关主题