基于51的温度报警器设计.._第1页
基于51的温度报警器设计.._第2页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1 概述21.1 研究背景21.2 设计思想及基本功能22 总体方案设计32.1 方案选取32.2 系统框图52.3 总体方案设计63 硬件电路设计63.1 电源电路设计63.2 晶振电路73.3 复位电路73.4 矩阵键盘电路83.5 温度检测电路93.6 液晶显示电路103.7 蜂鸣器报警电路114 系统软件设计124.1主程序软件设计124.2 键盘扫描程序设计144.3 温度上下限设定程序设计154.4 延时程序设计165 系统调试166 总结18参考文献18附录1系统原理图19附录2程序清单201概述1.1研究背景温度作为一种最基本的环境参数,和人们的安全、生活,工农业生产有着紧

2、密的联系,因此在某些场合对温度进行检测,并且在温度超过期待范围后进行报警便显得尤为重要,对能实现温度检测并报警的装置的设计和研发也就有了特别的意义。单片机作为一种微控制器,由于具有体积小,质量轻,功耗低,价格便宜,可靠性高,功能强大等特点,已经进入人们生活,工业生产的各个领域,现在很难在某个领域看不到单片机的痕迹。在智能仪表领域,由于单片机的上述优点,用单片机作为控制平台,结合不同类型的传感器,可以很容易地对温度,湿度,流量等物理量进行检测。针对在日常生活和工业生产中对温度进行检测和监控的需求,本课题以AT89C51单片机为核心设计了一种温度报警器,它可以通过键盘对温度进行上下限设置,用液晶进

3、行温度显示,并且在超出温度设定范围后发声报警。本设计也具有一定的扩展性,例如可以再加一个烟尘传感器和光电传感器,扩展为火灾报警器。1.2 设计思想及基本功能本课题对温度报警器进行设计时,在满足温度检测和报警功能的基础上,为了增加其应用的灵活性,采用了矩阵键盘电路,从而可以对温度报警范围进行设定,以适应对温度有检测需求的不同应用场合。为了增加人机交互性,采用了功耗低的字符型液晶显示汉字和温度。该温度报警器具有以下基本功能:(1) 手动设定温度范围:该功能使用户可以根据不同场合设定温度报警范围,增强了该设计的应用性。(2) 温度采集:采用了数字温度传感器对现场温度在-55°C到+125&

4、#176;C范围内的应用场合进行温度采集。(3) 液晶显示:通过常用的液晶模块对当前温度传感器采集的温度进行显示。(4) 蜂鸣器报警:当温度传感器采集的温度不在设定范围内时,使蜂鸣器发声,进行报警。2 总体方案设计2.1方案选取在用单片机作为控制核心进行仪器设计时,附加的外围模块选择范围是很宽的,在选用时要多加比较,从而做出最合理的设计。(1)温度采集模块选择方案一:非数字型温度传感器ptioo,精度高,稳定性好,测量范围大;方案二:数字型温度传感器DS18B20,体积小,精度高,抗干扰能力强,硬件开销低;这两个方案都是在对温度进行检测时经常使用的,考虑到DS18B20的精度和测温范围对本设计

5、已经足够,且在使用时不需要进行AD转换,硬件电路简单,所以本设计采用DS18B20作为温度检测模块。(2)显示模块选择方案一:三位数码管显示,数码管是单片机设计中常见的显示模块,可以显示0至9十个数字和小数点,价格便宜。方案二:字符型液晶模块显示,液晶模块显示清晰,功耗低,可以显示数字,汉字,英文字符和某些特殊符号,人机交互性好。考虑到使用数码管显示要占用大量的IO口引脚,且没有液晶显示内容丰富,所以本温度报警器采用液晶模块显示当前温度。2.2系统框图系统框图如图2.1图2.1系统框图2.3总体方案设计本课题设计的温度报警器是在满足基本功能的基础上,尽可能的简化电路,增加人机交互性。在温度传感

6、器选择时,为了避免大量的硬件设计,增加成本,选择了数字型温度传感器,从而不用在使用时进行AD转换,附加复杂的信号调理电路;在液晶模块选择时,考虑到单片机10口的利用率,舍弃了需占用大量10口并行传输的1602,选择了可以进行串行传输的12864;在报警方式选择时,舍弃了液晶显示闪烁报警,选择了更能引起用户注意的蜂鸣器发声报警方式。3 硬件电路设计3.1电源电路设计51单片机,温度传感器DS18B20,12864液晶模块所需正常的工作电压是5V,因此设计的电源应能够提供5V直流电,图3.1是设计的电源电路图。在该电源电路中使用了三端集成稳压芯片LM7805,可以输出5V直流电压。图3.1电源电路

