电子系统课程设计.报告.doc
电子系统课程设计题目: STCC52单片机温度报警器 专业: 电子信息科学与技术 班级: 姓名:杨颉 、胡宇路、邓舟 指导教师: 于老师 摘 要温度是一个十分重要的物理量,对他的测量与控制有十分重要的意义,随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与控制温度。本温度报警器的设计与制作,阐明了该装置进行设计与制作的具体过程及方法。这种温度报警器结构简单,可操作性强,应用广泛。工作时,温度测量范围为-55ºC到125 ºC当前环境温度若超过设定的高温临界温度,由单片机发出报警信号,防止因温度升高而带来的不必要的损失。现代社会是信息社会,随着安全化程度的日益提高,机房作为现代化的枢纽,其安全工作已成为重中之重,机房内一旦发生故障,将导致整个系统瘫痪,造成巨大的损失很社会影响。造成高温火灾有:电气线路短路、过载、接触电阻过大等引发高温或火灾;静电产生高温或火灾;雷电等强电侵入导致高温或火灾;最主要是机房内电脑、空调等用电设备长时间工作,导致设备老化,空调发生故障,而不能降温;因此机房内所属的电子产品发热快,在短时间内机房温度升高超出设备正常温度,导致系统瘫痪或产生火灾,这时温度报警系统就会发挥应有的功能。本文介绍的是采用温度传感器DS18B20的温度报警器,自动测量当前环境温度,由单片机AT89C2051控制,并通过三位7段数码管显示,若当前环境温度超过此温度,系统发出报警。关键词:单片机 温度报警器 发光二极管 温度显示一设计方案、该温度报警器的主要由温度传感器DS18B20,主控电路,段驱动数码管位驱动等部分组成.工作原理如下:1.传感器对当前环境温度进行采样得到与之对应的数字信号;2.将该数字信号送入单片机,经单片机处理后由七段数码管显示;3.键盘输入模块向单片机设定高温临界温度;4.当前环境温度若超过设定的高温临界温度,由单片机发出报警信号,发光二级管亮,并使蜂鸣器发出报警信号。二、系统框图三、功能说明该温度报警器电路是由18B20温度传感器作为温度传感器材,由STCC52 单片机进行数据处理,两位位共阳数码管显示温度值。可由电脑USB接口供电,也可外接5V的直流电源。温度显示(和控制)的范围为:-55ºC到125 ºC之间,精度为1ºC,也就是显示整数。如果设定报警的温度为20ºC,则当环境温度达到21ºC时,报警发光二极管发光,同时蜂鸣器发出报警信号。如果不需要对温度控制(报警),可以将报警温度值设置高些。如果控制的是某局部的温度,可将18B20用引线引出,但距离不宜过大,注意其引脚四、原理图五、温度采集模块设计(一)硬件电路设计本温度报警器采用美国DALLAS公司生产的单线数字温度传感器DS18B20(如图3.1),可以把温度信号直接转换成串行数字信号工微机处理,是模数转换器件,而且读DS18B20信息或写DS18B20信息仅需要单线接口,使用非常方便;其测温范围55125,在-10+85时精度为±0.5,可编程的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快;同时DS18B20在使用中不需要任何外围元件(仅需一个4.7K的上拉电阻),全部传感元件及转换电路集成在形如一只三极管的集成电路内,硬件电路十分简单。DS18B20测温原理如图所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被置在55所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。本设计中利用单片的P1.4脚与DS18B20的DQ脚相连,进行数据的传送,如图3所示。 图DS18B20DS18B20测温原理 (二)软件设计DSl8B20必须严格按照单总线通信协议,以保证数据的完整性。该协议定义了几种时隙类型:初始化、应答、写1、写0、读1、读0。除了应答时隙所有这些时隙都是有主机发出。总线上所传输的所有命令和数据都是字节的低位在前。(1)初始化时隙复位时隙和应答时隙。在初始化过程中,主机发送复位脉冲(最短为480s的低电平信号)接着,释放总线并进入接收状态。当总线被释放后上拉电阻将总线拉高。DSl8B20在检测到总线的上升沿之后等待15-60us接着发出应答脉冲(低电平持续60-240 s)。(2)读和写时隙在写时隙期间,主机向DS18B20写入数据;而在读时隙期间,主机读入来自DS18B20的数据。在每一个时隙,总线只能传输一位数据。存在两种写时隙,即写1和写0。主机在写1时隙向DS18B20写入逻辑1。而在写0时隙向DS18B20写入逻辑0。所有写时隙至少需要60S,而且两次写l时隙之间至少需要lS的恢复时间。两种写时隙均以主机拉低总线开始。产生写1时隙:主机拉低总线后,必须在15uS内释放总线。然后由上拉电阻将总线拉至高电平。产生写0时隙:主机拉低总线后,必须在整个时隙期间保持低电平(至少60S)。在写时隙开始后的1 560 S期间,DSl8B20采样总线的状态。如果总线为高电,则逻辑1被写入DSl8B20;如果总线为低电平,则0逻辑被写入DSl8B20。 读时隙:DSl8B20只能在主机发出读时隙时才能向主机传送数据。所以主机在发出读数据命令后,必须马上产生读时隙,以便DSl8B20能够传送数据。所有读时隙至少60s,且在两次独立的读时隙之间至少需要1S的恢复时间。每次读时隙由主机发起,拉低总线至少1S。在主机发起读时隙之后,DSl8B20开始在总线上传送1或0。若DS18B20发送1,则保持总线为高电平;若发送O,则拉低总线。当传送0时,DSl8B20在该时隙结束时释放总线,再由上拉电阻将总线拉回空闲高电平状态。DS18B20发出的数据在读时隙下降沿起始后的1 5uS内有效,因此主机必须在读时隙开始后的15S内释放总线,并且采样总线状态。其程序流程图如下图所示。 DS18B20程序流程附录程序代码:/*基于STC单片机和DS18B20的温度报警系统 *硬件结构框架: 1,单总线温度传感器DS18B202, MCU STC89C523,两位八段共阴数码管 4,晶振:12M,显示效果:1,显示实时温度,精度1度相关知识点:1,单总线温度传感器DS18B20*/#include"AT89x52.h"#include <intrins.h>/要用到_nop_();函数#define uint unsigned int#define uchar unsigned charint T=23;sbit TMDAT=P14; /DS1820温度接口sbit LED=P10;sbit SPEAKING=P12;sbit K=P14;uchar Temp=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /共阳显示段码bit f; /负温度标志bit flag; /DS1820初始化成功标志uchar tempint,tempdf; /温度整数部分和小数部分void set_ds1820() /初始化DS1820while(1)uchar delay;flag=0;TMDAT=0; /总线拉低delay=250;while(-delay); /延时500usTMDAT=1; /拉高总线delay=30;while(-delay); /延时60uswhile(!TMDAT) /当DS1820拉低总线delay=120; while(-delay); /延时240usif(TMDAT)flag=1; /DS1820初始化成功标志if(flag) /初始化成功后再延时480us,时序delay=240;while(-delay);break;void write_ds1820(uchar command) /写8位uchar delay,i;for(i=8;i>0;i-) /循环8次写入TMDAT=0; /拉低总线delay=6;while(-delay); /延时12usTMDAT=command&0x01; /将数据放在总线上,进行采样delay=25;while(-delay); /延时50us,采样完毕command=command>>1; /数据右移一位,准备下次数据TMDAT=1; /释放总线void read_ds1820() /读uchar delay,i,j,k,temp,temph,templ;j=2; /读2位字节数据dofor(i=8;i>0;i-) /一个字节分8位读取temp>>=1; /读取1位右移1位TMDAT=0; /数据线置低电平delay=1;while(-delay); /延时2usTMDAT=1; /拉高总线delay=4;while(-delay); /延时8usif(TMDAT)temp|=0x80; /读取1位数据delay=25;while(-delay); /读取1位数据后延时50usif(j=2)templ=temp; /读取的第一字节存templelse temph=temp; /读取的第二字节存temphwhile(-j);f=0; /初始温度标志为正if(temph&0xf8)!=0x00) /若温度为负的处理,对二进制补码的处理f=1; /为负温度f置1temph=temph;templ=templ;k=templ+1;templ=k;if(k>255)temph+;tempdf=templ&0x0f; /将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdftempl>>=4;temph<<=4;tempint=temph|templ;void get_temperature() /温度转换、获得温度子程序set_ds1820(); /初始化DS18B20write_ds1820(0xcc); /发跳过ROM匹配命令write_ds1820(0x44); /发温度转换命令set_ds1820(); /初始化DS18B20write_ds1820(0xcc); /发跳过ROM匹配命令write_ds1820(0xbe); /发出读温度命令read_ds1820(); /将读出的温度数据保存到tempint和tempdf处void disp_temp() /显示温度uchar tempinth,tempintl;tempinth=tempint/10; /整数高半字节tempintl=tempint%10; /整数低半字节if(!flag)wei_1(0xff); /如果不能检测出DS1820,则不显示else /或者显示温度值P0=Temptempinth;_nop_();_nop_();P2=Temptempintl;/*/外部中断0,用做按键的检测void exter() interrupt 0 / 外部中断0是0号 long int n,m=15000; EX0 = 0; if(T=40) T=0; if(T<40) T+; P0=TempT/10; for(n=0;n<6000;n+) _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); P2=TempT%10; for(n=0;n<6000;n+) _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); while(m-);EX0 = 1;/*void main() /EA=1; int j; /LED=0;/P0=Temp2;/P2=Temp2; EA=1; EX0 = 1;while(1)get_temperature(); /获得温度 if(tempdf>=8)tempdf=5; /0.5度精度显示 else tempdf=0;disp_temp(); /显示if(tempint>T)K=0;for(j=0;j<5000;j+) SPEAKING=0; LED=0;_nop_();_nop_();_nop_();_nop_();_nop_();LED=1;SPEAKING=1;