基于单片机设计的智能温度报警器剖析.doc

上传人:牧羊曲112 文档编号:4958026 上传时间:2023-05-26 格式:DOC 页数:24 大小:773.49KB
返回 下载 相关 举报
基于单片机设计的智能温度报警器剖析.doc_第1页
第1页 / 共24页
基于单片机设计的智能温度报警器剖析.doc_第2页
第2页 / 共24页
基于单片机设计的智能温度报警器剖析.doc_第3页
第3页 / 共24页
基于单片机设计的智能温度报警器剖析.doc_第4页
第4页 / 共24页
基于单片机设计的智能温度报警器剖析.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《基于单片机设计的智能温度报警器剖析.doc》由会员分享,可在线阅读,更多相关《基于单片机设计的智能温度报警器剖析.doc(24页珍藏版)》请在三一办公上搜索。

1、智能温度报警系统摘要:智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能温度报警系统就是其中的一个体现,本次设计的智能温度报警系统,以STC89C52单片机作为微控制器,设计出一种高低温智能温度报警系统,通过DS18B20温度传感器检测温度,当检测到的温度高于设定值时蜂鸣器报警或当检测到的温度低于设定值时蜂鸣器开始报警,温度检测精确到0.1度。并具有掉电保存功能,数据保存在单片机内部。工作状态实时显示在1602液晶上。其中电源采用3节5号干电池供电。关键词:STC89C52单片机 DS18B20 1602液

2、晶模块 1 设计方案与论证 采用STC89C52单片机作为控制单元,因为该型单片机价格便宜,功能比较强大,性价比高,而且在市场上很容易买到。通过DS18B20温度传感器来采集温度信息,送入主控单元单片机,处理数据后完成相应动作,以达到自身控制。液晶显示采用1602LCD实时显示工作状态。此系统比较灵活,更重要的是采用软件方法来解决复杂的硬件电路部分,使系统硬件简洁化,各类功能易于实现,能很好地满足题目的要求。2 系统硬件设计2.1 单片机选择方案一:选用一片CPLD(如EPM7128LC84-15)作为系统的核心部件,实现控制与处理的功能。CPLD具有速度快、编程容易、资源丰富、开发周期短等优

3、点,可利用VHDL语言进行编写开发。但CPLD在控制上较单片机有较大的劣势。同时,CPLD的处理速度非常快,而智能温度报警系统对系统处理信息的要求也就不会太高,在这一点上,MCU就已经可以胜任了。若采用该方案,必将在控制上遇到许许多多不必要增加的难题。为此,我们不采用该种方案,进而提出了第二种设想。方案二:采用单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。充分分析我们的系统,以STC89C52单片机作为微控制器,设计出一种高低温智能温度报警系统,通过DS18B20温度传感器检测温度,当检测到的温度高于设定值时蜂鸣器报警或当检测到的温度低于设定值时蜂鸣器开始报警,而在这

4、一点上,单片机就显现出来它的优势控制简单、方便、快捷。这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。51单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。因此,这种方案是一种较为理想的方案。2.2 电源模块 由于本系统采用电池供电,我们考虑了如下几种方案为系统供电。方案1: 采用12V蓄电池为系统供电。蓄电池具有较强的电流驱动能力以及稳定的电压输出性能。但是蓄电池的体积过于庞大,价格昂贵,在智能温度报警器上使用极为不方便。因此我们放弃了此方案。方案2:采用3节1.5

5、 V 五号干电池串联共4.5V给单片机传感器供电,4.5V在单片机传感器工作电压内。经过实验验证,能够满足系统的要求。系统运行稳定,电池更换方便。综上所述采用方案22.3 显示模块方案1: 用LCD1602液晶进行显示。LCD1602液晶由于显示速度快,使用简单,显示效果简洁明了而得到了广泛应用。但是由于要显示温度。及设置菜单,用LCD1602液晶无法显示如此丰富的内容,因此我们放弃了此方案。方案 2: 用LCD液晶进行显示。LCD由于其显示清晰,显示内容丰富、清晰,显示信息量大,使用方便,显示快速而得到了广泛的应用。对于此系统我们选用1602液晶能够很好的满足显示要求,因此我们选择了此方案。

6、2.4 温度传感器方案 1:用铂电阻测温的非线性校正方法,采用桥式电路将热敏电阻的感温效应,在将随被测温度变化的电压或电流采集过来,再加上放大器将信号放大,并经AD转换器,在通过显示电路,就可以将被测温度显示出来。图1铂电阻桥式测温电路方案 2:考虑使用数字温度传感器,结合单片机电路设计,采用一只DS18B20温度传感器,直接读取被测温度值,之后进行转换,依次完成设计要求。图2 DS18B20测温系统框图方案比较 方案一采用模拟温度传感器,数据处理麻烦,且容易产生信号失真. DS18B20可以直接温度转换为串行数字信号,供单片机进行处理,具有低功耗、高性能、抗干扰能力强等优点。比较以上两种方案

