《基于AT89C51单片机温度报警系统设计与制作.doc》由会员分享,可在线阅读,更多相关《基于AT89C51单片机温度报警系统设计与制作.doc(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、一、摘要我们介绍的是一种基于单片机控制的数字温度报警,本温度系统具有多功能性,即可以当数字温度计使用,显示当前环境温度,又可以作为报警器使用,设置报警温度,当温度不在设置范围内时,可以报警,并采取措施使温度下降。 该温度报警系统控制器使用单片机AT89C51,测温传感器使DS18B20,用2位共阳极LED数码管,实现温度显示,能准确到达以上要求。 二、设计方案1、方案一由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温
2、电路比拟麻烦。2、 方案二 进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。从以上两种方案,很容易看出,采用方案二,电路比拟简单,软件设计也比拟简单,故采用了方案二。温度报警系统电路设计总体设计方框图如图1所示 主 控 制 器单片机复位时钟振荡报警点按键调整 LED显示温 度 传 感器 器蜂鸣器报警小风扇转动图1总体设计方框图三、模块功能分析1、单片机主板电路单片机AT89C51具有低电压供电和体积小等特点,该模块包括中央处理CPU -AT89
3、C51、时钟电路及复位电路; 图2复位电路 图3 时钟电路2、DS18B20温度传感器与单片机的接口电路DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改良型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现位的数字值读数方式。DS18B20是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。该电路完成了信号的采集、转换和传输。图43、上下限报警调整电路 分别调整温度的上下限报警设置,有“+“、“-、“确定等键图5上下限报警调整电路4、温度显示电路显示当前测得的温度,数码管采用74LS247驱动
4、图6温度显示电路5、报警电路 当环境温度超过设定温度时,蜂鸣器鸣叫,红灯点亮,发生报警;当人员发现警报时,可按图8中的按钮,暂时中断蜂鸣器的鸣叫。 图7 蜂鸣器、亮灯报警电路 图8 中断电路6、控制电路 该电路的作用是:当测量温度超过设定温度时,小风扇以下转动,加快仪器散热,使温度保持在设定温度以下。图9控制电路四、整体构造及功能整体电路图如下:图10整体电路图实现的总体功能:l 实现对环境温度的测量和显示l 能通过按键设置报警温度l 温度超过设置值时,产生光声报警l 报警同时系统自带小风扇转动以降低温度主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温
5、度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见下列图所示NY开始到达上限?DS18B20初始化初始化DS18B20存在吗?对DS18B20写指令读DS18B20转换温度小风扇转动显示温度NY报警附录:源程序/*/*温度报警器*/*/#include#include#define uchar unsigned char#define Tube P0/数码管端口#define Key P1/键盘端口sbit DQ = P14;/温度传感器DS18B20数据传输端sbit BUZZER = P15;/蜂鸣器端口sbit RUN = P16;/运行指示灯端口sbit SET =
6、 P17;/设置指示灯端口sbit Feng = P33;/风扇端口bit Status;/设置状态标志位bit Warning;/警报标志位bit Int;/外部中断标志位uchar OP1L;/原P1端低4位状态uchar NP1L;/现P1端低4位状态uchar FinT;/最终测得温度uchar LimT;/警报温度下限uchar Count;/定时器计数/*/#includeDelay.h#includeDisplay.h#includeInitialize.h#includeError.h#includeKeyScan.h#includeMeasure.h#includeInter
7、rupt.h/*/*主程序*/*/void main()Initialize();/初始化do/开机自检,跳过默认初始的85Measure();while( FinT = 0X55 );while(1)KeyScan();/键盘扫描Measure();/获取测量温度 Display();/显示/*/*初始化*/*/void Initialize()Status = 0;/初始化设置状态标志位Warning = 0;/初始化警报标志位BUZZER = 1;/初始化蜂鸣器状态RUN = 0;/初始化运行指示灯SET = 1;/初始化设置指示灯Feng = 1;/初始化风扇端口OP1L = 0X00
8、;/初始化原P1低4位NP1L = 0X00;/初始化新P1低4位LimT = 0X1B;/初始化警报温度下限为27Count = 0X00;/初始化定时器计数单元EA = 1;/开总中断EX0 = 1;/开外部中断0中断允许IT0 = 1;/设置外部中断0为边沿触发方式/*/*温度测量*/*/void InitDS18B20(); /初始化DS18B20void WriteDS18B20( uchar ch );/写DS18B20数据uchar ReadDS18B20();/读DS18B20数据 void Measure() uchar TemH;/保存传感器发送数据高8位uchar Tem
9、L;/保存传感器发送数据低8位 InitDS18B20(); WriteDS18B20( 0XCC );/跳过ROM _nop_();InitDS18B20(); WriteDS18B20( 0XCC );/跳过ROM_nop_(); WriteDS18B20( 0X44 );/发送温度转换指令 Delay1ms( 25 ); Delay1ms( 25 ); Delay1ms( 25 ); Delay1ms( 25 );/等待1s转换 InitDS18B20(); WriteDS18B20( 0XCC );/跳过ROM WriteDS18B20( 0XBE );/发送温度转换指令 TemL =
10、 ReadDS18B20(); /读低位温度值 TemH = ReadDS18B20(); /读高位温度值 Delay1ms( 2 ); TemH = ( TemH4 );/保存温度值整数局部FinT = TemH; if( FinT LimT )/判断是否警报Warning = 1;elseWarning = 0; uchar ReadDS18B20()/读DS18B20数据 uchar ch; uchar q ; for( q=0; q 1; DQ = 0; _nop_(); DQ = 1; _nop_();_nop_();_nop_();_nop_(); if( DQ = 1 )ch =
11、 ch | 0X80; elsech = ch & 0X7f;Delay15us( 3 ); DQ = 1; return( ch );void WriteDS18B20( uchar ch )/写DS18B20数据 uchar i; for( i=0; i 1; _nop_(); void InitDS18B20()/初始化DS18B20 DQ = 0; Delay15us( 33 );/至少延时480us DQ = 1; Delay15us( 10 );/至少延时100us /*/*显示*/*/void Display() uchar T;if( Status = 1 )/判断状态T =
12、LimT;elseT = FinT;T = T % 10 + T / 10 * 16;/将2进制码转化为BCD码 Tube = T;/数码管显示RUN = Warning;/运行指示灯显示BUZZER = !Warning | Int;/蜂鸣器Feng = !Warning;/风扇SET = !Status;/设置指示灯显示 Delay1ms( 20 ); /*/*键盘扫描*/*/void KeyScan()NP1L = Key;/读取按键状态 NP1L = NP1L & 0X0F;NP1L = NP1L 0X0F;if( NP1L != OP1L )switch(NP1L)/判断按键case
13、 0X01:/按键为“设置Status = 1;/进入设置状态break;case 0X02:/按键为“+1if( Status = 1)/判断是否为设置状态LimT+;/警报温度下限+1LimT = LimT % 100;/超过99清零Delay1ms(255);elseError();break;case 0X04:/按键为“-1if( Status = 1)/判断是否为设置状态LimT-;/警报温度下限-1if( LimT 0 )LimT = 0X63;/低于0变为99Delay1ms(255);elseError();break;case 0X08:/按键为“确认Status = 0;
14、/返回测温状态break;default:/多键按下Error();/出错复位break;NP1L = 0X00;/重新初始化/*/*中断效劳*/*/void Int0( void ) interrupt 0 Int = 1;/外部中断标志位置1EX0 = 0;/关外部中断0中断允许TMOD = 0X01;/设置定时器0工作在模式1TH0 = 0X3C;TL0 = 0XB0;/为T0赋初值,令其定时50msCount = 0X3C;/设置计数次数 ET0 = 1;/开T0中断允许TR0 = 1;/开T0中断/*/void Timer0( void )interrupt 1if( Count =
15、 0 )/判断定时计数是否结束ET0 = 0;/关T0中断允许TR0 = 0;/关T0中断Int = 0;/外部中断标志位置0EX0 = 1;/开外部中断0中断允许elseTL0 = 0XB0;/重新赋T0初值TH0 = 0X3C;Count -;/定时计数减1/*/*延迟函数*/*/void Delay15us( uchar n )/延迟n*15us do _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); n-; while( n );void Delay1ms( uchar delay )/延迟delay*1ms uchar i; while( delay- ) for( i=0; i124; i+); /*/*报错复位*/*/void Error()Tube = 0XAA;/出错显示BUZZER = 0;/鸣蜂鸣器RUN = 1;/LED警报Delay1ms( 255 );/延迟Delay1ms( 255 );Delay1ms( 255 );Delay1ms( 255 );Delay1ms( 255 );( *(void(*)()0 )();/软复位仅供学习参考
限制150内