温度检测及报警系统Word文件下载.docx
《温度检测及报警系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《温度检测及报警系统Word文件下载.docx(22页珍藏版)》请在冰点文库上搜索。
![温度检测及报警系统Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/62d2c799-923e-4fd6-b1e2-19ba89a80f74/62d2c799-923e-4fd6-b1e2-19ba89a80f741.gif)
电源输入,接+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级加密位
低功耗空闲和掉电模式
软件设置睡眠和唤醒功能
测量部分我们采用美国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的读操作
显示部分是用LCD1602液晶显示
2.3.1LCD1602引脚说明
见下面报警流程图模块及程序。
电路原理图如下:
DS18B20与单片机之间用单总线传输;
DS18B20的数据口与单片机的P1^7相连;
液晶LCD1602的RS、R/W和E分别于单片机的P^4、P2^5、P2^6相连;
系统软件程序基于Keiluvsion3开发平台,采用C51语言编写。
本程序采用模块化程序方法,主要分为以下三个模块:
◆LCD初始化显示模块
◆DS18B20数据采集模块
◆温度报警上下限设置模块
程序流程图:
源程序:
#include<
reg51.h>
#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;
i<
ms;
i++)
for(j=0;
j<
100;
j++);
}
voiddelay1(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
voidwr_com(unsignedcharcom)//写指令//
{delay1ms
(1);
RS=0;
RW=0;
EN=0;
P0=com;
/*-----------LCD数据传送口----------*/
delay1ms
(1);
EN=1;
voidwr_dat(unsignedchardat)//写数据//
;
RS=1;
P0=dat;
voidlcd_init()//初始化设置//
{delay1ms(15);
wr_com(0x38);
delay1ms(5);
wr_com(0x08);
wr_com(0x01);
wr_com(0x06);
wr_com(0x0c);
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
//拉高
delay_18B20(40);
}
uchards1820rd()
{unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
i--)
{DQ=0;
//给脉冲信号
dat>
>
=1;
DQ=1;
if(DQ)
dat|=0x80;
delay_18B20(10);
return(dat);
voidds1820wr(ucharwdata)
{unsignedchari=0;
for(i=8;
i>
i--)
{DQ=0;
DQ=wdata&
0x01;
wdata>
read_temp()
{uchara,b;
ds1820rst();
ds1820wr(0xcc);
//
ds1820wr(0x44);
//
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;
16;
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;
}
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)////-------------------
if(K3==0)
K3);
upnum--;
if(upnum==35)//最高温度值
upnum=65;
downnum--;
if(downnum==3)//最底温度值-
downnum=20;
voidcompare(void)
if(temp>
=upnum||temp<
=downnum)
beep=0;
LED=0;
{
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不仅测量精度高,稳定性好,体积小巧,而且价格也比较便宜。
另外,本系统还具有较高的扩展性,可以制作时钟,计算器,温度测量于一体,具有较强的实用价值。
(范文素材和资料部分来自网络,供参考。
可复制、编制,期待你的好评与关注)