7、图3.2晶振电路电路中的晶振就是石英晶体震荡器。石英晶体震荡器具有非常好的频率稳定性和抗外界干扰的能力,所以,石英晶体震荡器常用来产生基准频率的。此外它还可以产生振荡电流,向单片机发出时钟信号。图3.2是设计的单片机晶振电路。片内电路与片外器件构成一个时钟产生电路,晶振频率一般多在1.2MHz24MHz之间选取。Cl、C2是反馈电容,其值在20pFlOOpF之间选取,一般为3OpF左右。本电路选用的电容为33pF,晶振频率为12MHz。时钟周期为lus。3.3复位电路复位电路的主要功能是使单片机进行初始化,在初始化的过程中需要在复位引脚上加大于2个机器周期的高电平。复位后的单片机地址初始化为0

8、000H,然后单片机继续从OOOOH单元开始执行程序。单片机复位有上电复位和手动复位两种方式,图3.3所示的复位电路可以实现上电复位和手动复位两种基本功能。3.4矩阵键盘电路由于采用单个按键的方式会提高设计的复杂性,且占用10口较多,本设计采用了4*4矩阵键盘,矩阵键盘的应用可以获取16个键值,降低了设计难度,节约了单片机I0口,提高了单片机I0口的利用率。4*4矩阵键盘电路在本温度报警器设计中起到的作用是设定报警温度的上下限,它的四条行线和四条列线占用了单片机的P1口,如图3.4所示。其中SO至S9用于设定温度值,S10按下则启动设定温度下限,S11按下则启动设定温度上限。6P10图3.4矩

9、阵键盘电路图PllP12P13P14P1516J173.5温度检测电路温度检测电路采用的是单线数字型温度传感器DS18B20,其外形如图3.5所示。DS18B20独特的单总线接口使其仅通过一条数据线就可以完成数据传输。它的供电电压在3V至5.5V之间,感温范围在-55摄氏度至+125摄氏度之间,9至12位可调分辨率。123DS18B20有3条输出引线,分别接电源,地,单片机引脚,由于在正常工作时,该传感器需要约1mA的驱动电流,所以硬件电路需要在接电源和地的两条引线之间接一个约5K的电阻,硬件电路图如图3.6所示U2VCCR44.7KvccDATAGNDDS18B20图3.6温度检测电路3.6

10、液晶显示电路本课题设计的温度报警器显示模块采用的是字符型液晶QC12864B,带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128X64,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8X4行(即32个)16X16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的

11、价格也略低于相同点阵的图形液晶模块。本设计采用的是该液晶的串行方式,其串行方式引脚接法如表1所示,硬件电路图如图3.7所示。表1:QC12864B串行方式引脚接线图管脚号名称LEVEL功能1VSS0V电源地2VDD+5V电源正3Vo-对比度调整4CSH/L片选,咼电平有效5SIDH/L串行数据输入6CLKH/L串行同步时钟,上升沿读取SID数据15PSBLL:串行方式19AVDD背光源电压+5V20KVSS背光源负端0V图3.7液晶显示电路3.7蜂鸣器报警电路当温度超过设定范围时,采用蜂鸣器模块电路报警,电路中跳线帽的作用是可以人为地接通或断开该电路,电阻起到限流的作用。电路工作原理是当温度超

12、出温度设定范围时,通过程序编程给P0口第7个引脚赋为低电平,三极管导通,蜂鸣器发声。图3.8蜂鸣器报警电路4 系统软件设计系统软件设计主要包括键盘扫描子程序,温度上下限设定子程序,延时子程序等几部分构成。本章节系统的介绍了温度报警器的主程序和各主要功能子程序的设计流程,具体的程序代码见附录2。4.1主程序软件设计主程序构成无限循环,主要完成相关模块初始化,温度采集,设定温度上下限,液晶显示,温度超出设定范围时蜂鸣器报警等功能,主程序的流程图如图4.1所示。图4.1主程序流程图程序首先进行相关宏定义,定义变量和数组,编写所需要的子函数,然后在主函数中调用液晶初始化子函数对液晶进行初始化,并在液晶

13、第一行显示温度显示'四个汉字,调用温度采集函数对当前温度进行采集,调用温度上下限设定子函数设定适合现场的温度范围,然后将采集到的温度值同设定的温度上下限进行比较。若在设定范围内,则调用液晶显示函数显示当前温度并返回到温度采集子函数调用处;若不在设定范围内,则调用液晶显示函数显示当前温度,使蜂鸣器报警,程序返回温度采集子函数调用处。4.2 键盘扫描程序设计图4.2键盘扫描程序流程图该键盘扫描程序采用行扫描的方式,从第一行扫描到第四行,首先将第一行设为低电平,其余行为高电平,通过读取P1口高四位电平情况判断是否有键按下,若无键按下则扫描下一行,若有键按下,延时5ms消抖,再次判断是否有键按

