基于单片机设计的8路温度巡检报警系统.docx
《基于单片机设计的8路温度巡检报警系统.docx》由会员分享,可在线阅读,更多相关《基于单片机设计的8路温度巡检报警系统.docx(35页珍藏版)》请在冰点文库上搜索。
基于单片机设计的8路温度巡检报警系统
届别
学号
毕业设计
基于单片机8路温度巡检报警系统
姓名
系别、专业
导师姓名、职称
完成时间
摘要
智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。
8路温度巡检报警系统就是其中的一个体现,本次设计的8路温度巡检报警系统,以STC89C52单片机作为微控制器,设计出一种8路巡检高低温智能温度报警系统,通过DS18B20温度传感器检测温度,当检测到的温度高于设定值时蜂鸣器报警或当检测到的温度低于设定值时蜂鸣器开始报警,温度检测精确到0.1度。
并具有掉电保存功能,数据保存在单片机内部。
工作状态实时显示在1602液晶上。
其中电源采用3节5号干电池供电。
关键词:
STC89C52单片机DS18B201602液晶模块
1、设计方案与论证
采用STC89C52单片机作为控制单元,因为该型单片机价格便宜,功能比较强大,性价比高,而且在市场上很容易买到。
通过DS18B20温度传感器来采集温度信息,送入主控单元单片机,处理数据后完成相应动作,以达到自身控制。
液晶显示采用1602LCD实时显示工作状态。
此系统比较灵活,更重要的是采用软件方法来解决复杂的硬件电路部分,使系统硬件简洁化,各类功能易于实现,能很好地满足题目的要求。
2、系统硬件设计
2.1单片机选择
方案一:
选用一片CPLD(如EPM7128LC84-15)作为系统的核心部件,实现控制与处理的功能。
CPLD具有速度快、编程容易、资源丰富、开发周期短等优点,可利用VHDL语言进行编写开发。
但CPLD在控制上较单片机有较大的劣势。
同时,CPLD的处理速度非常快,而智能温度报警系统对系统处理信息的要求也就不会太高,在这一点上,MCU就已经可以胜任了。
若采用该方案,必将在控制上遇到许许多多不必要增加的难题。
为此,我们不采用该种方案,进而提出了第二种设想。
方案二:
采用单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。
充分分析我们的系统,以STC89C52单片机作为微控制器,设计出一种高低温智能温度报警系统,通过DS18B20温度传感器检测温度,当检测到的温度高于设定值时蜂鸣器报警或当检测到的温度低于设定值时蜂鸣器开始报警,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。
这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。
51单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。
因此,这种方案是一种较为理想的方案。
2.2电源模块
由于本系统采用电池供电,我们考虑了如下几种方案为系统供电。
方案1:
采用12V蓄电池为系统供电。
蓄电池具有较强的电流驱动能力以及稳定的电压输出性能。
但是蓄电池的体积过于庞大,价格昂贵,在智能温度报警器上使用极为不方便。
因此我们放弃了此方案。
方案2:
采用3节1.5V五号干电池串联共4.5V给单片机传感器供电,4.5V在单片机传感器工作电压内。
经过实验验证,能够满足系统的要求。
系统运行稳定,电池更换方便。
综上所述采用方案2
2.3显示模块
方案1:
用数码管进行显示。
数码管由于显示速度快,使用简单,显示效果简洁明了而得到了广泛应用。
但是由于要显示温度。
及设置菜单,用数码管无法显示如此丰富的内容,因此我们放弃了此方案。
方案2:
用LCD液晶进行显示。
LCD由于其显示清晰,显示内容丰富、清晰,显示信息量大,使用方便,显示快速而得到了广泛的应用。
对于此系统我们选用1602液晶能够很好的满足显示要求,因此我们选择了此方案。
2.4温度传感器
方案1:
用铂电阻测温的非线性校正方法,采用桥式电路将热敏电阻的感温效应,在将随被测温度变化的电压或电流采集过来,再加上放大器将信号放大,并经A\D转换器,在通过显示电路,就可以将被测温度显示出来。
图1铂电阻桥式测温电路
方案2:
考虑使用数字温度传感器,结合单片机电路设计,采用一只DS18B20温度传感器,直接读取被测温度值,之后进行转换,依次完成设计要求。
图2DS18B20测温系统框图
方案比较
方案一采用模拟温度传感器,数据处理麻烦,且容易产生信号失真.DS18B20可以直接温度转换为串行数字信号,供单片机进行处理,具有低功耗、高性能、抗干扰能力强等优点。
比较以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计容易实现,故实际设计中拟采用方案二。
在本系统的电路设计方框图如图2-3所示。
图3温度计电路总体设计方案
DS18B20是Dallas公司生产的一线式数字温度传感器,它具有微型化、低功耗、高性能抗干扰能力、强易配处理器等优点,特别适合用于构成多点温度测控系统,可直接将温度转化成串行数字信号(按9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片,它具有三引脚TO-92小体积封装形式,温度测量范围-55~+125℃,可编程为9~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,业可采用寄生电源方式产生,多个DS18B20可以并联到三根或者两根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
从而可以看出DS18B20可以非常方便的被用于远距离多点温度检测系统。
图4温度芯片DS18B20
3、硬件实现及单元电路设计
3.1主控制模块
主控制最小系统电路如图5所示。
图5单片机最小系统电路图
3.2电源模块电路
采用3节1.5V五号干电池串联共4.5V给系统供电。
实物图如图6。
图6电池实物图
3.3液晶显示模块
液晶显示模块采用1602液晶显示,液晶的数据口接在单片机的P1口,控制键接在单片机的RS、RW和段,具体接口电路如图7:
图7液晶显示电路图
3.4单片机最小运行系统
(1)晶振
晶振为单片机提供时钟信号。
单片机XIAL1和XIAL2分别接30PF的电容,中间再并个12MHZ的晶振,形成单片机的晶振电路。
图8晶振电路
(2)复位电路
单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。
89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。
单片机系统的复位方式有:
手动按钮复位和上电复位。
图9复位电路
ALE引脚悬空,复位引脚接到复位电路、VCC接电源、VSS接地、EA接电源
3.5温度传感器(DS18B20)电路
(1)DS18B20基本介绍
DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号处理器处理。
DS18B20进行精确的温度转换,I/O线必须保证在温度转换期间提供足够的能量,由于每个DS18B20在温度转换期间工作电流达到1mA,当几个温度传感器挂在同一根I/O线上进行多点测温时,只靠4.7K上拉电阻就无法提供足够的能量,会造成无法转换温度或温度误差极大。
因此,下图电路只适应于单一温度传感器测温情况下使用,不适宜采用电池供电系统中。
并且工作电源VCC必须保证在5V,当电源电压下降时,寄生电源能够汲取的能量也降低,会使温度误差变大。
图10温度传感器电路引脚图
(2)DS18B20控制方法
DS18B20有六条控制命令:
温度转换44H启动DS18B20进行温度转换
读暂存器BEH读暂存器9个字节内容
写暂存器4EH将数据写入暂存器的TH、TL字节
复制暂存器48H把暂存器的TH、TL字节写到E2RAM中
重新调E2RAMB8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节
读电源供电方式B4H启动DS18B20发送电源供电方式的信号给主CPU
(3)DS18B20供电方式
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式,如图3.1所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个三极管来完成对总线的上拉。
本设计采用电源供电方式,P2.3口接单线总线为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个上拉电阻和STC89C52的P2.3来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D变换操作时,总线上必须有强的上拉,上拉开启时间最大为10μs。
采用寄生电源供电方式是VDD和GND端均接地。
由于单线制只有一根线,因此发送接收口必须是三状态的。
主机控制DS18B20完成温度转换必须经过3个步骤:
●初始化。
●ROM操作指令。
●存储器操作指令。
3.6蜂鸣器、发光二极管报警电路
电路主要是用来设定温度报警温度的、有高温和低温报警。
图11 蜂鸣器、发光二极管驱动引脚图
4、系统软件设计
4.1程序结构分析
主程序调用了3个子程序,分别是数码管显示程序、温度信号处理程序、按键设定报警温度程序。
温度信号处理程序:
对温度芯片送过来的数据进行处理,进行判断和显示。
数码管显示程序:
向数码管的显示送数,控制系统的显示部分。
按键设定程序:
可以设定低温和高温报警可精确到0.1度。
4.2系统程序流图
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的当前温度值,与设定的报警温度比较,其程序流程见图11所示。
通过调用读温度子程序把存入内存储中的整数部分与小数部分开分存放在不的的两个单元中,然后通过调用显示子程序显示出来。
图11DS18B20温度流程图
4.3DS18B20初始化程序流程图
在DS18B20工作之前需要进行初始化,流程图如下:
图11初始化程序流程图
4.4读温度子程序流程图
读温度子程序的主要功能是从DS18B20中读出温度数据,移入温度暂存器保存。
其程序流程图如下:
图12温度子程序流程图
4.5显示模块软件设计
本设计采用1602液晶作为显示,显示流程如图13
N
Y
图13显示子程序流程图
4.6报警控制电路软件设计
当采集的信号超过设定上下限时,P2.4输出低电平信号“0”,晶体管导通,蜂鸣器获得+5V电压而鸣叫;当P2.4输出高电平信号“1”时,三极管截止,蜂鸣器停止发声。
报警流程图如下
图14报警子程序流程图
4.7多路数据巡回显示
图15多路巡回显示功能流程图
系统开始工作,判断工作模式是多界面显示方式。
当系统工作模式为指定显示模式时,1602液晶显示所选择通道的通道号与对应通道的采集值。
若工作模式为显示模式则循环显示8路通道的通道号与其对应的通道的采集值。
模式的切换与通道号的选择通过独立键盘来完成。
5、结束语
实现的功能:
可设置温度上限高温报警和下限低温报警,报警温度可精确到0.1度,并具有掉电保存功能,数据保存在单片机内部EEPOM中,按键还具有连加、减功能。
LCD1602液晶显示的好处能够同时直观的看到实际温度和上、下限报警温度,。
通过本次设计我掌握了很多以前不熟练的东西,认识了很多以前不熟悉得东西,使我在人生上又进了一步。
也认识到很多的不足。
论文有很多不足之处,但这里的可以回忆起曾经的劳动,换回来今天的作品。
然而当看着自己的作品,系统能够无误的运行,真是莫大的欣慰。
真是酸甜苦辣后的得到成果都是甘甜的。
这次毕业设计的经历使我终身难忘,希望我的设计能够带给师弟师妹们学习这个课程的一个好辅助工具,那么我的辛苦没有白费,经历了这个设计后我学习了很多东西,而中途遇到的困难能够迎刃而解,为我以后遇到困难不畏惧,也为会激励我继续进步。
参考文献
[1]郭惠,吴迅.单片机C语言程序设计完全自学手册[M].电子工业出版社,2008.10:
1-200.
[2]王东锋,王会良,董冠强.单片机C语言应用100例[M].电子工业出版社,2009.3:
145-300.
[3]YamatoI,etal1NewconversionsystemforUPSusinghighfre2
quencylink[J]1IEEEPESC,1988:
210-320.
[4]YamatoI,etal1HighfrequencylinkDC/ACconverterforUPS
withanewvoltageclamper[J]1IEEEPESC,1990:
52-105.
附件一整体原理图
附件二布防源程序
#include
#include"lcd1602.h"
#include"eepom52.h"
#include"18b20_8lu.h"
#defineucharunsignedchar
#defineuintunsignedint
/**********按键*************
2
14
3
************************/
sbitbeep=P2^4;//蜂鸣器IO口定义
uchara_a;
bitflag_300ms;
bitflag_50ms;
bitflag_2s;
ucharkey_can;//按键值的变量
ucharmenu_1;//菜单设计的变量
uintt_high=300,t_low=100;
uintt1_high=301,t1_low=101;
uintt2_high=302,t2_low=102;
uintt3_high=303,t3_low=103;
uintt4_high=304,t4_low=104;
uintt5_high=305,t5_low=105;
uintt6_high=306,t6_low=106;
uintt7_high=307,t7_low=107;
uintt8_high=308,t8_low=108;
bitflag_lj_en;//按键连加使能
bitflag_lj_3_en;//按键连3次连加后使能加的数就越大了
ucharkey_time,flag_value;//用做连加的中间变量
bitkey_500ms;
ucharmenu_shudu=20;//用来控制连加的速度
ucharflag_clock;//温度报警变量
ucharflag_fuzi;//用做菜单内的初始化的
uchart1=0,t2=0,t3=0,t4=0,t5=0,t6=0,t7=0,t8=0;//对就8个温度的报警标志位
uchart_zong;//一个有多少个报警
ucharzd_break_en,zd_break_value;//自动退出设置界面
/***********************1ms延时函数*****************************/
voiddelay_1ms(uintq)
{
uinti,j;
for(i=0;ifor(j=0;j<110;j++);
}
/******************把数据保存到单片机内部eepom中******************/
voidwrite_eepom12()
{
SectorErase(0x2000);
byte_write(0x2000,t1_high%256);
byte_write(0x2001,t1_high/256);
byte_write(0x2002,t1_low%256);
byte_write(0x2003,t1_low/256);
byte_write(0x2004,t2_high%256);
byte_write(0x2005,t2_high/256);
byte_write(0x2006,t2_low%256);
byte_write(0x2007,t2_low/256);
byte_write(0x2055,a_a);
}
voidwrite_eepom34()
{
SectorErase(0x2200);
byte_write(0x2200,t3_high%256);
byte_write(0x2201,t3_high/256);
byte_write(0x2202,t3_low%256);
byte_write(0x2203,t3_low/256);
byte_write(0x2204,t4_high%256);
byte_write(0x2205,t4_high/256);
byte_write(0x2206,t4_low%256);
byte_write(0x2207,t4_low/256);
byte_write(0x2255,a_a);
}
voidwrite_eepom56()
{
SectorErase(0x2400);
byte_write(0x2400,t5_high%256);
byte_write(0x2401,t5_high/256);
byte_write(0x2402,t5_low%256);
byte_write(0x2403,t5_low/256);
byte_write(0x2404,t6_high%256);
byte_write(0x2405,t6_high/256);
byte_write(0x2406,t6_low%256);
byte_write(0x2407,t6_low/256);
byte_write(0x2455,a_a);
}
voidwrite_eepom78()
{
SectorErase(0x2600);
byte_write(0x2600,t7_high%256);
byte_write(0x2601,t7_high/256);
byte_write(0x2602,t7_low%256);
byte_write(0x2603,t7_low/256);
byte_write(0x2604,t8_high%256);
byte_write(0x2605,t8_high/256);
byte_write(0x2606,t8_low%256);
byte_write(0x2607,t8_low/256);
byte_write(0x2655,a_a);
}
/******************把数据从单片机内部eepom中读出来*****************/
voidread_eepom12()
{
t1_high=byte_read(0x2001);
t1_high<<=8;
t1_high|=byte_read(0x2000);
t1_low=byte_read(0x2003);
t1_low<<=8;
t1_low|=byte_read(0x2002);
t2_high=byte_read(0x2005);
t2_high<<=8;
t2_high|=byte_read(0x2004);
t2_low=byte_read(0x2007);
t2_low<<=8;
t2_low|=byte_read(0x2006);
a_a=byte_read(0x2055);
}
voidread_eepom34()
{
t3_high=byte_read(0x2201);
t3_high<<=8;
t3_high|=byte_read(0x2200);
t3_low=byte_read(0x2203);
t3_low<<=8;
t3_low|=byte_read(0x2202);
t4_high=byte_read(0x2205);
t4_high<<=8;
t4_high|=byte_read(0x2204);
t4_low=byte_read(0x2207);
t4_low<<=8;
t4_low|=byte_read(0x2206);
a_a=byte_read(0x2255);
}
voidread_eepom56()
{
t5_high=byte_read(0x2401);
t5_high<<=8;
t5_high|=byte_read(0x2400);
t5_low=byte_read(0x2403);
t5_low<<=8;
t5_low|=byte_read(0x2402);
t6_high=byte_read(0x2405);
t6_high<<=8;
t6_high|=byte_read(0x2404);
t6_low=byte_read(0x2407);
t6_low<<=8;
t6_low|=byte_read(0x2406);
a_a=byte_read(0x2455);
}
voidread_eepom78()
{
t7_high=byte_read(0x2601);
t7_high<<=8;
t7_high|=byte_read(0x2600);
t7_low=byte_read(0x2603);
t7_low<<=8;
t7_low|=byte_read(0x2602);
t8_high=byte_read(0x2605);
t8_high<<=8;
t8_high|=byte_read(0x2604);
t8_low=byte_read(0x2607);
t8_low<<=8;
t8_low|=byte_read(0x2606);
a_a=byte_read(0x2655);
}
#include"menu.h"
/******