温度检测及报警系统.docx
《温度检测及报警系统.docx》由会员分享,可在线阅读,更多相关《温度检测及报警系统.docx(22页珍藏版)》请在冰点文库上搜索。
温度检测及报警系统
一、选题背景及研究意义
二、总体设计
2.1控制部分
2.2测量部分
2.3显示部分
2.4报警部分
三、硬件设计
四、软件设计
五、总结与展望
一、选题背景及研究意义
温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。
温度是一个十分重要的物理量,对它的测量与控制有十分重要的意义。
随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与控制温度:
如大气及空调房中温度的高低,直接影响着人们的身体健康;粮仓温度的检测,防止粮食发霉,最大限度地保持粮食原有新鲜品质,达到粮食保质保鲜的目的;工业易燃品的存放。
测温技术在生产过程中,在产品质量控制和监测以及节约能源等方面发挥了着重要作用。
本实验设计实现了工业测温基本功能,同时,在设计实验过程中,运用到单片机、模电、数电、传感器和C++程序设计等知识,这既能加强我们的理论知识与实践的结合,也能够提高我们应用交叉学科知识进行综合设计的能力。
二、总体设计
总体设计框图:
2.1控制部分
控制部分是采用单片机STC89C52。
2.1.1STC89C52简介
STC89C52是一种带8K字节闪烁可编程可檫除只读存储器的低电压,高性能COMOS8的微处理器,俗称单片机。
该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
单片机总控制电路如下图4—1:
2.1.2复位操作
复位操作有上电自动复位相按键手动复位两种方式。
上电自动复位是通过外部复位电路的电容充电来实现的,其电路如图4-2(a)所示。
这佯,只要电源Vcc的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就成了系统的复位初始化。
按键手动复位有电平方式和脉冲方式两种。
其中,按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的,其电路如图4-2(b)所示;而按键脉冲复位则是利用RC微分电路产生的正脉冲来实现的,
其电路如图4-2(c)所示:
(a)上电复位(b)按键电平复位(c)按键脉冲复位
图4-2复位电路
上述电路图中的电阻、电容参数适用于6MHz晶振,能保证复位信号高电平持续时间大于2个机器周期。
本系统的复位电路采用图4-2(b)上电复位方式。
2.1.3STC89C52具体介绍如下:
①主电源引脚(2根)
VCC(Pin40):
电源输入,接+5V电源
GND(Pin20):
接地线
②外接晶振引脚(2根)
XTAL1(Pin19):
片内振荡电路的输入端
XTAL2(Pin20):
片内振荡电路的输出端
③控制引脚(4根)
RST/VPP(Pin9):
复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
ALE/PROG(Pin30):
地址锁存允许信号
PSEN(Pin29):
外部存储器读选通信号
EA/VPP(Pin31):
程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
④可编程输入/输出引脚(32根)
STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
PO口(Pin39~Pin32):
8位双向I/O口线,名称为P0.0~P0.7
P1口(Pin1~Pin8):
8位准双向I/O口线,名称为P1.0~P1.7
P2口(Pin21~Pin28):
8位准双向I/O口线,名称为P2.0~P2.7
P3口(Pin10~Pin17):
8位准双向I/O口线,名称为P3.0~P3.7
2.1.4STC89C52主要功能,如下表所示。
STC89C52主要功能
主要功能特性
兼容MCS51指令系统
8K可反复擦写FlashROM
32个双向I/O口
256x8bit内部RAM
3个16位可编程定时/计数器中断
时钟频率0-24MHz
2个串行中断
可编程UART串行通道
2个外部中断源
共6个中断源
2个读写中断口线
3级加密位
低功耗空闲和掉电模式
软件设置睡眠和唤醒功能
2.2测量部分
测量部分我们采用美国DALLAS公司生产的DS18B20温度传感器。
2.2.1DS18B20简介
DS18B20数字温度传感器,该产品采用美国DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
2.2.2封装及接线说明:
DS18B20芯片封装结构:
特点:
独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为3.0V至5.5V无需备用电源测量温度范围为-55°C至+125℃。
华氏相当于是-67°F到257华氏度-10°C至+85°C范围内精度为±0.5°C
2.2.3DS18B20控制方法
DS18B20有六条控制命令:
温度转换44H:
启动DS18B20进行温度转换
读暂存器BEH:
读暂存器9个字节内容
写暂存器4EH:
将数据写入暂存器的TH、TL字节
复制暂存器48H:
把暂存器的TH、TL字节写到E2RAM中
读电源供电方式B4H:
启动DS18B20发送电源供电方式的信号给主CPU
2.2.4DS18B20的初始化
2.2.5DS18B20的写操作
2.2.6DS18B20的读操作
2.3显示部分
显示部分是用LCD1602液晶显示
2.3.1LCD1602引脚说明
2.4报警部分
见下面报警流程图模块及程序。
三、硬件设计
电路原理图如下:
DS18B20与单片机之间用单总线传输;DS18B20的数据口与单片机的P1^7相连;液晶LCD1602的RS、R/W和E分别于单片机的P^4、P2^5、P2^6相连;
四、软件设计
系统软件程序基于Keiluvsion3开发平台,采用C51语言编写。
本程序采用模块化程序方法,主要分为以下三个模块:
◆LCD初始化显示模块
◆DS18B20数据采集模块
◆温度报警上下限设置模块
程序流程图:
源程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P1^7;//ds18b20与单片机连接口
sbitRS=P2^4;
sbitRW=P2^5;
sbitEN=P2^6;
sbitK1=P2^0;
sbitK2=P2^1;
sbitK3=P2^2;
sbitLED=P1^0;
sbitbeep=P1^5;
unsignedcharcodestr1[]={"temperatureis:
"};
unsignedcharcodestr2[]={""};
ucharcodeLCD10[10]={"0123456789"};
uchardatadisdata[16]={0x00,0x00,0x00,0x2E,0x00,0xDF,0x20,0x48,0x3D,0x00,0x00,0x20,0x4C,0x3D,0x00,0x00};
uinttvalue;//温度值
uchartflag;//温度正负标志
ucharflat,upnum,downnum,temp;
/**********************LCD显示模块***********************/
voiddelay1ms(unsignedintms)//延时1毫秒
{unsignedinti,j;
for(i=0;ifor(j=0;j<100;j++);
}
voiddelay1(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwr_com(unsignedcharcom)//写指令//
{delay1ms
(1);
RS=0;
RW=0;
EN=0;
P0=com;/*-----------LCD数据传送口----------*/
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidwr_dat(unsignedchardat)//写数据//
{delay1ms
(1);;
RS=1;
RW=0;
EN=0;
P0=dat;/*-----------LCD数据传送口----------*/
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidlcd_init()//初始化设置//
{delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
}
voiddisplay(unsignedchar*p)//显示//
{
while(*p!
='\0')
{
wr_dat(*p);
p++;
delay1ms
(1);
}
}
init_play()//初始化显示
{
lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xC0);
display(str2);
}
/*******************DS18B20测温模块**********************/
voiddelay_18B20(unsignedinti)//延时1微秒
{
while(i--);
}
voidds1820rst()
{unsignedcharx=0;
DQ=1;//DQ复位
delay_18B20(4);//延时
DQ=0;//DQ拉低
delay_18B20(100);//精确延时大于480us
DQ=1;//拉高
delay_18B20(40);
}
uchards1820rd()
{unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
voidds1820wr(ucharwdata)
{unsignedchari=0;
for(i=8;i>0;i--)
{DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
read_temp()
{uchara,b;
ds1820rst();
ds1820wr(0xcc);//
ds1820wr(0x44);//
ds1820rst();
ds1820wr(0xcc);//
ds1820wr(0xbe);//
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//真实温度
return(tvalue);
}
voidds1820disp()//温度值显示
{uchari;
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[4]=tvalue%10+0x30;//小数位
disdata[9]=LCD10[upnum/10];
disdata[10]=LCD10[upnum%10];
disdata[14]=LCD10[downnum/10];
disdata[15]=LCD10[downnum%10];
if(tflag==0)//+
{
disdata[0]=tvalue/1000+0x30;//正温度显示百位数
}
else//-
{
disdata[0]=0x2d;//负温度显示负号
}
wr_com(0xC0);
for(i=0;i<16;i++)
{
wr_dat(disdata[i]);
}
temp=tvalue/10;//报警温度还原
}
/******************上下限设及报警模块*******************/
voidkey(void)
{
if(K1==0)//模式选择
{
delay1(5);
if(K1==0)
{
flat++;
while(!
K1);
if(flat==1)//上限调节
{
wr_com(0x80+0x40+9);
wr_com(0x0c);//光标显示,闪烁
}
if(flat==2)//下限
{
wr_com(0x80+0x40+14);
}
if(flat==3)//退出模式
{
flat=0;
wr_com(0x0c);
}
}
}
if(flat!
=0)
{
if(K2==0)////+++++++++++++++++++++
{
delay1(5);
if(K2==0)
{
while(!
K2);
if(flat==1)
{
upnum++;
if(upnum==65)//最高温度值+
upnum=35;
wr_com(0x80+0x40+9);
}
if(flat==2)
{
downnum++;
if(downnum==20)//最底温度值-
downnum=3;
wr_com(0x80+0x40+14);
}
}
}
if(K3==0)////-------------------
{
delay1(5);
if(K3==0)
{
while(!
K3);
if(flat==1)
{
upnum--;
if(upnum==35)//最高温度值
upnum=65;
wr_com(0x80+0x40+9);
}
if(flat==2)
{
downnum--;
if(downnum==3)//最底温度值-
downnum=20;
wr_com(0x80+0x40+14);
}
}
}
}
}
voidcompare(void)
{
if(temp>=upnum||temp<=downnum)
{
beep=0;
LED=0;
}
else
{
beep=1;
LED=1;
}
}
/************************main函数*************************/
voidmain()
{
init_play();//初始化显示
flat=0;
upnum=30;
downnum=9;
while
(1)
{read_temp();//读取温度
ds1820disp();//显示
key();
compare();
}
}
五、总结与展望
单片机是一门应用性与实践性很强的学科,如何学习单片机?
学单片机不仅要学习理论知识,实践操作同样重要。
学过单片机的人都有这样的经历。
就是把自己写的程序烧录到单片机里面的时候会发现与自己想要的结果又很大的不同。
这就是因为缺少实践操作的原因。
设计本系统的过程中我们遇到了两大问题:
一是软件问题。
在编写DS18B20的测量程序的过程中遇到了很多问题,刚开始总是得不到测量数据,后来仔细读DS18B20说明资料,发现写时序的时候出了点问题,然后我们又按照着DS18B20的通讯时序和接收时序将程序一条条重写,经过调试后,用Proteus仿真软件可以仿真出正确的结果。
但软件仿真与硬件还是有点区别,等我们把电路板做出来的时候,把程序烧录进去,发现出错!
经过再三检查,不断的思考,最后我发现软件仿真是在硬件理想状态下运行的。
因此,我对应的将软件程序进行了一些细节修改。
最后可以在我们做的硬件电路板中进行正确的测量与显示。
二是硬件问题。
刚开始画PCB时,没有联系到做实际板的问题。
做第一块板的时候遇到了如下问题:
画封装与元器件的实际封装大小不一致;过孔的设置太小;导线设置太小;封装画反了等。
因为第一块板子的功能还不能顺利的实现,所以我们很认真的检查了电路板,通过电路检测,发现板子的电路有些封装画反了。
通过检查和检查板子出现的情况,我们PCB的错误一点点的改正。
后来,我们就是这样一点点的检查板子的来完成我们的作品。
本系统具有较强的实用性,我对DS18B20及一些测量温度的传感器进行了比较,DS18B20不仅测量精度高,稳定性好,体积小巧,而且价格也比较便宜。
另外,本系统还具有较高的扩展性,可以制作时钟,计算器,温度测量于一体,具有较强的实用价值。
(范文素材和资料部分来自网络,供参考。
可复制、编制,期待你的好评与关注)