14、下,若无键按下则扫描下一行,若有键按下则通过switch语句获取相应键值,松手检测后扫描下一行。4.3 温度上下限设定子程序设计图4.3温度上下限设定子程序流程图该程序功能是设定温度上下限,程序开始,调用键盘扫描函数获取一个键值,通过第一个讦语句判断该键值是否为10,若是则通过for循环执行三次依次获取三个键值并赋给数组b,从而计算出温度下限1,然后再次调用键盘扫描函数通过第二个讦语句进行所得键值是否为11的判断;在第一个讦语句判断中若键值不为10,则通过第二个讦语句进行所得键值是否为11的判断。在第二个讦语句进行所得键值是否为11的判断中,若键值为11,则通过for循环执行三次依次获取三个键

15、值并赋给数组c,从而计算出温度上限h,然后程序结束;若不为11,则程序结束。4.4延时子程序设计图4.4延时子程序流程图由于单片机采用的是12MHZ晶振,则执行一条空指令所用时间恰为1us,子函数中设定的参数x是空指令执行次数,所以这是一个us级的软件延时函数。5系统调试由于实验室的仪器较老,有些损坏,为了更好地调试,最终采用了自己买的51开发板。首先利用Keil软件进行编程,反复调试无错后生成了一个Hex文件,然后将程序烧录进单片机里面,进行运行。单片机运行后采集到当时室内温度为11.6°C,如图5.1,用矩阵键盘将温度上下限设为10°C15°C,用手捏住温度传

16、感器DS18B20段时间,当传感器采集到的温度大于15C时,如图5.2,蜂鸣器成功报警,说明该单片机系统能够很好地完成预期的功能。6总结经过一周多的努力,终于完成了单片机课程设计,我们小组的题目是基于89C51的温度报警器设计,在经过大量的资料查阅后,我经过比较论证,进行了以AT89C51单片机为微控制器的温度报警器设计。该设计围绕单片机附加了矩阵键盘电路,可以对温度上下限进行设定,增强了该设计的适应性;附加了温度检测模块,液晶模块,蜂鸣器电路分别对温度进行检测和显示,并在温度超出设定值时发声报警。由于基础和时间有限,在设计过程中存在一些考虑不周的地方,例如在选择显示模块时,只考虑到和数码管相

17、比,液晶具有显示内容丰富,低功耗的特性,在价格上考虑较少,此外,由于程序较复杂,还存在一些可以简化的地方。总之,通过一个完整的课程设计,让我对所学的单片机知识有了更加深刻的理解和掌握,了解了用C语言对单片机进行编程的方法,此外使我复习了protel画电路图,visio画流程图,从而为以后的毕业设计打下了坚实的基础。参考文献1 张迎新.单片微型计算机原理、应用及接口技术(第2版)M.北京:国防工业出版社,20042 伟福LAB6000系列单片机仿真实验系统使用说明书3 阎石数字电路技术基础(第五版)北京:高等教育出版社,20064 郭天祥.新概念51单片机C语言教程.北京:电子工业出版社,200

18、918附录1系统原理图附录2程序清单#include<reg51.h>19包含_nop_()的定义/对无符号整型数据类型进行宏定义/对无符号字符型数据类型进行宏定义对P0口的相关引脚进行位定义#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharsbitP03=P0A3;sbitP04=P0A4;sbitP05=P0A5;sbitP06=P0A6;sbitP07=P0A7;#definers_1P03=1#definers_0P03=0#definerw_1P04=1#definerw_0P04

19、=0#defineen_1P05=1#defineen_0P05=0#defineDS_0P06=0#defineDS_1P06=1#defineDS_HDS_1#defineDS_LDS_0uintTEMP_Result,te;uchartable="温度显示"uinti,a3,b3,c3,l=100,h=300uchartemp_low,temp_high,num;ucharkey,temp;voiddelay_us(uintx)for(i=0;i<x;i+)/宏定义rs_1表示寄存数据/宏定义rs_0表示寄存指令/宏定义rw_1表示读操作/宏定义rw_0表示写操

20、作/宏定义en_1表示使能/宏定义en_0表示禁止/设P0.6引脚为低电平设P0.6引脚为高电平设P0.6引脚为输入设P0.6引脚为输出/定义整型变量/定义无符号字符型数组/定义无符号整型变量和数组/定义无符号字符型变量/定义us级延时函数_nop_();ucharkeyscan()/定义键盘扫描函数/*扫描第一行*/P1=0xfe;temp=P1;temp=temp&0xf0;while(temp!=0xf0)/将第一行设为低电平/读取P1口电平/获取列线电平状态/当有键按下时扫描第一行delay_us(5000);/延时5ms消抖temp=Pl;temp=temp&0xf0

