基于51单片机数字温度报警器.docx
《基于51单片机数字温度报警器.docx》由会员分享,可在线阅读,更多相关《基于51单片机数字温度报警器.docx(22页珍藏版)》请在冰豆网上搜索。
基于51单片机数字温度报警器
摘要
电子技术在日常生活中得到了广泛的应用,各类转换电路的不断推出以及电子产品的快速更新,电子技术已成为世界发展和人们生活中必不可少的工具。
同时伴随传感器在生产生活中更加广泛的应用,一种新型的数字式温度传感器实现对温度的测试与控制得到了更快的开发,本文设计了一种基于单片机AT89C51的温度检测及报警系统。
该系统将温度传感器DS18B20接到单片机的一个端口上,单片机对温度传感器进行循环采集。
将采集到的温度值与设定的上下限进行比较,当超出设定范围的上下限时,通过单片机控制的报警电路就会发出报警信号,从而实现了本次课程设计的要求。
本次设计同时应用到许多我们用过的软件设计,将前面所学的知识融汇在一起实现温度监测及其报警的功能。
该系统设计和布线简单、结构紧凑、体积小、重量轻、抗干扰能力较强、性价比高、扩展方便,在工农业等领域的温度检测中有广阔的应用前景。
。
关键字温度传感器;单片机;报警;数码管显示
1绪论
1.1温度报警系统简介
温度报警系统广泛的用于工业农业等领域,是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。
温度报警系统在农业蔬菜大棚中起到重要作用,温度报警器探测到温度超标时,温度报警器发出报警信号。
1.2课题背景与研究意义
温度是一个十分重要的物理量,对它的测量与控制有十分重要的意义。
随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与控制温度:
如大气及空调房中温度的高低,直接影响着人们的身体健康;粮仓温度的检测,防止粮食发霉,最大限度地保持粮食原有新鲜品质,达到粮食保质保鲜的目的;工业易燃品的存放。
测温技术在生产过程中,在产品质量控制和监测以及节约能源等方面发挥了着重要作用。
本实验设计实现了工业测温基本功能,同时,在设计实验过程中,运用到单片机、模电、数电、传感器和C++程序设计等知识,这既能加强我们的理论知识与实践的结合,也能够提高我们应用交叉学科知识进行综合设计的能力。
1.3课题设计主要研究目的
本温度报警器以AT89C51单片机为控制核心,由一数字温度传感器DS18B20测量被控温度,结合7段LED以及驱动LED的74LS245组合而成。
当被测量值超出预设范围则发出警报,且精度高。
利用现代虚拟仿真技术可对设计进行仿真实验,与单片机仿真联系紧密的为proteus仿真,利用keil软件设计单片机控制系统,然后与proteus进行联合调试,可对设计的正确性进行检验。
2系统整体方案设计
2.1系统的基本方案
本次设计通过使用AT89C51单片机芯片、和温度传感器、蜂鸣器实现功能效果,传感器可以接受周围的温度数据,并且通过数码管显示具体温度数值,通过按键可以设置温度的上限下限,若采集到的温度高于温度上限,蜂鸣器报警提示,同样低于下限也报警。
系统设计框图如图2-1所示:
图2-1系统总框图
通过温度传感器采集环境温度,通过按键控制主控程序,实现数码管度温度上下限的设置,将温度数值显示在LED数码光上,若温度超出上限或下限,驱动发光二极管点亮,同时蜂鸣器报警提示。
2.2各模块方案选择
2.2.1单片机的选择
采用STC89C51单片机,它是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
2.2.2温度传感器的选择
温度传感器选用达拉斯公司的单线数字温度传感芯片DS18B20。
它将地址线、数据线和控制线合为一根双向串行传输数据的信号线,允许在这根信号线上挂接多个DS18B20。
每个芯片内有一个64位的ROM,其中存有各个器件自身的序列号,作为器件独有的ID号码。
其测温范围是-55~128℃,测温分辨率在12位时精度为0.0625℃。
DS18B20简化了温度器件与计算机的接口电路,使得电路简单,使用更加方便。
2.2.3显示模块的选择
采用数码管显示模块,采集温度超出或低于上下限时,相应的发光二极管点亮。
3系统的硬件设计与实现
3.1系统硬件概述
本设计包括温度数据采集和显示两个部分,数据采集通过温度传感器实现,显示有发光二极管,LED数码管实现。
报警功能由蜂鸣器实现,系统的复位以及温度上下限的调整分别由三个按键实现。
3.2电路模块
3.2.1单片机
AT89C51单片机内部主要由9个部件组成:
1个8位中央处理器;4KBFlash存储器;128B的数据存储器;32条I/O口线;2个定时器/计数器;1个具有6个中断源、4个优先级的中断嵌套结构;用于多处理机通信、I/O扩展或全双工UART的串行口;特殊功能寄存器;1个片内振荡器和时钟电路。
AT89S51系列单片机完全继承了MCS-51的指令系统,共有111条指令,按其功能可分为五大类:
数据传送类指令、算术运算类指令、逻辑运算类指令、控制转移类指令、布尔操作。
AT89C51单片机引脚如图3-1所示。
图3-1AT89C51单片机引脚图
管脚说明:
P0口:
8位、漏极开路的双向I/O口。
P0能够用于外部程序数据存储器。
它可以被定义为数据/地址的第八位。
P0口在应用时必须外接上拉电阻,作为输入时,首先应将引脚置1。
P1口:
8位双向I/O口,内部含上拉电阻。
作为输入时,应先将引脚置高;若负载为低电平,则通过内部上拉电阻向外输出电流。
P2口:
8位双向I/O口,内部含上拉电阻。
作为输入时,应先将引脚置高;若负载为低电平,则通过内部上拉电阻向外输出电流。
P3口:
8位双向I/O口,内部含上拉电阻。
作为输入时,应先将引脚置高;若负载为低电平,则通过内部上拉电阻向外输出电流。
P3口除了通用I/O口功能外,还有第二功能。
P3口的第二功能定义如表3-1所示。
表3.1P3口第二功能定义
引脚定义
功能
引脚定义
功能
P3.0-RXD
串行输入口
P3.1-TXD
串行输出口
P3.2-
外部中断0
P3.3-
外部中断1
P3.4-T0
计时器0外部输入
P3.5-T1
计时器1外部输入
P3.6-
外部数据存储器写选通
P3.7-
外部数据存储器读选通
RST:
复位输入,低电平有效。
ALE/PROG:
地址锁存允许信号输出。
在正常操作状态下,该引脚端口输出恒定频率的脉冲。
其频率为晶振频率的1/6,可用作外部定时或其他触发信号。
如果需要,可通过SFR的第0位置禁止ALE操作,但ALE的禁止位不影响对外部存储器的访问。
:
片外程序存储器选通信号,低电平有效。
当AT89S51执行来自外部程序存储器的指令代码时,PSEN/每个机器周期两次有效。
在访问外部数据存储器时,PSEN/无效。
:
片外程序存储器访问允许信号,低电平有效。
XTAL1:
外接晶振。
在单片机内部是反相放大器的输入及端。
XTAL2:
外接晶振。
在单片机内部是反相放大器的输出端,输入到内部时钟发生器。
3.2.2复位电路模块
复位是单片机的初始化操作,复位信号是高电平有效,复位操作有上电自动复位、按键电平复位、外部脉冲复位和自动复位四种方式。
在本设计中复位采用
上电自动复位,当接通电源的瞬间,RST端与Vcc同电位,随着电容的电压逐渐上升,RST端的电压也逐渐下降,于是在RST端便形成了一个正脉冲,只要该正脉冲的宽度持续两个周期的高电平,就可以实现系统的自动复位,复位电路原理图如图3-2所示。
3.2.3显示电路模块
显示电路由单片机的P0、P2端口控制。
显示模块如图3-3。
图3-3温度显示模块
3.2.4传感器电路模块
(1)DS18B20内部结构
DS18B20是Dallas公司继DS1820后推出的一种改进型智能数字温度传感器,与传统的热敏电阻相比,只需一根线就能直接读出被测温度值,并可根据实际需求来编程实现9~12位数字值的读数方式。
DS18B20的外形如一只三极管,引脚名称及作用如下:
GND:
接地端,
DQ:
数据输入/输出脚,与TTL电平兼容,
VDD:
可接电源,也可接地。
因为每只DS18B20都可以设置成两种供电方式,即数据总线供电方式和外部供电方式。
采用数据总线供电方式时VDD接地,可以节省一根传输线,但完成数据测量的时间较长;采用外部供电方式则VDD接+5V,多用一根导线,但测量速度较快,内部结构如图3-4。
(2)DS18B20供电方式
DS18B20可以采用外部电源供电和寄生电源供电两种模式。
外部电源供电模式是将DS18B20的GND直接接地,DQ与但单总线相连作为信号线,VDD与外部电源正极相连。
如图3-5所示。
图中DS18B20的DQ端口通过接入一个4.7K的上拉电阻到VCC,从而实现外部电源供电方式。
寄生电源供电模式如图3-6所示:
从图中可知,DS18B20的GND和VDD均直接接地,DQ与单总线相连,单片机其中一个I/O口与DS18B20的DQ端相连。
(3)DS18B20的测温原理
DS18B20的测温原理如图3-7所示,其主要由斜率累加器、温度系数振荡器、减法计数器、温度存储器等功能部件组成。
图3-7DS18B20的测温原理
DS1820是这样测温的:
用一个高温度系数的振荡器确定一个门周期,内部计数器在这个门周期内对一个低温度系数的振荡器的脉冲进行计数来得到温度值。
计数器被预置到对应于-55℃的一个值。
如果计数器在门周期结束前到达0,则温度寄存器(同样被预置到-55℃)的值增加,表明所测温度大于-55℃。
同时,计数器被复位到一个值,这个值由斜坡式累加器电路确定,斜坡式累加器电路用来补偿感温振荡器的抛物线特性。
然后计数器又开始计数直到0,如果门周期仍未结束,将重复这一过程。
斜坡式累加器用来补偿感温振荡器的非线性,以期在测温时获得比较高的分辨率。
DS18B20内部对此计算的结果可提供0.5℃的分辨率。
温度以16bit带符号位扩展的二进制补码形式读出,
DS18B20遵循单总线协议,每次测温时都必须有4个过程]:
初始化、传送ROM操作命令、传送ROM操作命令、数据交换。
4.系统的软件设计
4.1软件设计应用环境与设计语言
本设计软件的设计是在KeilC51的环境下编译的。
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
KeilC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效、快速的特点。
4.2系统设计设计流程图
系统的流程图如图4-1所示。
图4-1系统设计流程图
5系统仿真设计
5.1Proteus软件介绍
Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:
*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。
使用Proteus软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;实践证明,在使用Proteus进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。
因此,Proteus有较高的推广利用价值。
5.2Proteus仿真图
图5-1温度报警软件仿真图
5.3硬件调试
所有器件按电路原理图焊接完成后,接上导线,放入三节电池,接通电源,按下开关。
相应的从机对应的发光二极管点亮,按下键盘,相应数码管上显示键值。
调试过程中先检查pcb版各个点是否焊接错,连线正确,确保线没有绕道一起,硬件原理图如图5-2。
图5-2焊接实物硬件图
5.4调试结果
刚开始调试并不是很顺利,虽然很小心但调试过程中仍出现了很多的问题,首先电路比较难焊接,必须再加小心以免出现问题难以排查。
还有电路中需接电源正负极的线比较多也要很仔细的去焊接。
刚开始调试按键控制出错,经过同学帮忙大家努力后终于正确的调试出了结果。
结论
这次课程设计不光是要掌握模单片机书本上的理论基础,还需要我们锻炼自己的动手能力。
用时2周,需要用到ProteusISIS绘图,同时也用到keil编程,仿真验证程序正确。
最后一步焊接硬件有点困难,因为平时没练过焊接,刚开始的矩阵键盘就焊错了,之后又重新用吸锡器吸掉,列线扫描用导线代替了。
焊接过程遇到许多问题,终于焊接完成后,又发现按键不响应,又返回去重新改程序,给单片机刷入程序第2次验证,还是没有调试正确。
最后终于发现了问题,原来是硬件焊接时,把接口焊错了,修改之后果然调试正确。
调试成功后真的很开心,因为自己焊接,硬件后面显得很粗糙,最后总结发现各个元器件的布局真的很重要,这次做单片机硬件,确实让我学到了很多东西,很感谢这次的实践机会。
这次实验从开始准备到焊接硬件完成,充实了我们的生活,让我们增长了知识,提高了学习能力,一些软件的使用,芯片的管教,电解电容的正负极,等等一些细微的东西,都需要自己去图书馆或者网上找相应的资料。
这次小课程设计对以后的课程设计都有帮助,提前锻炼了我们的能力,同时也感谢实验室的同学的指导以及高老师的指导,让我顺利的完成了课程设计。
参考文献
【1】高玉芹单片机原理与应用及C51编程技术【M】.北京:
机械工业出版社。
【2】刘泉溪单片机原理与应用实验教程【M】北京航空航天大学出版社。
【3】孙育才.MCS-51系列单片微型计算机及其应用【M】东南大学出版社
【4】叶景,基于单片机的温度控制系统的设计经验与交流,2008
【5】杨光友.单片机微型计算机原理及接口技术[M].北京:
中国水利水电出版社,2002
附录
附录1元件清单与仿真图
1.元件清单
1.万用板7*9
2.开关
3.2.2K电阻*6
4.stc89C51单片机
5.40脚IC座
6.DS18B20温度传感器
7.10K排阻
8.10K电阻*2
9.10uF电容
10.按键*3
11.12M晶振
12.30P电容*2
13.9012三极管*5
14.led灯
15.蜂鸣器
16.四位一体共阳数码管
2.系统仿真图
附录2源程序
#include
#defineuintunsignedint
#defineucharunsignedchar//宏定义
#defineSETP3_1//定义调整键
#defineDECP3_2//定义减少键
#defineADDP3_3//定义增加键
#defineBEEPP3_6//定义蜂鸣器
#defineALAMP1_2//定义灯光报警
#defineDQP3_7//定义DS18B20总线I/O
bitshanshuo_st;//闪烁间隔标志
bitbeep_st;//蜂鸣器间隔标志
sbitDIAN=P0^5;//小数点
ucharx=0;//计数器
signedcharm;//温度值全局变量
ucharn;//温度值全局变量
ucharset_st=0;//状态标志
signedcharshangxian=38;//上限报警温度,默认值为38
signedcharxiaxian=5;//下限报警温度,默认值为38
//ucharcodeLEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
ucharcodeLEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B};
/*****延时子程序*****/
voidDelay_DS18B20(intnum)
{
while(num--);
}
/*****初始化DS18B20*****/
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
Delay_DS18B20(8);//稍做延时
DQ=0;//单片机将DQ拉低
Delay_DS18B20(80);//精确延时,大于480us
DQ=1;//拉高总线
Delay_DS18B20(14);
x=DQ;//稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay_DS18B20(20);
}
/*****读一个字节*****/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
/*****写一个字节*****/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay_DS18B20(5);
DQ=1;
dat>>=1;
}
}
/*****读取温度*****/
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器
a=ReadOneChar();//读低8位
b=ReadOneChar();//读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t=tt*10+0.5;//放大10倍输出并四舍五入
return(t);
}
/*****延时子程序*****/
voidDelay(uintnum)
{
while(--num);
}
/*****初始化定时器0*****/
voidInitTimer(void)
{
TMOD=0x1;
TH0=0x3c;
TL0=0xb0;//50ms(晶振12M)
}
/*****读取温度*****/
voidcheck_wendu(void)
{
uinta,b,c;
c=ReadTemperature()-5;//获取温度值并减去DS18B20的温漂误差
a=c/100;//计算得到十位数字
b=c/10-a*10;//计算得到个位数字
m=c/10;//计算得到整数位
n=c-a*100-b*10;//计算得到小数位
if(m<0){m=0;n=0;}//设置温度显示上限
if(m>99){m=99;n=9;}//设置温度显示上限
}
/*****显示开机初始化等待画面*****/
voidDisp_init(void)
{
P0=~0x80;//显示----
P2=0x7F;
Delay(200);
P2=0xDF;
Delay(200);
P2=0xF7;
Delay(200);
P2=0xFD;
Delay(200);
P2=0xFF;//关闭显示
}
/*****显示温度子程序*****/
voidDisp_Temperature(void)//显示温度
{
P0=~0x98;//显示C
P2=0x7F;
Delay(400);
P0=~LEDData[n];//显示个位
P2=0xDF;
Delay(400);
P0=~LEDData[m%10];//显示十位
DIAN=0;//显示小数点
P2=0xF7;
Delay(400);
P0=~LEDData[m/10];//显示百位
P2=0xFD;
Delay(400);
P2=0xff;//关闭显示
}
/*****显示报警温度子程序*****/
voidDisp_alarm(ucharbaojing)
{
P0=~0x98;//显示C
P2=0x7F;
Delay(200);
P0=~LEDData[baojing%10];//显示十位
P2=0xDF;
Delay(200);
P0=~LEDData[baojing/10];//显示百位
P2=0xF7;
Delay(200);
if(set_st==1)P0=~0xCE;
elseif(set_st==2)P0=~0x1A;//上限H、下限L标示
P2=0xFD;
Delay(200);
P2=0xff;//关闭显示
}
/*****报警子程序*****/
voidAlarm()
{
if(x>=10){beep_st=~beep_st;x=0;}
if((m>=shangxian&&beep_st==1)||(m{
BEEP=0;
ALAM=0;
}
else
{
BEEP=1;
ALAM=1;
}
}
/*****主函数*****/
voidmain(void)
{
uintz;
InitTimer();//初始化定时器
EA=1;//全局中断开关
TR0=1;
ET0=1;//开启定时器0
IT0=1;
IT1=1;
check_wendu();
check_wendu();
for(z=0;