温度上下限可调报警器_第1页
温度上下限可调报警器_第2页
温度上下限可调报警器_第3页
温度上下限可调报警器_第4页
温度上下限可调报警器_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、大连理工大学 单片机课程设计 题 目: 温度上下限可调报警器 专 业: 测控技术与仪器 姓 名: 学 号: 指导教师: 2015 年 1 月 6日 【内容摘要】 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同种类的传感器,可实现诸如电压、湿度、温度、速度、硬度、压力等的物理量的测量。本文将介绍一种基于单片机控制理论及其应用系统设计的数字温度计。 本文主要介绍了一个基于AT89C51单片机的测温系统,详细描述了利用数字温度传感器DS18B2

2、0开发测温系统的过程,重点对传感器在单片机喜爱的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也进行一一介绍,该系统可以方便的是实现温度采集和显示,并可以根据需要任意设定上下限报警温度,它使用起来方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合我们日常生活和工农业生产中的温度测量,也可以当做温度处理模块嵌入其他系统中,作为其他主系统的辅助扩展。DS18B20和AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合与恶劣环境下进行现场温度测量,有广泛的应用前景。 本设计首先是确定目标,气候是各个功能模块的设计,再在Proteus软件上进行仿真

3、,修改,仿真。本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。 【引 言】 单片机技术作为计算机技术的一个分支,广泛地应用于工业控制,智能仪器仪表,机电一体化产品,家用电器等各个领域。学生在课程设计,毕业设计,科研项目中会广泛应用到单片机知识,而且,进入社会后也会广泛接触到单片机的工程项目。鉴于此,提高“单片机原理及应用”课的教学效果,让学生参与课程设计实习甚为重要。单片机应用技术涉及的内容十分广泛,如何使学生在有限的时间内掌握单片机应用的基本原理及方法,是一个很有价值的教学项目。为此,我们进行了“单片机的学习与应用”方面的课程设计,锻炼学生的动脑动手以及协作

4、能力。 单片机课程设计是针对模拟电子技术,数字逻辑电路,电路,单片机的原理及应用课程的要求,对我们进行综合性实践训练的实践学习环节,它包括选择课设任务、软件设计,硬件设计,调试和编写课设报告等实践内容。通过此次课程设计实现以下三个目标:第一,让学生初步掌握单片机课程的试验、设计方法,即学生根据设计要求和性能约束,查阅文献资料,收集、分析类似的相关题目,并通过元器件的组装调试等实践环节,使最终硬件电路达到题目要求的性能指标;第二,课程设计为后续的毕业设计打好基础,毕业设计是系统的工程设计实践,而课程设计的着眼点是让学生开始从理论学习的轨道上逐渐引向实际运用,从已学过的定性分析、定量计算的方法,逐

5、步掌握工程设计的步骤和方法,了解科学实验的程序和实施方法。第三,培养学生勤于思考乐于动手的习惯,同时通过设计并制作单片机类产品,使学生能够自己不断地学习接受新知识,通过多人的合作解决现实中存在的问题,从而不断地增强学生在该方面的自信心及兴趣,也提高了学生的动手能力,对学生以后步入社会参加工作打下一定良好的实践基础。一、设计方案1.设计务任和要求1、基本范围1502、精度误差小于0.53、LCD 数码直读显示4、可以任意设定温度的上下限报警功能.2.方案辩证1温度计软件设计流程图: 设置堆栈指针将温度转换为BCD码发读存储器命令读温度数据复位DS18B20发跳过ROM命令显示缓冲区初始化更新数据

6、缓冲区延时发温度转换命令复位DS18B20发跳过ROM命令开始 3.元器件的选取a.单片机芯片的选取:方案一:采用89C51芯片作为硬件核心,利用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。方案二:采用AT89C52单片机作为硬件核心,该单片机指令代码完全兼容传统的8051单片机。AT89C52的工作电压为5.5-3.4V,工作频率范围0-80MHz,程序存储

7、器flash容量为8KB,随机存储器RAM空间为512字节,完全满足设计温度控制系统的要求。综上所述:本课设中单片机芯片采用AT89C52。 温度传感器的选取: 方案一:采用热敏电阻传感器。利用热敏电阻随温度变化而显著变化,能直接将温度的变化转换为能量的变化,进而制成温度计。但是其测温传感器比较复杂,而且不易通过编制程序来控制测温精度,增大系统设计的难度。 方案二: 采用DS18B20温度传感器。DS18B20的内部3脚(或8脚)封装;使用特有的温度测量技术,将被测温度转换成数值信号;3.05.5V的电源供电方式和寄生电源供电方式;ROM由64位二进制数字组成,共分为8个字节;RAM由9个字节

