温度上下限可调报警器.docx
《温度上下限可调报警器.docx》由会员分享,可在线阅读,更多相关《温度上下限可调报警器.docx(30页珍藏版)》请在冰豆网上搜索。
温度上下限可调报警器
温度上下限可调报警器
单片机课程设计
题目:
温度上下限可调报警器
专业:
测控技术与仪器
姓名:
学号:
指导教师:
2015年1月6日
题,从而不断地增强学生在该方面的自信心及兴趣,也提高了学生的动手能力,对学生以后步入社会参加工作打下一定良好的实践基础。
一、设计方案
1.设计务任和要求
1、基本范围1℃——50℃
2、精度误差小于0.5℃
3、LCD数码直读显示
4、可以任意设定温度的上下限报警功能.
2.方案辩证
1温度计软件设计流程图:
3.元器件的选取
a.单片机芯片的选取:
方案一:
采用89C51芯片作为硬件核心,利用FlashROM,内部具有4KBROM存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
方案二:
采用AT89C52单片机作为硬件核心,该单片机指令代码完全兼容传统的8051单片机。
AT89C52的工作电压为5.5-3.4V,工作频率范围0-80MHz,程序存储器flash容量为8KB,随机存储器RAM空间为512字节,完全满足设计温度控制系统的要求。
综上所述:
本课设中单片机芯片采用AT89C52。
温度传感器的选取:
方案一:
采用热敏电阻传感器。
利用热敏电阻随温度变化而显著变化,能直接将温度的变化转换为能量的变化,进而制成温度计。
但是其测温传感器比较复杂,而且不易通过编制程序来控制测温精度,增大系统设计的难度。
方案二:
采用DS18B20温度传感器。
DS18B20的内部3脚(或8脚)封装;使用特有的温度测量技术,将被测温度转换成数值信号;3.0~5.5V的电源供电方式和寄生电源供电方式;ROM由64位二进制数字组成,共分为8个字节;RAM由9个字节的高速暂存器和非易失性电擦写ROM组成。
综上所述:
温度传感器选取智能测温器件DS18B20。
本设计显示电路采用1602液晶显示模块芯片(protues中用LM016l代替)。
3系统最终设计方案:
综上各方案所述,对此次课设的方案选定:
采用AT89C52作为主控制系统;LM016l液晶显示模块芯片作为温度数据显示装置;而智能温度传感器DS18B20器件作为测温电路主要组成部分。
至此,系统最终方案确定。
二、设计方案的总体设计框图
温度计电路设计总体设计方框图如图所示,控制器采用单片机AT89C52,温度传感器采用DS18B20,用1602液晶显示屏以串口传送数据实现温度显示。
2.1硬件电路框图:
图 总体设计方框图
2.2硬件电路概述:
系统由单片机最小系统、显示电路、按键、温度传感器等组成。
本电路是由STC89C52RC单片机为控制核心,具有与8051系列单片机完全兼容,程序加密等功能,8KB字节可编程闪存,工作电压范围为2.7~6V,全静态工作频率为0~24MHZ;显示电路由1602液晶显示模块芯片,可以进行多行显示;温度报警按键设为五个,可以显示华氏温度,调节高低报警温度;温度传感器电路主要由DS18B20测温器件构成,该器件主要功能有:
采用单总线技术;每只DS18B20具有一个独立的不可修改的64位序列号;低压供电,电源范围为3~5V;测温范围为-55℃~+125℃,误差为±0.5℃;复位电路是10K电阻构成的上电自动复位。
2.3主控电路
单片机STC89C52RC具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
晶振采用12MHZ。
。
主控芯片8051
晶振电路
2.4显示电路
本设计显示电路采用1602液晶显示模块芯片,该芯片可现实16x2个字符,比以前的七段数码管LED显示器在显示字符的数量上要多得多。
另外,由于1602芯片编程比较简单,界面直观,因此更加易于使用者的操作和观测。
显示器各个引脚说明
1602A芯片的接口信号说明
图液晶显示电路
2.5报警温度调节电路
本系统一共设置了四个按键,K1键只是按一下上限报警温度加1,松开后恢复显示正常温度,K2键按一下上限报警温度减1,松开后恢复显示正常温度,当调节的上限报警温度与环境实际的温度相比,环境实际温度高于上限报警温度时系统会出现声音报警及灯光警示,同理,K3,K4的调节方法一样,当环境实际温度低于下限报警温度时,系统出现报警。
图报警点调节电路
2.6温度传感器测温原理及测温电路
DS18B20测温原理
64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。
高速暂存RAM的结构为8字节的存储器,结构如图4所示。
头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。
该字节各位的定义如图5所示。
低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户不要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将最低温所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在最低温所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。
其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。
测温电路
三、系统软件算法设计
整个系统是由硬件配合软件来实现的,在硬件确定后,编写的软件的功能也就基本定型了。
所以软件的功能大致可分为两个部分:
一是监控,这也是系统的核心部分,二是执行部分,完成各个具体的功能。
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
3.1主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图所示。
图主程序流程图图读温度流程图
3.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图示
图温度转换流程图
3.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如上图。
3.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图所示。
图 计算温度流程图
3.5显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
程序流程图如图。
图 显示数据刷新流程图
3.61602的液晶显示
1602液晶显示流程图
四、软件仿真
4.1系统仿真设计
本设计是在Proteus环境下进行仿真的,仿真所用到的器件有:
单片机AT89C51,DS1820温度传感器,蜂鸣器,液晶显示器,一些电阻,电容等。
仿真结果如下:
正常温度下
超过高温报警
低于低温下限报警
4.2系统原理图
五、总结与体会
这次的课程设计做的比较简单。
主要是用到1602,ds18d20按键,和扬声器。
1602在接电阻排的时候少了一个电源电路导致无法显示。
在15脚上加高电压就可以解决这点以后要注意。
在蜂鸣器的按装的时候没有安装三极管导致蜂鸣器无开关状态不能报警。
在开发板上可以实现,导致在PCB版上无法实现。
开发板上用的是LM2003要在PCB版上实现最简单的是加一个达林顿晶体管。
在写程序的过程中很多都用的是模块函数在用到C语言的时候比较低级的错误还是会有的。
例如在if语句中俩句的时候没有加{}导致程序无法编译。
C语言还需要加强学习。
在写长程序的时候在后面加上必要的标注是很重要的。
如果不加等写完后就很难读懂自己写的程序。
再本设计中单片机用到了P0,P1^2,P2口。
P1口只用到一个口还可以扩展几个报警灯。
高温红灯报警低温绿灯报警这个是完成后想到的。
以后又机会会实现的。
在1602显示电路的时候要加一个10K的上拉电阻。
在电路设计的时候总要先用仿真仿真成功之后才实际接线的。
但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。
而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。
所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。
在电脑上仿真在开发板上成功但在PCB版上不一定能成功。
要熟悉原理以后才能少走些弯路成功的完成作品从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
通过这次对温度可调上下限检测报警设计与制作,让我了解了设计电路的程序,也让我了解了关于温度可调上下限检测报警的原理与设计理念。
附录:
//******************************************************
include
#include
#include"18b20.h"
#include"1602.h"
#include"delay.h"
#defineKeyPortP3//定义按键端口
sbitSPK=P1^4;//定义喇叭端口
bitReadTempFlag;//定义读时间标志
voidInit_Timer0(void);//定时器初始化
unsignedcharKeyScan(void);//键盘扫描
/*------------------------------------------------
串口通讯初始化
------------------------------------------------*/
voidUART_Init(void)
{
SCON=0x50;//SCON:
模式1,8-bitUART,使能接收
TMOD|=0x20;//TMOD:
timer1,mode2,8-bit重装
TH1=0xFD;//TH1:
重装值9600波特率晶振11.0592MHz
TR1=1;//TR1:
timer1打开
//EA=1;//打开总中断
//ES=1;//打开串口中断
TI=1;
}
/*------------------------------------------------
主函数
------------------------------------------------*/
voiddelay(unsignedintcnt)
{
while(--cnt);
}
voidaaa()
{unsignedinti;
for(i=0;i<200;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短
{
SPK=1;
delay(TH);//参数决定发声的频率,估算值,可以自行更改参数并
SPK=0;
delay(TL);
}
SPK=1;//喇叭停止工作,间歇的时间,可更改
delay(20000);
}
voidmain(void)
{
inttemp,tempH=50,tempL=1;
floattemperature;
chardisplaytemp[16],num;//定义显示区域临时存储数组
LCD_Init();//初始化液晶
DelayMs(20);//延时有助于稳定
LCD_Clear();//清屏
Init_Timer0();
UART_Init();
Lcd_User_Chr();//写入自定义字符
while
(1)//主循环
{
num=KeyScan();
switch(num)
{
case1:
if(tempH<127)tempH++;break;
case2:
if(tempH>-55)tempH--;break;
case3:
if(tempL<127)tempL++;break;
case4:
if(tempL>-55)tempL--;break;
default:
break;
}
sprintf(displaytemp,"H.%3dL.%3d",tempH,tempL);//输出温度上限下限
LCD_Write_String(0,1,displaytemp);//显示第二行
if(ReadTempFlag==1)
{
ReadTempFlag=0;
temp=ReadTemperature();
if(temp&0x8000)
temp=0-temp;//变为负数
temperature=temp*0.0625;
temp>>=4;
if(temp>tempH)
{LCD_Write_String(0,1,"overtempH");
aaa();
}
elseif(temp{LCD_Write_String(0,1,"undertempL");
aaa();
}
sprintf(displaytemp,"Temp%6.2f",temperature);//打印温度值
LCD_Write_String(0,0,displaytemp);//显示第一行
LCD_Write_Char(13,0,0x01);//写入温度右上角点
LCD_Write_Char(14,0,'C');//写入字符C
}
}
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
voidInit_Timer0(void)
{
TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00;//给定初值
//TL0=0x00;
EA=1;//总中断打开
ET0=1;//定时器中断打开
TR0=1;//定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
voidTimer0_isr(void)interrupt1
{
staticunsignedintnum;
TH0=(65536-2000)/256;//重新赋值2ms
TL0=(65536-2000)%256;
num++;
if(num==400)//
{
num=0;
ReadTempFlag=1;//读标志位置1
}
}
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsignedcharKeyScan(void)
{
unsignedcharkeyvalue;
if(KeyPort!
=0xff)
{
DelayMs(10);
if(KeyPort!
=0xff)
{
keyvalue=KeyPort;
while(KeyPort!
=0xff);
switch(keyvalue)
{
case0xfe:
return1;break;
case0xfd:
return2;break;
case0xfb:
return3;break;
case0xf7:
return4;break;
case0xef:
return5;break;
case0xdf:
return6;break;
case0xbf:
return7;break;
case0x7f:
return8;break;
default:
return0;break;
}
}
}
return0;
}
一.18B20温度传感器子程序的编写
------------------------------------------------*/
#include"delay.h"
#include"18b20.h"
/*------------------------------------------------
18b20初始化
------------------------------------------------*/
bitInit_DS18B20(void)
{
bitdat=0;
DQ=1;//DQ复位
DelayUs2x(5);//稍做延时
DQ=0;//单片机将DQ拉低
DelayUs2x(200);//精确延时大于480us小于960us
DelayUs2x(200);
DQ=1;//拉高总线
DelayUs2x(50);//15~60us后接收60-240us的存在脉冲
dat=DQ;//如果x=0则初始化成功,x=1则初始化失败
DelayUs2x(25);//稍作延时返回
returndat;
}
/*------------------------------------------------
读取一个字节
------------------------------------------------*/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
DelayUs2x(25);
}
return(dat);
}
/*------------------------------------------------
写入一个字节
------------------------------------------------*/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
DelayUs2x(25);
DQ=1;
dat>>=1;
}
DelayUs2x(25);
}
/*------------------------------------------------
读取温度
------------------------------------------------*/
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
b<<=8;
t=a+b;
return(t);
}
二.LCD1602液晶显示器的子程序编写
#include"1602.h"
#include"delay.h"
#defineCHECK_BUSY
sbitRS=P2^4;//定义端口
sbitRW=P2^5;
sbitEN=P2^6;
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bitLCD_Check_Bu