7、,很容易看出,采用方案二,电路比较简单,软件设计容易实现,故实际设计中拟采用方案二。在本系统的电路设计方框图如图2-3所示。STC89C52CPUDS18B20温度芯片1602显示报警电路电源图3 温度计电路总体设计方案 DS18B20是Dallas公司生产的一线式数字温度传感器,它具有微型化、低功耗、高性能抗干扰能力、强易配处理器等优点,特别适合用于构成多点温度测控系统,可直接将温度转化成串行数字信号(按9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片,它具有三引脚TO-92小体积封装形式,温度测量范围55125,可编程为912位A/D转换精度,测温分辨率可达0.0625,

8、被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,业可采用寄生电源方式产生,多个DS18B20可以并联到三根或者两根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。从而可以看出DS18B20可以非常方便的被用于远距离多点温度检测系统。图4 温度芯片DS18B203 硬件实现及单元电路设计3.1 主控制模块主控制最小系统电路如图5所示。 图 5 3.2 电源模块 采用3节1.5 V 五号干电池串联共4.5V给系统供电。实物图如图6。图 63.4 显示模块 显示模块采用1602液晶显示接口电路如图7图 73.5 单片

9、机最小运行系统(1)晶振晶振为单片机提供时钟信号。单片机XIAL1和XIAL2分别接30PF的电容,中间再并个12MHZ的晶振,形成单片机的晶振电路。图8 晶振电路(2)复位电路单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。单片机系统的复位方式有:手动按钮复位和上电复位。 图9 复位电路 ALE引脚悬空,复位引脚接到复位电路、VCC接电源、VS

10、S接地、EA接电源3.6 温度传感器(DS18B20)电路(1) DS18B20基本介绍DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号处理器处理。DS18B20进行精确的温度转换,I/O线必须保证在温度转换期间提供足够的能量,由于每个DS18B20在温度转换期间工作电流达到1mA,当几个温度传感器挂在同一根I/O线上进行多点测温时,只靠4.7K上拉电阻就无法提供足够的能量,会造成无法转换温度或温度误差极大。因此,下图电路只适应于单一温度传感器测温情况下使用,不

11、适宜采用电池供电系统中。并且工作电源VCC必须保证在5V,当电源电压下降时,寄生电源能够汲取的能量也降低,会使温度误差变大。图10 温度传感器电路引脚图(2) DS18B20控制方法 DS18B20有六条控制命令:温度转换 44H 启动DS18B20进行温度转换 读暂存器 BEH 读暂存器9个字节内容 写暂存器 4EH 将数据写入暂存器的TH、TL字节 复制暂存器 48H 把暂存器的TH、TL字节写到E2RAM中 重新调E2RAM B8H 把E2RAM中的TH、TL字节写到暂存器TH、TL字节 读电源供电方式 B4H 启动DS18B20发送电源供电方式的信号给主CPU (3) DS18B20供

12、电方式DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,如图3.1所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个三极管来完成对总线的上拉。本设计采用电源供电方式, P2.3口接单线总线为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个上拉电阻和STC89C52的P2.3来完成对总线的上拉。当DS18B20处于写存储器操作和温度A/D变换操作时,总线上必须有强的上拉,上拉开启时间最大为10 s。采用寄生电源供电方式是VDD和GND端均接地。由于单线制

13、只有一根线,因此发送接收口必须是三状态的。主机控制DS18B20完成温度转换必须经过3个步骤:l 初始化。l ROM操作指令。l 存储器操作指令。3.7 蜂鸣器、发光二极管报警电路 电路主要是用来设定温度报警温度的、有高温和低温报警。图11蜂鸣器、发光二极管驱动引脚图4.系统软件设计4.1 程序结构分析主程序调用了3个子程序,分别是LCD1602液晶显示程序、温度信号处理程序、按键设定报警温度程序。温度信号处理程序:对温度芯片送过来的数据进行处理,进行判断和显示。LCD1602液晶显示程序:向LCD1602液晶的显示送数,控制系统的显示部分。按键设定程序:可以设定低温和高温报警可精确到0.1度

14、。4.2 系统程序流图主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的当前温度值,与设定的报警温度比较,其程序流程见图11所示。通过调用读温度子程序把存入内存储中的整数部分与小数部分开分存放在不的的两个单元中,然后通过调用显示子程序显示出来。调用显示子程序初始化1s到?初次上电发温度转换开始命令读出温度值温度计算处理显示数据刷新图11 DS18B20温度流程图4.3 DS18B20初始化程序流程图在DS18B20工作之前需要进行初始化,流

15、程图如下:发复位命令发跳过ROM命令 初始化成功 结束图11 初始化程序流程图4.4 读温度子程序流程图读温度子程序的主要功能是从DS18B20中读出温度数据,移入温度暂存器保存。其程序流程图如下:发复位命令发跳过ROM命令 发读取温度命令 移入温度暂存器 结束 图12 温度子程序流程图 5 结束语 实现的功能:可设置温度上限高温报警和下限低温报警,报警温度可精确到0.1度,并具有掉电保存功能,数据保存在单片机内部EEPOM中,进入设置界面后如果没有键按下系统会在15秒后自动退出设置界面,人性化的按键设置,按键还具有连加、减功能。LCD1602液晶显示的好处能够同时直观的看到实际温度和上、下限

16、报警温度,。 通过本次设计我掌握了很多以前不熟练的东西,认识了很多以前不熟悉得东西,使我在人生上又进了一步。也认识到很多的不足。论文有很多不足之处,但这里的可以回忆起曾经的劳动,换回来今天的作品。然而当看着自己的作品,系统能够无误的运行,真是莫大的欣慰。真是酸甜苦辣后的得到成果都是甘甜的。 这次毕业设计的经历使我终身难忘,希望我的设计能够带给师弟师妹们学习这个课程的一个好辅助工具,那么我的辛苦没有白费,经历了这个设计后我学习了很多东西,而中途遇到的困难能够迎刃而解,为我以后遇到困难不畏惧,也为会激励我继续进步。参考文献1郭惠,吴迅.单片机C语言程序设计完全自学手册M.电子工业出版社,2008.

17、10:1-200.2王东锋,王会良,董冠强. 单片机C语言应用100例M. 电子工业出版社,2009.3:145-300.3Yamato I , et al 1 New conversion system for UPS using high fre2quency linkJ 1 IEEE PESC ,1988 :210-320.4Yamato I , et al 1 High frequency link DC/ AC converter for UPSwith a new voltage clamperJ 1IEEE PESC ,1990 :52-105.部分程序:#include #in

18、clude lcd1602.h#include eepom52.h#define uchar unsigned char #define uint unsigned intsbit dq = P23;/18b20 IO口的定义sbit beep = P24; /蜂鸣器IO口定义uchar a_a;uint temperature ; /bit flag_300ms ;uchar key_can; /按键值的变量uchar menu_1; /菜单设计的变量uint t_high = 300,t_low = 100;bit flag_lj_en; /按键连加使能bit flag_lj_3_en;

19、/按键连3次连加后使能 加的数就越大了 uchar key_time,flag_value; /用做连加的中间变量bit key_500ms ;uchar flag_clock;/温度报警变量uchar zd_break_en,zd_break_value; /自动退出设置界面uchar menu_shudu = 20; /用来控制连加的速度/*1ms延时函数*/void delay_1ms(uint q)uint i,j;for(i=0;iq;i+)for(j=0;j110;j+);/*把数据保存到单片机内部eepom中*/void write_eepom()SectorErase(0x20

20、00);byte_write(0x2000, t_high % 256);byte_write(0x2001, t_high / 256);byte_write(0x2002, t_low % 256);byte_write(0x2003, t_low / 256);byte_write(0x2055, a_a);/*把数据从单片机内部eepom中读出来*/void read_eepom()t_high = byte_read(0x2001);t_high = 8;t_high |= byte_read(0x2000);t_low = byte_read(0x2003);t_low = 8;t

21、_low |= byte_read(0x2002);a_a = byte_read(0x2055);/*18b20初始化函数*/void init_18b20()bit q;dq = 1;/把总线拿高delay_uint(1); /15usdq = 0;/给复位脉冲delay_uint(80);/750usdq = 1;/把总线拿高 等待delay_uint(10);/110usq = dq;/读取18b20初始化信号delay_uint(20);/200usdq = 1;/把总线拿高 释放总线/*写18b20内的数据*/void write_18b20(uchar dat)uchar i;f

22、or(i=0;i= 1;/*读取18b20内的数据*/uchar read_18b20()uchar i,value;for(i=0;i= 1; /读数据是低位开始dq = 1; /释放总线if(dq = 1) /开始读写数据 value |= 0x80;delay_uint(5); /60us读一个时间隙最少要保持60us的时间return value; /返回数据/*读取温度的值 读出来的是小数*/uint read_temp()uint value;uchar low; /在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序init_18b20(); /初

23、始化18b20write_18b20(0xcc); /跳过64位ROMwrite_18b20(0x44); /启动一次温度转换命令delay_uint(50); /500usinit_18b20(); /初始化18b20EA = 0;write_18b20(0xcc); /跳过64位ROMwrite_18b20(0xbe); /发出读取暂存器命令EA = 1;low = read_18b20(); /读温度低字节value = read_18b20(); /读温度高字节value = 10)write_eepom();key_value = 0;key_new = 1;flag_lj_en =

24、 0;/关闭连加使能flag_lj_3_en = 0;/关闭3秒后使能flag_value = 0;/清零else if(P2 & 0x0f) != 0x0f)key_value +; /按键按下的时候else key_value = 0;if(key_value = 7)key_value = 0;key_new = 0;flag_lj_en = 1; /连加使能zd_break_en = 1; /自动退出设置界使能zd_break_value = 0; /自动退出设置界变量清零key_time = 0;key_can = 20;if(key_500ms = 1)key_500ms = 0;

25、key_new = 0;key_old = 1;if(key_new = 0) & (key_old = 1)switch(P2 & 0x0f)case 0x0e: key_can = 4; break; /得到k1键值case 0x0d: key_can = 3; break; /得到k2键值case 0x0b: key_can = 2; break; /得到k3键值case 0x07: key_can = 1; break; /得到k4键值 key_old = key_new; /*按键处理LCD1602液晶显示函数*/void key_with()if(key_can = 4)menu_

26、1 +;if(menu_1 = 3)menu_1 = 0;if(menu_1 = 0)write_com(0x0c); /关闭光标if(menu_1 = 1)write_sfm3_18B20(2,2,t_high);write_com(0x80+0x40+2); /将光标移动到秒个位write_com(0x0f); /显示光标并且闪烁if(menu_1 = 2) write_sfm3_18B20(2,10,t_low);write_com(0x80+0x40+10); /将光标移动到秒个位write_com(0x0f); /显示光标并且闪烁menu_shudu = 20;if(menu_1 =

27、 1)/设置高温报警if(key_can = 3)if(flag_lj_3_en = 0)t_high + ;/按键按下未松开自动加三次else t_high += 10;/按键按下未松开自动加三次之后每次自动加10if(t_high 990)t_high = 990;write_sfm3_18B20(2,2,t_high);write_com(0x80+0x40+2); /将光标移动到秒个位write_com(0x0f); /显示光标并且闪烁if(key_can = 2)if(flag_lj_3_en = 0)t_high - ;/按键按下未松开自动加三次else t_high -= 10;

28、/按键按下未松开自动减三次之后每次自动减10if(t_high = t_high)t_low = t_high - 1; write_sfm3_18B20(2,10,t_low);write_com(0x80+0x40+10); /将光标移动到秒个位write_com(0x0f); /显示光标并且闪烁if(key_can = 2)if(flag_lj_3_en = 0)t_low - ;else t_low -= 10;if(t_low = 10)t_low = 10; write_sfm3_18B20(2,10,t_low);write_com(0x80+0x40+10); /将光标移动到秒

29、个位write_com(0x0f); /显示光标并且闪烁write_eepom(); /*菜单对应的处理函数*/void menu_dispaly()if(menu_1 = 1) /对光标不处理,要不然光标不会显示在正确的位置write_com(0x80+0x42); /将光标移动到write_com(0x0f); /显示光标并且闪烁else if(menu_1 = 2)write_com(0x80+0x4a); /将光标移动到write_com(0x0f); /显示光标并且闪烁 /*报警函数*/void clock_h_l()if(temperature = t_high)flag_cloc

30、k = 1;elseflag_clock = 0;beep = 1;void main()init_1602();init_1602_dis_csf();temperature = read_temp();/先读出温度的值time_init(); /初始化定时器 read_eepom();write_sfm3_18B20(2,2,t_high);write_sfm3_18B20(2,10,t_low);if(a_a = 0xff)/新的单片机初始单片机内问EEPOMt_high = 300;t_low = 100;a_a = 1;write_eepom();delay_1ms(650);tem

31、perature = read_temp(); /先读出温度的值write_sfm3_18B20(1,8,temperature);while(1)if(flag_300ms = 1) /300ms 处理一次温度程序temperature = read_temp();/先读出温度的值clock_h_l(); /报警函数if(flag_clock = 1)beep = beep; flag_300ms = 0;/if(menu_1 = 0)/write_sfm3_18B20(1,8,temperature);/if(zd_break_en = 1)/自动退出设置界面程序zd_break_value +; /每300ms加一次if(zd_break_value 50) /15秒后自动退出设置界面menu_1 = 0;zd_break_en = 0;zd_break_value = 0;write_com(0x0c); /关闭光标 menu_dispaly(); /不同级的菜单对应显示1602对应显示不同key();/按键程序if(key_can 10) /500mskey_time = 0;key_500ms = 1; /500msflag_value +;if(flag_value 3)flag_value = 10;flag_lj_3_en = 1; /3次后1.5秒后连加大些

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号