8、的高速暂存器和非易失性电擦写ROM组成。综上所述:温度传感器选取智能测温器件DS18B20。本设计显示电路采用1602液晶显示模块芯片(protues中用LM016l代替)。3系统最终设计方案:综上各方案所述,对此次课设的方案选定: 采用AT89C52作为主控制系统; LM016l液晶显示模块芯片作为温度数据显示装置;而智能温度传感器DS18B20器件作为测温电路主要组成部分。至此,系统最终方案确定。二、设计方案的总体设计框图温度计电路设计总体设计方框图如图所示,控制器采用单片机AT89C52,温度传感器采用DS18B20,用1602液晶显示屏以串口传送数据实现温度显示。2.1硬件电路框图:

9、单片机芯片STC89C52RC复位电路晶振控制1602 显示器温度检测电路DS18B20报警温度调整键蜂鸣器图总体设计方框图2.2硬件电路概述:系统由单片机最小系统、显示电路、按键、温度传感器等组成。本电路是由STC89C52RC单片机为控制核心,具有与8051系列单片机完全兼容,程序加密等功能,8KB字节可编程闪存,工作电压范围为2.76V,全静态工作频率为024MHZ;显示电路由1602液晶显示模块芯片,可以进行多行显示;温度报警按键设为五个,可以显示华氏温度,调节高低报警温度;温度传感器电路主要由DS18B20测温器件构成,该器件主要功能有:采用单总线技术;每只DS18B20具有一个独立

10、的不可修改的64位序列号;低压供电,电源范围为35V;测温范围为-55+125,误差为±0.5;复位电路是10K电阻构成的上电自动复位。2.3主控电路单片机STC89C52RC 具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。晶振采用12MHZ。主控芯片8051 晶振电路2.4显示电路 本设计显示电路采用1602液晶显示模块芯片,该芯片可现实16x2个字符,比以前的七段数码管LED显示器在显示字符的数量上要多得多。另外,由于1602芯片编程比较简单,界面直观,因此更加易于使用者的操作和观测。显示器各个引

11、脚说明1602A芯片的接口信号说明图 液晶显示电路2.5报警温度调节电路本系统一共设置了四个按键,K1键只是按一下上限报警温度加1,松开后恢复显示正常温度,K2键按一下上限报警温度减1,松开后恢复显示正常温度,当调节的上限报警温度与环境实际的温度相比,环境实际温度高于上限报警温度时系统会出现声音报警及灯光警示,同理,K3,K4的调节方法一样,当环境实际温度低于下限报警温度时,系统出现报警。图 报警点调节电路2.6温度传感器测温原理及测温电路DS18B20测温原理预置斜率累加器比较低温度系数振荡器计数器1温度寄存器Tx预置=0高温度系数振荡器-0计数器2T1加1停止T2 64位ROM的结构开始8

12、位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器TH和TL,可通过软件写入户报警上下限。 DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图4所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图5

13、所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户不要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将最低温所对应的一个基数分别置

14、入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在最低温所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。测温电路三、系统软件算法设计整个系统是由硬件配合软件来实现的,在硬件确定后,编写的软件的功能也就基本定型了。所以软件的

15、功能大致可分为两个部分:一是监控,这也是系统的核心部分,二是执行部分,完成各个具体的功能。系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。3.1主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图所示。 Y发DS18B20复位命令发跳过ROM命令发读取温度命令读取操作,CRC校验9字节完?CRC校验正?确?移入温度暂存器结束NNY初始化调用显示子程序1S到?初次上电读出温度值温度计算处理显示数据刷新发温度转换开始命令NYNY 图 主程序

16、流程图 图 读温度流程图 3.2读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图示发DS18B20复位命令发跳过ROM命令发温度转换开始命令 结束 图 温度转换流程图3.3温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如上图。3.4 计算温度子程序计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图所示。 开始温度零下?温度值取补码

