1、温度检测显示与报警系统温度检测显示与报警系统光电与通信工程学院课程设计报告书课 设 名 称: 温度检测、显示与报警系统 年级专业及班级: 姓 名: 学 号: 指 导 老 师: 评 定 成 绩: 教 师 评 语:指导老师签名:2013年 6月27 日摘要温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。温度是一个十分重要的物理量,对它的测量与控制有十分重要的意义。随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与控制温度:如大气及空调房中温度的高低,直接影
2、响着人们的身体健康;粮仓温度的检测,防止粮食发霉,最大限度地保持粮食原有新鲜品质,达到粮食保质保鲜的目的;工业易燃品的存放。 本次课程设计介绍了以STC89C51单片机为核心的温度检测报警系统的工作原理和设计方法。温度信号由温度传感器芯片DS18B20采集,并以数字信号的方式传送给单片机,单片机再控制数码管驱动芯片74LS573驱动4位分立式数码管显示实时温度,当检测到的温度超出了给定的温度范围(默认下限为20,默认上限为35),系统将输出报警声。本系统的主要硬件电路包括:温度检测电路,数码管驱动电路,报警电路。另外本系统的软件部分占了很大的比重,主要的软件模块包括:温度传感器程序,数码管驱动
3、及显示程序,报警程序。系统的主要功能及工作流程总体设计框图: 主电源引脚(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根
4、)STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。PO口(Pin39Pin32):8位双向I/O口线,名称为P0.0P0.7P1口(Pin1Pin8):8位准双向I/O口线,名称为P1.0P1.7 P2口(Pin21Pin28):8位准双向I/O口线,名称为P2.0P2.7 P3口(Pin10Pin17):8位准双向I/O口线,名称为P3.0P3.72、测量部分测量部分我们采用美国DALLAS公司生产的DS18B20温度传感器。2.1 DS18B20简介DS18B20数字温度传感器,该产品采用美国DALLAS公司生产的 DS
5、18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。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个字节内容
6、写暂存器 4EH:将数据写入暂存器的TH、TL字节复制暂存器 48H:把暂存器的TH、TL字节写到E2RAM中读电源供电方式 B4H:启动DS18B20发送电源供电方式的信号给主CPU2.4 DS18B20的初始化2.5 DS18B20的写操作2.6 DS18B20的读操作3、显示部分 内部的四个数码管共用adp这8根数据线,为人们的使用提供了方便,因为里面有四个数码管,所以它有四个公共端,加上adp,共有12个引脚,下面便是一个共阴的四位数码管的内部结构图(共阳的与之相反)。引脚排列依然是从左下角的那个脚(1脚)开始,以逆时针方向依次为112脚,上图中的数字与之一一对应。 4、报警部分本系统
7、设计三个按键,采用查询方式,一个用于选择切换设置报警温度和当前温度,另外两个分别用于设置报警温度的加和减。见下面报警流程图模块及程序。二、硬件电路原理描述见附录1三、软件设计系统软件程序基于Keil uvsion3开发平台,采用C51语言编写。本程序采用模块化程序方法,主要分为以下三个模块:LCD初始化显示模块DS18B20数据采集模块温度报警上下限设置模块程序流程图:心得体会: 本系统具有较强的实用性,我对DS18B20及一些测量温度的传感器进行了比较,DS18B20不仅测量精度高,稳定性好,体积小巧,而且价格也比较便宜。另外,本系统还具有较高的扩展性,可以制作时钟,计算器,温度测量于一体,
8、具有较强的实用价值。在编写DS18B20的测量程序的过程中遇到了很多问题,刚开始总是得不到测量数据,后来仔细读DS18B20说明资料,发现写时序的时候出了点问题,然后我们又按照着DS18B20的通讯时序和接收时序将程序一条条重写,经过调试后,用Proteus仿真软件可以仿真出正确的结果。但软件仿真与硬件还是有点区别,等我们把电路板做出来的时候,把程序烧录进去,发现出错!经过再三检查,不断的思考,最后我发现软件仿真是在硬件理想状态下运行的。因此,我对应的将软件程序进行了一些细节修改。最后可以在我们做的硬件电路板中进行正确的测量与显示。在硬件方面,最初数码管都亮不了,通过测量各点的电压,发现少接了
9、一根地线,焊电路板真的应该要很细心的,不然很容易丢三落四的。之后还是有两个数码管不亮,经过测量,有一条导线坏了,换上导线后,还是有一个数码管不亮,经检查,导线没有问题,是虚焊。实验过程中,不管是硬件还是软件都遇到了一些问题,不过,最老师和同学的帮助下,以及跟小组成员的积极讨论中,最终都能够解决问题。同时也深刻意识到了,做实验要细心谨慎。同时也进一步学习了单片机知识。参考文献:单片机原理及应用 编著 徐敏,刘建春,关健生单片机原理与接口技术 编著 刘 军单片机原理与C51编程 编著 宋彩利 孙友仓 吴宏岐51单片机开发入门与经典实例 编著 王守中51单片机C语言教程 编著 杨将新 李华军 刘东骏
10、51单片机应用实例详解 编著 杨 欣 王玉凤 刘湘黔 XX文库 附录1 系统总硬件电路原理图附录2 系统源程序代码#include reg52.h#include intrins.h /_nop_();延时函数用#define dm P0 /段码输出口#define uchar unsigned char#define uint unsigned intsbit DQ=P27; /温度输入口sbit w0=P20; /数码管 4sbit w1=P21; /数码管 3sbit w2=P22; /数码管 2sbit w3=P23; /数码管 1sbit beep=P17; /蜂鸣器和指示灯sbit
11、 set=P26; /温度设置切换键sbit add=P24; /温度加sbit dec=P25; /温度减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 ditab16=0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09; /小
12、数断码表uchar code table_dm12=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40;/共阴 LED 段码表0123456789 不亮 -uchar table_dm1=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef;/个位带小数点的断码表uchar data temp_data2=0x00,0x00; /读出温度暂放uchar data display5=0x00,0x00,0x00,0x00,0x00; /显示单元数据,共 4 个数据和一个运算暂用/*1
13、1us 延时函数*/void delay(uint t)for (;t0;t-);void scan()int j;for(j=0;j0;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;i0;i-)DQ
14、=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 usDQ=1;return(value);/*读出温度函数*/read_temp()ow_reset(); /总线复位delay(200);write_byte(0xcc); /发命令write_byte(0x44); /发转换命令ow_reset(); delay(1);write_byte(0xcc);
15、/发命令write_byte(0xbe);temp_data0=read_byte(); /读温度值的低字节temp_data1=read_byte(); /读温度值的高字节temp=temp_data1;temp6348) / 温度值正负判断tem=65536-tem;n=1; / 负温度求补码,标志位置 1display4=tem&0x0f; / 取小数部分的值display0=ditabdisplay4; / 存入小数部分显示值display4=tem4; / 取中间八位,即整数部分的值display3=display4/100; / 取百位数据暂存display1=display4%1
16、00; / 取后两位数据暂存display2=display1/10; / 取十位数据暂存display1=display1%10; /个位数据r=display1+display2*10+display3*100;/符号位显示判断/if(!display3)display3=0x0a; /最高位为 0 时不显示if(!display2)display2=0x0a; /次高位为 0 时不显示if(n)display3=0x0b; /负温度时最高位显示-void BEEP()if(r=high&r129)|r128)horl=256-horl;n=1;display3=horl/100;disp
17、lay3=display3&0x0f;display2=horl%100/10;display1=horl%10;display0=0;if(!display3)display3=0x0a; /最高位为 0 时不显示if(!display2)display2=0x0a; /次高位为 0 时不显示if(n)display3=0x0b; /负温度时最高位显示-/*按键查询程序*/void keyscan()int temp1; /最高温度和最低温度标志位if(set=0)while(1)delay(500);/消抖if(set=0)temp1+;while(!set)scan();if(temp1
18、=1)xianshi(high);scan();if(add=0)while(!add)scan();high+=1;if(dec=0)while(!dec)scan();high-=1;if(temp1=2)xianshi(low);if(add=0)while(!add)scan();low+=1;if(dec=0)while(!dec)scan();low-=1;scan();if(temp1=3)temp1=0;break;/*主函数*/void main()dm=0x00; /初始化端口w0=0;w1=0;w2=0;w3=0;for(h=0;h4;h+) /开机显示0000displayh=0;ow_reset(); /开机先转换一次write_byte(0xcc); /Skip ROMwrite_byte(0x44); /发转换命令for(h=0;h100;h+) /开机显示0000scan();while(1)if (temp1=0)work_temp(read_temp(); /处理温度数据BEEP();scan(); /显示温度值keyscan();elsekeyscan();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1