1温度报警系统的设计1.设计思路本设计是一种基于STC89C52的温度检测及报警系统。该系统将单总线温度传感器DS18B20并接在控制器的一个端口上,对传感器温度进行采集,将采集到的温度值实时显示同时与设定值进行比较,当超出设定的上限温度时,通过蜂鸣器报警,并根据要求打开继电器或电风扇。2.方案设计采用技术成熟、操作简单、精确度高的温度传感器,在此,可以选用数字温度传感器DS18B20,根据它的特点和测温原理,很容易就能直接读取被测温度值并进行转换,这样就可以满足设计要求。码管以串口并行输出方式传送数据实现温度显示。图1总体设计框图2.1主要器件的选择STC89C52是低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大STC89C52单片机适合于许多较为复杂控制应用场合。STC89C52单片机为40引脚双列直插芯片,有四个I/O口P0、P1、P2、P3,每一条I/O线都能独立地作输出或输入。STC89C52PDIP管脚封装,如图2所示。图2STC89C52单片机内部引脚封装图2STC89c52包含以下部分:(1)一个8位微处理器CPU(2)片内数据存储器RAM和特殊功能寄存器SFR(3)片内程序存储器ROM(4)两个定时/计数器T0、T1,可用作定时器,也可用以对外部脉冲进行计数(5)四个8位可编程的并行I/O端口,每个端口既可作输入,也可作输出(6)一个串行端口,用于数据的串行通信(7)中断控制系统(8)内部时钟电路2.2DS18B20温度传感器(1)DS18B20的主要特征:▲全数字温度转换及输出。▲先进的单总线数据通信。▲最高12位分辨率,精度可达土0.5摄氏度。▲12位分辨率时的最大工作周期为750毫秒。▲多样封装形式,适应不同硬件系统。·(2)DS18B20内部结构:图3DS18B20内部结构框图温度传感器DS18B20的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图2.4所示。2.3蜂鸣器的报警原理(三极管驱动的蜂鸣器报警电路)3图4蜂鸣器设计原理图P1.0接三极管输入端。当P1.0输出低电平时,三极管导通,压电式蜂鸣器两端获得的+5V电压而鸣叫:当P1.0输出高电平,三极管截止,蜂鸣器停止发音。3.单元电路设计3.1单片机电路图设计本系统使用儿的基于单片机的温度计的设计所以首先设计单片机的最小系统,所谓最小系统是一个真正可用的单片机的最小配置系统。由于本次设计所是用的stc89c52单片机片内不能集成始终电路所需的晶体振荡器,也没有复位电路,在构成最小系统时必须外接这些部件。电路设计如下,其中电容为22PF,晶振为12MHZ。图5单片机原理图3.2温度传感器DS18B20电路图设计4主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式如图3.4所示。其中,DQ为数据输入/输出引脚,也可用作开漏单总线接口引脚,当被用在寄生电源工作方式下,可以向器件提供电源;GND为地信号;VDD为可选择的电源引脚,当工作于寄生电源时,此引脚必须接地。其电路图6所示。图6DS18B20温度传感器设计图3.3蜂鸣器电路图设计压电式蜂鸣器约10mA的驱动电流,可以使用TTL系列集成电路7406或7407低电平驱动,这里我选用了一个三极管来做驱动。P1.0接三极管输入端。当P1.0输出低电平时,三极管导通,压电式蜂鸣器两端获得的+5V电压而鸣叫:当P1.0输出高电平,三极管截止,蜂鸣器停止发音。图7蜂鸣器设计原理图4.软件设计4.1流程图设计5图8程序设计流程图4.2程序设计温度报警系统端口说明公共端是P2.0-P2.3,数码管显示用P0口ds18B20是P3.6,蜂鸣器P3.7,set按键是P3.1,减法键是P3.2,加法键是P3.3DS18B20.C/******************************************************************程序名称:DS18B20温度测量、报警系统简要说明:DS18B20温度计,温度测量范围0~99.9摄氏度可设置上限报警温度、下限报警温度即高于上限值或者低于下限值时蜂鸣器报警默认上限报警温度为38℃、默认下限报警温度为5℃报警值可设置范围:最低上限报警值等于当前下限报警值最高下限报警值等于当前上限报警值将下限报警值调为0时为关闭下限报警功能******************************************************************/#includeAT89X52.h6#includeDS18B20.h#defineuintunsignedint#defineucharunsignedchar//宏定义#defineSETP3_1//定义调整键#defineDECP3_2//定义减少键#defineADDP3_3//定义增加键#defineBEEPP3_7//定义蜂鸣器bitshanshuo_st;//闪烁间隔标志bitbeep_st;//蜂鸣器间隔标志sbitDIAN=P0^7;//小数点ucharx=0;//计数器signedcharm;//温度值全局变量ucharn;//温度值全局变量ucharset_st=0;//状态标志signedcharshangxian=38;//上限报警温度,默认值为38signedcharxiaxian=5;//下限报警温度,默认值为38ucharcodeLEDData[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};/*****延时子程序*****/voidDelay(uintnum){while(--num);}/*****初始化定时器0*****/voidInitTimer(void){TMOD=0x1;TH0=0x4c;TL0=0x00;//50ms(晶振11.0592M)}/*****定时器0中断服务程序*****/voidtimer0(void)interrupt1{TH0=0x4c;TL0=0x00;x++;}/*****外部中断0服务程序*****/voidint0(void)interrupt0{EX0=0;//关外部中断0if(DEC==0&&set_st==1){shangxian--;if(shangxianxiaxian)shangxian=xiaxian;7}elseif(DEC==0&&set_st==2){xiaxian--;if(xiaxian0)xiaxian=0;}}/*****外部中断1服务程序*****/voidint1(void)interrupt2{EX1=0;//关外部中断1if(ADD==0&&set_st==1){shangxian++;if(shangxian99)shangxian=99;}elseif(ADD==0&&set_st==2){xiaxian++;if(xiaxianshangxian)xiaxian=shangxian;}}/*****读取温度*****/voidcheck_wendu(void){uinta,b,c;c=ReadTemperature()-5;//获取温度值并减去DS18B20的温漂误差a=c/100;//计算得到十位数字b=c/10-a*10;//计算得到个位数字m=c/10;//计算得到整数位n=c-a*100-b*10;//计算得到小数位if(m0){m=0;n=0;}//设置温度显示上限if(m99){m=99;n=9;}//设置温度显示上限}/*****显示开机初始化等待画面*****/Disp_init(){P0=0x40;//显示-P2=0x08;Delay(200);P2=0x04;Delay(200);P2=0x02;Delay(200);8P2=0x01;Delay(200);P2=0x00;//关闭显示}/*****显示温度子程序*****/Disp_Temperature()//显示温度{P0=0x39;//显示CP2=0x08;Delay(300);P0=LEDData[n];//显示个位P2=0x04;Delay(300);P0=LEDData[m%10];//显示十位DIAN=1;//显示小数点P2=0x02;Delay(300);P2=0x00;//关闭显示}Disp_alarm(ucharbaojing)/*****显示报警温度子程序*****/{P0=0x39;//显示CP2=0x08;Delay(200);P0=LEDData[baojing%10];//显示十位P2=0x04;Delay(200);if(set_st==1)P0=0x76;elseif(set_st==2)P0=0x38;//上限H、下限L标示P2=0x01;Delay(200);P2=0x00;//关闭显示}voidAlarm()/*****报警子程序*****/{if(x=10){beep_st=~beep_st;x=0;}if((m=shangxian&&beep_st==1)||(mxiaxian&&beep_st==1))BEEP=0;elseBEEP=1;}voidmain(void)/*****主函数*****/9{uintz;InitTimer();//初始化定时器EA=1;//全局中断开关TR0=1;ET0=1;//开启定时器0IT0=1;IT1=1;check_wendu();check_wendu();for(z=0;z300;z++){Disp_init();}while(1){if(SET==0){Delay(2000);do{}while(SET==0);set_st++;x=0;shanshuo_st=1;if(set_st2)set_st=0;}if(set_st==0){EX0=0;//关闭外部中断0EX1=0;//关闭外部中断1check_wendu();Disp_Temperature();Alarm();//报警检测}elseif(set_st==1){BEEP=1;//关闭蜂鸣器EX0=1;//开启外部中断0EX1=1;//开启外部中断1if(x=10){shanshuo_st=~shanshuo_st;x=0;}if(shanshuo_st){Disp_alarm(shangxian);}}elseif(set_st==2){BEEP=1;//关闭蜂鸣器EX0=1;//开启外部中断0EX1=1;//开启外部中断1if(x=10){shanshuo_st=~shanshuo_st;x=0;}10if(shanshuo_st){Disp_alarm(xiaxian);}}}}/*****END*****/5.小结89S52芯片控制温度传感器DS18B20,再辅之以部分外围电路实现对环境温度的测控,性能稳定,精度教高,而且扩展性能很强大。由于DS18B20的测量精度只有±0.5度,往往很多场合需要更加精确的温度,在所测温度精度不变的基础上必须对数据进行校正。由于DS18B20是基于带隙结构的数字式温度传感器,PN结增量电压正比于IC绝对温度(PTAT),它的测温精度较高,但存在着一定的误差.不过,其误差在时间和外部环境变化的条件下,保持相当高的稳定性。