17、置“”标志计算小数位温度BCD值 计算整数位温度BCD值 结束置“+”标志NY 图计算温度流程图3.5 显示数据刷新子程序温度数据移入显示寄存器十位数0?百位数0?十位数显示符号百位数不显示百位数显示数据(不显示符号) 结束NNYY显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。程序流程图如图。图显示数据刷新流程图3.6 1602的液晶显示1602液晶显示流程图四、软件仿真4.1系统仿真设计本设计是在Proteus环境下进行仿真的,仿真所用到的器件有:单片机AT89C51,DS1820温度传感器,蜂鸣器,液晶显示器,一些电阻,电容等。仿真

18、结果如下:正常温度下超过高温报警 低于低温下限报警 4.2系统原理图 五、总结与体会这次的课程设计做的比较简单。主要是用到1602,ds18d20按键,和扬声器。1602在接电阻排的时候少了一个电源电路导致无法显示。在15脚上加高电压就可以解决这点以后要注意。在蜂鸣器的按装的时候没有安装三极管导致蜂鸣器无开关状态不能报警。在开发板上可以实现,导致在PCB版上无法实现。开发板上用的是LM2003要在PCB版上实现最简单的是加一个达林顿晶体管。在写程序的过程中很多都用的是模块函数在用到C语言的时候比较低级的错误还是会有的。例如在if语句中俩句的时候没有加导致程序无法编译。C语言还需要加强学习。在写

19、长程序的时候在后面加上必要的标注是很重要的。如果不加等写完后就很难读懂自己写的程序。再本设计中单片机用到了P0,P12,P2口。P1口只用到一个口还可以扩展几个报警灯。高温红灯报警低温绿灯报警这个是完成后想到的。以后又机会会实现的。在1602显示电路的时候要加一个10K的上拉电阻。 在电路设计的时候总要先用仿真仿真成功之后才实际接线的。但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。在电脑上仿真在开发板上成功但在PCB版上不一定能

20、成功。要熟悉原理以后才能少走些弯路成功的完成作品从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。通过这次对温度可调上下限检测报警设计与制作,让我了解了设计电路的程序,也让我了解了关于温度可调上下限检测报警的原理与设计理念。附录:/*include<reg52.h> #include<stdio.h>#include "18b20.h"#include "1602.h"#incl

21、ude "delay.h"#define KeyPort P3 /定义按键端口sbit SPK=P14; /定义喇叭端口bit ReadTempFlag;/定义读时间标志void Init_Timer0(void);/定时器初始化unsigned char KeyScan(void);/键盘扫描 /*- 串口通讯初始化-*/void UART_Init(void) SCON = 0x50; / SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20; / TMOD: timer 1, mode 2, 8-bit 重装 TH1 = 0xFD; /

22、TH1: 重装值 9600 波特率 晶振 11.0592MHz TR1 = 1; / TR1: timer 1 打开 /EA = 1; /打开总中断 /ES = 1; /打开串口中断TI=1;/*- 主函数-*/void delay(unsigned int cnt) while(-cnt); void aaa() unsigned int i; for(i=0;i<200;i+)/喇叭发声的时间循环,改变大小可以改变发声时间长短 SPK=1; delay(TH); /参数决定发声的频率,估算值,可以自行更改参数并 SPK=0; delay(TL); SPK=1; /喇叭停止工作,间歇的

23、时间,可更改 delay(20000); void main (void) int temp,tempH=50,tempL=1;float temperature;char displaytemp16,num;/定义显示区域临时存储数组LCD_Init(); /初始化液晶DelayMs(20); /延时有助于稳定LCD_Clear(); /清屏Init_Timer0();UART_Init();Lcd_User_Chr(); /写入自定义字符while (1) /主循环 num=KeyScan(); switch(num) case 1:if(tempH<127)tempH+;break

24、;case 2:if(tempH>-55)tempH-;break;case 3:if(tempL<127)tempL+;break;case 4:if(tempL>-55)tempL-;break;default:break; sprintf(displaytemp,"H.%3d L.%3d ",tempH,tempL);/输出温度上限下限 LCD_Write_String(0,1,displaytemp);/显示第二行if(ReadTempFlag=1) ReadTempFlag=0; temp=ReadTemperature(); if(temp&a

25、mp;0x8000) temp=0-temp;/变为负数 temperature=temp*0.0625; temp>>=4; if(temp>tempH) LCD_Write_String(0,1,"over tempH "); aaa(); else if(temp<tempL) LCD_Write_String(0,1,"under tempL ");aaa(); sprintf(displaytemp,"Temp %6.2f",temperature);/打印温度值 LCD_Write_String(0

26、,0,displaytemp);/显示第一行 LCD_Write_Char(13,0,0x01);/写入温度右上角点 LCD_Write_Char(14,0,'C'); /写入字符C /*- 定时器初始化子程序-*/void Init_Timer0(void) TMOD |= 0x01; /使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 /TH0=0x00; /给定初值 /TL0=0x00; EA=1; /总中断打开 ET0=1; /定时器中断打开 TR0=1; /定时器开关打开/*- 定时器中断子程序-*/void Timer0_i

