基于单片机的温度测量报警器秒表Word文档格式.docx
《基于单片机的温度测量报警器秒表Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的温度测量报警器秒表Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
利用单片机实现空气气温的检测,系统主要包括现场温度采集、温度显示、报警装置和以单片机stc89c52作为微处理器。
温度采集电路以数字形式将现场温度传至单片机,单片机结合现场温度与用户设定的目标温度,输送到lcd显示。
1.2系统方案论证
用单片机作为检测器,外围电路直接连接到单片机的检测方法具有灵活性高,易扩展的优势,并且现在的单片机一般都具有通信接口能够实现与外检测器通信,包括PC机。
单片机经过发展其可靠性已得到大家的认可,并且经济价格便宜,具有大规模应用的条件。
更重要的是单片机体积小,能够直接放置在需要检测的装置中去,不用另外设计安装空间。
1.3系统方案实现
本文选用单片机作为检测器,但要实现所需的温度检测的功能我们还需要另外的电子元器件组成电路,并发送和接受相应的电信号来组成一个完整的检测系统。
所需的电路模块如图1-1所示:
图1-1系统框图
3.硬件电路
硬件合理选择和优化配置直接决定了空气温度检测系统的可靠性,以及检测效果的优劣,根据认真仔细的比较本文选用如下的硬件来实现系统要求的功能。
3.STC89C52单片机简介
STC89C52是一个低电压,高性能单片机,带有4K字节的可反复擦写的程序存储器(PENROM)。
和128字节的存取数据存储器(RAM),这种器件采用ATMEL公司的高密度、不容易丢失存储技术生产,并且能够与MCS-51系列的单片机兼容。
片内含有8位中央处理器和闪烁存储单元,所以功能较强的STC89C52单片机能够提供一种安全可靠的检测方案,而被应用到检测领域中。
STC89C52单片机的引脚如图3-1所示:
图3-1STC89C52
STC89C52单片机主要功能部件包括中央处理器、片内数据存储器、片内程序存储器、震荡电路、电源与复位电路并行I/O接口、定时器/计数器、中断系统组成。
简要介绍一下本文用到的一些部件
3.1.1中央处理器
中央处理器(CPU)是STC89C52单片机的核心部件,其字长为8位,主要由运算器和检测器等部件组成。
运算器用于实现对操作数的算术逻辑运算和位操作。
检测器是单片机的智慧检测部件,检测器的主要任务是识别指令,并根据指令的性质检测单片机各功能部件,从而保证单片机各部分能自动而协调地工作。
3.1.2片内数据存储器
89c52单片机内部数据存储器容量仅为256B,与片外数据存储器空间(64K)相独立,采用8位地址码寻址。
其中低地址空间的128B(00—7FH)供用户使用,可按规定规划为工作寄存区、堆栈区、位寻址数据存储器区和通用数据存储器区;
高地址空间的128B(80—FFH)为特殊功能寄存器(FSR),实际中只用到26B,其地址分布并不连续。
3.1.3片内程序存储区
89C52单片机内部程序存储器容量为4KB,分布在整个64K程序存储器空间的低地址空间.
3.1.4振荡器和时序电路
89C52单片机内部有震荡电路,只需外接石英晶体振荡器和频率微调电容即可产生0—24MHz震荡脉冲信号(震荡周期为单片机工作的最小时间单位),震荡脉冲经定时电路处理,产生CPU工作的各种时序信号。
3.1.5电源与复位
89C52单片机采用DC5V供电工作电流为30mA左右,在掉电方式下,电流消耗可大大降低。
89C52单片机需要外部电路提供上电或手动复位信号(高电平脉冲),使单片机内各部件回到初始状态。
3.1.6并行I/O端口
89C52单片机有四个8位并行I/O(输入/输出)端口,每个端口均是准双向口,助记符分别为P0、P1、P2、P3,通过32个引脚将各I/O端口线全部引出,与外部建立联络。
外围电路的连接就主要通过这些I/O口实现与单片机的数据传输。
3.1.7定时/计数器
在单片机实际应用中,往往需要精确的定时或对外部事件进行计数。
89C52单片机内部设置的两个定时/计时器为此提供了便利。
两个定时/计数器的助记符分别为T0、T1,可以设置为计数方式,实现对外部事件的计数;
也可以设置为定时方式,实现精确定时。
3.1.8中断系统
89C52单片机采用向量中断逻辑,可以处理5个中断源的中断请求,并依据中断优先级安排进入相应的中断服务程序。
5个中断源的中断向量为固定值,采用高低两级优先权队列和固定优先级相结合的管理模式。
由于堆栈区容量限制,仅允许两级中断嵌套,即高优先权队列的中断请求可中断低优先权队列的中断服务,但同等优先权队列的高级别中断不能中断该队列中的低优先级中断服务。
3.2时钟电路
时钟电路用于产生单片机工作时所必须的时钟检测信号。
89C52单片机的内部电路在时钟信号检测下,严格地按照时序执行指令进行工作。
单片机各功能部件的运行都是以时钟检测信号为基准工作的。
因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定运行。
常用的时钟电路设计有两种方式,一种是内部时钟方式,另一种为外部时钟方式。
内部时钟方式受到的影响较少,能够提供更加稳定的信号,所以本文采用内部时钟方式。
内部时钟方式的电路连接图3-2所示:
图3-2晶振硬件连接
电路中的电容C1和C2典型值通常选择为30pF左右。
对外接电容的值虽然没有严格的要求,但电容的大小会影响振荡器频率的高低、振荡器的稳定性和起振的快速性。
晶振的震荡频率的范围通常是在1.2MHz—12MHz之间。
但时钟频率越高单片机的运行速度越快,但对电子器件的要求越高。
考虑到所需的定时时间以及扩展和PC机的通信,本文选用11.0592MHz的频率
3.3单总线数字温度传感器DS18B20
单线总线特点
单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。
单总线通常要求外接一个约为4.7K—10K的上拉电阻,这样,当总线闲置时其状态为高电平DS18B20的特点
DS18B20单线数字温度传感器,即“一线器件”,其具有独特的优点:
(1)采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
(2)测量温度范围宽,测量精度高DS18B20的测量范围为-55℃~+125℃;
在-10~+85°
C范围内,精度为±
0.5°
C。
(3)在使用中不需要任何外围元件。
(4)持多点组网功能多个DS18B20可以并联在惟一的单线上,实现多点测温。
(5)供电方式灵活DS18B20可以通过内部寄生电路从数据线上获取电源。
因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。
(6)测量参数可配置DS18B20的测量分辨率可通过程序设定9~12位
(7)负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
(8)掉电保护功能DS18B20内部含有EEPROM,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。
DS18B20具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。
DS18B20内部结构如图所示,
主要由4部分组成:
64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。
64位ROM的排的循环冗余校验码(CRC=X^8+X^5+X^4+1)。
ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
DS18B20内部构成
⏹DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
⏹
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。
64位光刻ROM的排列是:
开始8位(地址:
28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,并且每个DS18B20的序列号都不相同,因此它可以看作是该DS18B20的地址序列码;
最后8位则是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。
由于每一个DS18B20的ROM数据都各不相同,因此微控制器就可以通过单总线对多个DS18B20进行寻址,从而实现一根总线上挂接多个DS18B20的目的。
3.8报警电路
当检测到实际温度大于设置温度32℃时,可认为空气温度过高,此时应发出报警信号,提醒人们注意。
报警信号输出端定义为P2.4脚,连接电路如图3-13所示:
图3-13报警电路(注意:
图中的平1.2应为2.4)
发声元件采用最常见的有源蜂鸣器,两端施加直流电压时就可以发声。
三极管在电路中作用为开关器件。
蜂鸣器本质是一个感性元件,其电流不能瞬变,因此必须有一个续留二极管提供续流,否则,在蜂鸣器两端会产生几十伏的尖峰电压,可能损坏驱动三极管,并干扰整个电路系统的其他部分。
4.软件结构和程序框图
系统的软件由三大模块组成:
主程序模块、功能实现模块和运算检测器模块
4.1主程序模块
主程序的作用为循环调用各个子模块,通过调用各个子模块不断更新全局变量,然后各个子模块使用新的变量来实现检测的要求。
4.2功能实现模块
功能实现模块按照各个检测单元实现分别实现不同的功能,然后把个功能通过单片机联系起来组成一个完整的能较好实现预定功能的系统。
4.2.3温度采集子模块
温度采集模块是用单片机采集ds18b20中的温度数字信号,然后保存在单片机中,作为检测的依据。
由于ds18b20传输过来的为二进制信号,一位一位的传送到P3.4,所以要将其按权转化为单片机能够使用的十进制。
d示。
图4-4读取温度流程图
4.2.4显示子模块
显示子程序使用lcd示的方式,把设定温度和实际温度显示在lcd中.
图4-5显示流程图
图4-7定时器T1流程图
结论
本文通过对系统整体然后对每一个子模块的详细设计,我们得到了一个稳定可靠的空气温度检测系统。
本系统能够准确地检测空气温度到设定的温度,具有较好额调节功能。
可能在实际工作中会出现或大或小的检测偏差。
由于本文使用的检测器为89C52,而这种单片机具有串口通信的功能,如果对其加上串行总线就能和外部其他的检测器进行通信,比如将温度信号传递给PC机,从PC机设置设定温度等。
而PC机能够连接到互联网,这就能组成一个远程的检测网络,从而组成物联网一样的检测网络。
致谢
论文的设计过程中,我查阅了许多有关温度检测系统设计方面的文献资料,使我对温度检测的设计和使用有了更深的认识。
从论文选题到完成论文,赖友源老师付出了大量的时间和心血,在设计过程中,赖友源老师从多方面进行指导。
在此,我要由衷地感谢……同时,我也要感谢给予我帮助的同学,在不懂的环节为我努力探讨。
报告的完成,不仅是我大学知识积累的体现,而且也是机械与电子工程学院所有老师悉心教导的结果,感谢他们让我掌握了一定的专业知识,专业技能和一些为人处世的道理。
最要感激父母,是他们给我学习的机会,并且在学业期间给我大力支持和为我付出!
参考文献
[1]张毅刚.单片机原理及应用[M].高等教育出版社,2003
[2]卢胜利.单片机原理与应用技术实践[M].机械工业出版社,2009
[3]陈步月.基于单片机的测试技术原理与应用[M].机械工业出版社,2007
[4]于海生.微型计算机检测技术[M].第2版.清华大学出版社,2009
[5]胡寿松.自动检测原理[M].第5版.科学出版社,2009
[6]陈夕松汪木兰.过程检测系统[M].科学出版社,2009
[7]王兆安黄俊.电力电子技术[M].第4版.机械工业出版社,2010
[8]刘振全杨世凤.MATLAB语言与检测系统仿真[M].化学工业出版社,2009
[9]谭浩强.C程序设计[M].第3版.清华大学出版社,2005
[10]赵景波.PROTEL99SE电路设计与制板[M].机械工业出版社,2010
[11]李晓帆姚根和.高精度温度检测[J].怀化学院学报,2007
附录
部分程序如下:
文件1:
//#include<
at89x51.h>
//用AT89C51时就用这个头文件
#include<
reg52.h>
//用华邦W78E58B时必须用这个头文件
absacc.h>
ctype.h>
math.h>
stdio.h>
string.h>
DS18B20.h>
lcd.c>
////液晶显示头文件
lcd-1.c>
//sbitDQ=P3^4;
//定义DQ引脚为P3.4
unsignedchart[2],*pt;
//用来存放温度值,测温程序就是通过这个数组与主函数通信的
unsignedcharTempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'
\0'
};
//显示实时温度,上电时显示+125.00C
unsignedcharTempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,
0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'
//显示温度上下限,上电时显示TH:
+125TL:
+124C
unsignedcharcodedotcode[4]={0,25,50,75};
/***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*******
再将表值分离出十位和个位后送到十分位和百分位********************/
voidcovert0(unsignedcharTH,unsignedcharTL)//将温度上下限转换为LCD显示的数据
{
if(TH>
0x7F)//判断正负,如果为负温,将其转化为其绝对值
{
TempBuffer0[3]=0x2d;
////0x2d为"
-"
的ASCII码
TH=~TH;
TH++;
}
elseTempBuffer0[3]=0x2b;
////0x2B为"
+"
if(TL>
0x7f)
TempBuffer0[11]=0x2d;
TL=~TL+1;
elseTempBuffer0[11]=0x2b;
TempBuffer0[4]=TH/100+0x30;
//分离出TH的百十个位
if(TempBuffer0[4]==0x30)TempBuffer0[4]=0xfe;
//百位数消隐
TempBuffer0[5]=(TH%100)/10+0x30;
//分离出十位
TempBuffer0[6]=(TH%100)%10+0x30;
//分离出个位
TempBuffer0[12]=TL/100+0x30;
//分离出TL的百十个位
if(TempBuffer0[12]==0x30)TempBuffer0[12]=0xfe;
TempBuffer0[13]=(TL%100)/10+0x30;
TempBuffer0[14]=(TL%100)%10+0x30;
}
voidcovert1(void)//将温度转换为LCD显示的数据
{
unsignedcharx=0x00,y=0x00;
t[0]=*pt;
pt++;
t[1]=*pt;
if(t[1]>
0x07)//判断正负温度
TempBuffer1[0]=0x2d;
//0x2d为"
t[1]=~t[1];
/*下面几句把负数的补码*/
t[0]=~t[0];
/*换算成绝对值*********/
x=t[0]+1;
/***********************/
t[0]=x;
/***********************/
if(x>
255)/**********************/
t[1]++;
/*********************/
elseTempBuffer1[0]=0x2b;
//0xfe为变"
t[1]<
<
=4;
//将高字节左移4位
t[1]=t[1]&
0x70;
//取出高字节的3个有效数字位
x=t[0];
//将t[0]暂存到X,因为取小数部分还要用到它
x>
>
//右移4位
x=x&
0x0f;
//和前面两句就是取出t[0]的高四位
t[1]=t[1]|x;
//将高低字节的有效值的整数部分拼成一个字节
TempBuffer1[1]=t[1]/100+0x30;
//+0x30为变0~9ASCII码
if(TempBuffer1[1]==0x30)TempBuffer1[1]=0xfe;
TempBuffer1[2]=(t[1]%100)/10+0x30;
TempBuffer1[3]=(t[1]%100)%10+0x30;
t[0]=t[0]&
0x0c;
//取有效的两位小数
t[0]>
=2;
//左移两位,以便查表
y=dotcode[x];
//查表换算成实际的小数
TempBuffer1[5]=y/10+0x30;
//分离出十分位
TempBuffer1[6]=y%10+0x30;
//分离出百分位
}
voiddelay(unsignedchari)
while(i--);
main()
unsignedcharTH=32,TL=0;
//读取温度,温度值存放在一个两个字节的数组中,
unsignedintw,maini;
//测温函数返回这个数组的头地址
T0init();
//定时器0初始化
while
(1)
{spe=0;
LCD_Initial();
//lcd初始化//
for(maini=0;
maini<
25;
maini++)
main_1();
pt=ReadTemperature(TH,TL,0x3f);
//上限温度+110,下限-20,分辨率10位,也就是0.25C
delay(100);
//读取温度,温度值存放在一个两个字节的数组中,
covert1();
//将温度转换为LCD显示的数据
covert0(TH,TL);
//将温度上下限转换为LCD显示的数据
//第一个参数列号,第二个为行号,为0表示第一行//为1表示第二行,第三个参数为显示数据的首地址
LCD_Print(1,1,TempBuffer0);
//下一步扩展时可能通过这两个变量,调节上下限
LCD_Print(1,0,TempBuffer1);
for(w=0;
w<
999;
w++)//***************************************//
delay(400);
//*********************************//
//报警复位//
voidtimer0()interrupt1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
//定时50MS
if(--timecount==0)
timecount=20;
//执行20次后秒标志位置1
timeflag=1;
//1S
if(++timecount1>
1)