21、;读取Pl口电平/获取列线电平状态while(temp!=0xf0)/当有键按下时temp=P1;读取Pl口电平switch(temp)/switch语句获取键值caseOxee:key=1;若Pl口电平为Oxee,break;caseOxde:key=2;若Pl口电平为Oxde,break;caseOxbe:key=3;若Pl口电平为Oxbe,break;case0x7e:key=4;若Pl口电平为0x7e,则得到键值l则得到键值2则得到键值3则得到键值4break;while(temp!=OxfO)/松手检测temp=Pl;temp=temp&OxfO;21/*扫描第二行*/P1=

22、0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0)delay_us(5000);temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case0xed:key=5;break;case0xdd:key=6;break;case0xbd:key=7;break;case0x7d:key=8;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;/*扫描第三行*/P1=0xfb;temp=P1;temp=temp&0xf0;

23、while(temp!=0xf0)delay_us(5000);temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case0xeb:key=9;break;case0xdb:key=0;break;case0xbb:key=10;break;case0x7b:key=11;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;/*扫描第四行*/23P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0)delay_us(50

24、00);temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case0xe7:key=12;break;case0xd7:key=13;break;case0xb7:key=14;break;case0x77:key=15;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;returnkey;/将键值返回至键盘扫描函数调用处voidarea()温度上下限设定函数,程序设定温度上下限最大范围为00.0到99.9keyscan();调用键盘扫描函数获取键值if(key=10

25、)如果键值为10,开始设定温度下限for(i=0;i<3;i+)keyscan();bi=key;delay_us(5000);l=100*b0+10*b1+b2;/b0为十位数值,b1为个位数值,b2为十分位数值keyscan();if(key=11)如果键值为11,开始设定温度上限for(i=0;i<3;i+)keyscan();ci=key;delay_us(5000);h=100*c0+10*c1+c2;voidSendbyte(uchardat)串行发送数据子函数for(i=0;i<8;i+)en_0;if(dat&0x80)如果最高位数据被发送25rw_1

26、;elserw_0;en_1;dat=datvvl;左移一位voidwrite_com(ucharcom)/写指令子函数rs_l;Sendbyte(0xf8);Sendbyte(com&0xfO);取高四位,数据分两次传送/每字节的内容被送入两个字节/高四位放在第一个字节的高四位Sendbyte(com&0x0f)vv4);低四位放在第二个字节的高四位rs_0;voidwrite_date(uchardate)/写数据子函数rs_l;Sendbyte(0xfa);Sendbyte(date&0xf0);Sendbyte(date&0x0f)vv4);rs_0;v

27、oidlcd_init()液晶初始化子函数write_com(0x0l);/清除显示屏幕write_com(0x30);/基本指令集动作write_com(0x0c);/开显示,无游标write_com(0x06);/设定光标右移,整屏不移动24write_com(0x02);/清DDRAM位址归位write_com(0x82);/将第一行显示位置设为第3个汉字位for(num=0;num<8;num+)/在第一行显示汉字“温度显示”write_date(tablenum);voidlcd_display()/lcd显示函数write_com(0x92);/设定温度值显示的位置write

28、_date(0x30+a0);显示温度十位数值write_date(0x30+al);显示温度个位数值write_date(0x2e);/显示小数点write_date(0x30+a2);显示温度十分位数值write_date(0xAl);/*lcd显示温度值符号*/write_date(0xE6);intDSl8B20_init(void)intt;DS_H;delay_us(50);_nop_();/_nop_();是单周期指令,实现短时间延时_nop_();DS_L;DS_0;/主器件拉低delay_us(500);/最少480usDS_H;/电阻上拉delay_us(60);/等待l5

29、60usif(P06=0)t=l;elset=0;判断存在脉冲,DS18B20是否拉低31delay_us(3);/延时大于1usDS_H;高,/IO口设为输出,DS18B20拉低,则读出0;电阻上拉拉delay_us(3);/延时小于15usif(P06=1)date=1;elsedate=0;判断10输入状态delay_us(80);/延时大于45us/主器件拉低开始DS_0;DS_H;delay_us(480);return(t);voidDS18B20_w(uchardate)DS_L;DS_0;delay_us(3);if(date)DS_H;elseDS_L;DS_0;delay_us(80);DS_H;delay_us(60);ucharDS18B20_r(void)chardate;DS_L;/最小480us/若DS18B20复位,返回值t=1/主器件拉低开始/最少延时1us/电阻上拉,写1/主器件拉低,写0/写时隙必须至少持续60ms/大于1us延时即可delay_us(60);return(date);voidwrite_byte(unsignedcharbyte)for(i=0;i<8;i+)DS18B20_w(byte&0x01);时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论