27、sr(void) interrupt 1 static unsigned int num; TH0=(65536-2000)/256; /重新赋值 2ms TL0=(65536-2000)%256; num+; if(num=400) / num=0; ReadTempFlag=1; /读标志位置1/*-按键扫描函数,返回扫描键值-*/unsigned char KeyScan(void) unsigned char keyvalue; if(KeyPort!=0xff) DelayMs(10); if(KeyPort!=0xff) keyvalue=KeyPort; while(KeyPor

28、t!=0xff);switch(keyvalue) case 0xfe:return 1;break; case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; case 0xef:return 5;break; case 0xdf:return 6;break; case 0xbf:return 7;break; case 0x7f:return 8;break; default:return 0;break; return 0;一18B20温度传感器子程序的编写-*/#include"

29、;delay.h"#include"18b20.h"/*- 18b20初始化-*/bit Init_DS18B20(void) bit dat=0; DQ = 1; /DQ复位 DelayUs2x(5); /稍做延时 DQ = 0; /单片机将DQ拉低 DelayUs2x(200); /精确延时 大于 480us 小于960us DelayUs2x(200); DQ = 1; /拉高总线 DelayUs2x(50); /1560us 后 接收60-240us的存在脉冲 dat=DQ; /如果x=0则初始化成功, x=1则初始化失败 DelayUs2x(25); /

30、稍作延时返回 return dat;/*- 读取一个字节-*/unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i-) DQ = 0; / 给脉冲信号 dat>>=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; DelayUs2x(25); return(dat);/*- 写入一个字节-*/void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i>0;

31、 i-) DQ = 0; DQ = dat&0x01; DelayUs2x(25); DQ = 1; dat>>=1; DelayUs2x(25);/*- 读取温度-*/unsigned int ReadTemperature(void)unsigned char a=0;unsigned int b=0;unsigned int t=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换DelayMs(10);Init_DS18B20();WriteOneChar(0xCC

32、); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=ReadOneChar(); /低位b=ReadOneChar(); /高位b<<=8;t=a+b;return(t);2. LCD1602液晶显示器的子程序编写#include "1602.h"#include "delay.h"#define CHECK_BUSYsbit RS = P24; /定义端口 sbit RW = P25;sbit EN = P26;#define RS_CLR RS=0 #define

33、 RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*- 判忙函数-*/ bit LCD_Check_Busy(void) #ifdef CHECK_BUSY DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80);#else return 0;#endif /*- 写入命令函数- -*/ void LC

34、D_Write_Com(unsigned char com) while(LCD_Check_Busy(); /忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; /*- 写入数据函数-*/ void LCD_Write_Data(unsigned char Data) while(LCD_Check_Busy(); /忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; /*- 清屏函数-*/ void LCD_Clear(void) LCD_Write

35、_Com(0x01); DelayMs(5); /*- 写入字符串函数-*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) if (y = 0) LCD_Write_Com(0x80 + x); /表示第一行 else LCD_Write_Com(0xC0 + x); /表示第二行 while (*s) LCD_Write_Data( *s); s +; /*- 写入字符函数-*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsign

36、ed char Data) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); /*- 初始化函数-*/ void LCD_Init(void) LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD

37、_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ void Lcd_User_Chr(void) LCD_Write_Com(0x41); /"01 000 001" 第2行地址 LCD_Write_Data(0x04); /"XXX 10001" 第2行数据 LCD_Write_Com(0x42); /"01 000 010" 第3行地址 LCD_Write_Data(0x0e); /"XXX 10101" 第3行数据 LCD_Write_Com(0x43); /"01 000 011" 第4行地址 LCD_Write_Data(0x0e); /"XXX 10001" 第4行数据 LCD_Write_Com(0x44); /"01 000 100" 第5行地址 LCD_Write_Data(0x0e); /"XXX 11111" 第5行数据 LCD_Write_Co

温馨提示

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

评论

0/150

提交评论