温度采集报警系统的设计.docx
课程设计课程名称单片机课程设计题目名称温度采集报警系统的设计学生学院物理科学与工程技术学院专业班级××学号1034301114学生姓名咕2013年11月12日目录一、设计任务与要求1二、方案设计与论证21、单片机的选取22、温度传感器的选取23、显示器的选取24、温度采集显示系统电路的总体设计框图3三、电路根本原理及单元电路设计3四、调试和仿真:4六、总结5七、附录5温度采集报警系统的设计一、设计任务与要求1、可以显示被测的温度并存储2、可以设置报警温度3、到达报警温度时声光报警二、方案设计与论证1、单片机的选取本系统采用简答的51单片机为控制核心优点突出,它能够运行各种程序,综合考虑单片机的各局部资源,且因为我们学习的是51单片机,因此此次设计选用AT89C51单片机作为核心处理器。2、温度传感器的选取方案一:采用温度传感器AD590K。AD590K具有较高精度和重复性,良好的非线性保证±0.1C的测量精度。加上软件非线性补偿可以实现高精度测量。AD590将温度转化为电流信号,因此要加相应的调理电路,将电流信号转化为电压信号。送入8位A/D转换器,可以获得255级的精度,根本满足题目要求。方案二:采用数字温度传感器DS18B20。DS18B20为数字式温度传感器,无需其他外加电路,直接输出数字量。可直接与单片机通信,读取测温数据,电路简单。基于以上分析和现有器件所限,温度采集模块选用方案二。DS18B20能够直接读出被测温度并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面带来了令人满意的效果3、显示器的选取显示系统是单片机控制系统的重要组成局部,主要用于显示各种参数的值,常用的显示器有CRT、1.ED、1.CD等。方案一:采用1.ED数码管显示。颜色鲜艳,经济实惠,由于本设计显示的内容较多,过多地增加数码管显然不行,进行轮流显示那么控制复:杂,占用较多的I/O资源,加上数码管需要较多连线,使得电路复杂,功耗较大。假设采用MaX7219驱动,可以减少占用的接口数目,但是数码管只能显示有限的数字和符号,不能直观地显示出本设计的内容。方案二:采用1604液晶显示。其内置128个5*7点ASCH字符集,可以直观地显示出较多内容,利用该模块灵活的接口方式和简单、方便的操作指令,可构成较好人机交互图形界电源电路温度采集电路面'使彳复位及晶振电路由本设计要求用求(M显示,值,而早就以显示苹文字符,比数彳键盘4、温度采集显示系或电路KAT89C51显示电路1604作为显示模块,不仅马以显示温度尤越性,所以本系统采用方詈二>报警电路匡图如图1:图1.系统电路的总体设计框图三、电路根本原理及单元电路设计本设计使系统可以检测099°C范围内的温度,考虑到测温精度,设置显示数值精确到1,并且设置温度的上下限,当温度值超过上下限温度时,报警电路中的蜂鸣器鸣响,报警灯闪。根据AT89C51的引脚特性,本设计中采用P2.0P2.2和PO口作为1604的驱动引脚,P1.0>l.3作为按键的输入,P1.4,P1.5分别作声光报警输出。P1.7负责与DS18B20的IO连接。RST作为复位输入,当振荡器工作时,RST引脚出现2个机器周期以上高电平使单片机复位。XTA1.l振荡器反相放大器及内部时钟发生器的输入端。XT1.2振荡器反相放大器的输出端。1、总电路图如下列图2示:图2:电路总图2、晶振电路瓷片电容Cl、C2是用来驱动晶振YI的,因为品振的大小是16M,所以选用20P的电容,如下列图3示。图3:晶振电路3、复位电路复位电路选用了IUF的电解电容和IOK的电阻,如下列图4示。图4:复位电路4、按键电路电路如下列图5示:图5:按键电路按键SET用来设置,BACK键用于返回,INC键用于调整,每按一次加一,MOVE键用于移动。5、显示电路显示采用16*4字符1.CD,如下列图6示5、蜂鸣器和发光二极管图6:显示电路如图7:图7:声光报警电路三极管NPN采用9013是作为蜂鸣器的驱动的作用的,R6、R4作为限流电阻使用。6、实现上述任务的控制器整体流程图如图8所示:图8:整体流程图四、调试和仿真:1、调试选划分系统的功能,按单元一个一个调试正确后,组成整个电路。2、仿真局部仿真图如下:图10,主界面未报警图11,主界面已报警图12,设置界面图13,设置成功界面图14,设置不成功界面六、总结这次课程设计是自己第一次设计一个系统,包括前期的方案选取,原理图的绘制,程序的编写和PROTUES仿真等等,使我对之前的理论知识有了较好的稳固,同时也提高了自己的动手能力,然而也发现自己在理论知识方面存在很多缺乏,比方说,对单片机的中断控制系统的掌握还不够,和对1.CD的菜单界面编程能力缺乏。今后,我将更加努力地学习,提高自己的专业水平。七、附录1.1602接口程序/*filenameJ602.h#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineIOPOsbitRS=P20;sbitRW=P21;sbitE=P22;voidcheck_busy(void);voidwrite_cmd(ucharcom);voidwrite_data(uchardat);void1.CD_init(void);voidwrite_str(ucharX,uchary,uchar*s);voidlcd-test(void);voiddelay(uinl);/Ims延时程序voiddelay(uintj)uchari;for(;j>0;j-)for(i=0;i<100;i+);)查忙程序voidcheck_busy(void)(uchardt;do(dt=Oxff;E=0;RS=0;RW=l;E=l;dt=IO;)while(dt&0x80);E=O;写控制指令voidWrite_cmd(UCharcom)(check_busy();E=O;RS=O;RW=O;Io=Com;E=l;_nop_();E=0;delay(l);)写数据指令voidwrite_data(uchardat)(check_busy();e=o;rs=i;rw=o;IO=dat;E=l;_nop_();E=O;delay(1);)数据指令ucharread_data(ucharaddress)uchardat;write_cmd(address);check_busy();/IO=Oxff;E=0;delay(20);RS=I;RW=I;delay;E=I;dat=I0;delay(5);_nop_();E=0;delay(2);returndat;)*/液晶屏初始化void1.CD_init(void)(Write_cmd(0x38);8位总线,双行显示,5X7的点阵字符Write_cmd(OXOC);开整体显示,光标关,无黑块Write_cmd(OXO6);光标右移WritJCmd(OXO1);清屏delay(l);)voidset_xy(ucharx,uchary)(if(x=0)x=0x80+y;if(x=l)x=xc+y;if(x=2)x=0x94+y;if(x=3)=0xd4+y;write_cmd(x);voidWrite_str(UCharx,uchary,uchar*s)(SejXy(X,y);while(*s)(write_data(*s);s+;)2.DS18B20接口程序*文件名:温度采集DS18B20.h*描述:该文件定义温度传感器件DS18B20相关函数。unsignedcharReadOneChar(Void);voidWriteOneChar(uchardat);voidReadTemP(VOid);还回TemP5#ifndefDS18B20_H#defineDS18B20_H#defineuintunsignedint#defineucharunsignedcharsbitDQ=P17;/温度传送数据IO口inttemp_value;/温度值unsignedcharTemp6;/存放温度的各个位的值inttemp_dot;温度小数局部*dsl8b20延时子函数(晶振12MHz*/voiddelay_l8B20(unsignedinti)while(i-);*sc*ds18b20初始化函数*/voidInit_DS18B20(void)unsignedcharx=0;DQ=I;/DQ复位delay.l8B20(8);稍做延时DQ=O;单片机将DQ拉低deIay8B20(80);精确延时大于480usDQ=I;拉高总线delay_18B20(14);X=DQ:稍做延时后如果x=0那么初始化成功1那么初始化失败delay.l8B20(20);*ds8b20读一个字节*/unsignedcharReadOneChar(Void)uchari=0;uchardat=0;DQ=0;/给脉冲信号dat>>=1;DQ=1;/给脉冲信号if(DQ)dat=0x80;delay_18B20(4);return(dat);*ds8b20写-个字节*/voidWriteOneChar(uchardat)unsignedchari=0;for(i=8;i>0;i-)(DQ=O;DQ=dat&OxOl;de!ay_18B20(5);DQ=1;dat>>=l;)/*读取dsl8b20当前温度*/voidReadTemp(Void)(unsignedchara=0;unsignedcharb=0;unsignedchart=0;Init_DS18B20();WriteOneChar(OxCC);/跳过读序号列号的操作WriteOneChar(Ox44);/启动温度转换delay_18B20(100);/thismessageisweryimportantInit_DS18B20();WrileOneChar(OxCC);跳过读序号列号的操作WriteOneChar(OxBE);读取温度存放器等(共可读9个存放器)前两个就是温度delay_18B20(100);a=