温度检测及报警系统

目录
一、选题背景及研究意义 二、总体设计 2.1 控制部分 2.2 测量部分 2.3 显示部分 2.4 报警部分 三、硬件设计 四、软件设计 五、总结与展望

一、选题背景及研究意义 选题背景及研究意义
温度是一种最基本的环境参数,人民的生活与环境的温度息息相 关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度 的测量,因此研究温度的测量方法和装置具有重要的意义。 温度是一个十分重要的物理量,对它的测量与控制有十分重要的意 义。随着现代工农业技术的发展及人们对生活环境要求的提高,人们也 迫切需要检测与控制温度:如大气及空调房中温度的高低,直接影响着 人们的身体健康;粮仓温度的检测,防止粮食发霉,最大限度地保持粮 食原有新鲜品质,达到粮食保质保鲜的目的;工业易燃品的存放。 测温技术在生产过程中,在产品质量控制和监测以及节约能源等方面发 挥了着重要作用。本实验设计实现了工业测温基本功能,同时,在设计 实验过程中,运用到单片机、模电、数电、传感器和 C++程序设计等知 识,这既能加强我们的理论知识与实践的结合,也能够提高我们应用交 叉学科知识进行综合设计的能力。

二、总体设计
总体设计框图:

2 .1 控制部分 控制部分是采用单片机 STC89C52。 2.1.1 STC89C52 简介 STC89C52 是一种带 8K 字节闪烁可编程可檫除只读存储器的低电 压,高性能 COMOS8 的微处理器,俗称单片机。该器件采用 ATMEL 搞密 度非易失存储器制造技术制造,与工业标准的 MCS-51 指令集和输出管 脚相兼容。 单片机总控制电路如下图 4—1:

2.1.2 复位操作 复位操作有上电自动复位相按键手动复位两种方式。 上电自动复位是通过外部复位电路的电容充电来实现的,其电 路如图 4-2(a)所示。这佯,只要电源 Vcc 的上升时间不超过 1ms, 就可以实现自动上电复位,即接通电源就成了系统的复位初始化。 按键手动复位有电平方式和脉冲方式两种。其中,按键电平复 位是通过使复位端经电阻与 Vcc 电源接通而实现的,其电路如图 4-2(b)所示;而按键脉冲复位则是利用 RC 微分电路产生的正脉 冲来实现的, 其电路如图 4-2(c)所示:

(b)按键电平复位 (c)按键脉冲复位 图 4-2 复位电路 上述电路图中的电阻、电容参数适用于 6MHz 晶振,能保证复 位信号高电平持续时间大于 2 个机器周期。 本系统的复位电路采用图 4-2(b)上电复位方式。 2.1.3 STC89C52 具体介绍如下: ① 主电源引脚(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.4 STC89C52 主要功能,如下表所示。

(a)上电复位

STC89C52 主要功能 主要功能特性 兼容 MCS51 指令系统 32 个双向 I/O 口 3 个 16 位可编程定时/计数 器中断 2 个串行中断 2 个外部中断源 2 个读写中断口线 低功耗空闲和掉电模式

8K 可反复擦写 Flash ROM 256x8bit 内部 RAM 时钟频率 0-24MHz 可编程 UART 串行通道 共 6 个中断源 3 级加密位 软件设置睡眠和唤醒功能

2 .2 测量部分 测量部分我们采用美国 DALLAS 公司生产的 DS18B20 温度传感 器。 2.2.1 DS18B20 简介 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.3 DS18B20 控制方法 DS18B20 有六条控制命令: 温度转换 44H:启动 DS18B20 进行温度转换 读暂存器 BEH:读暂存器 9 个字节内容 写暂存器 4EH:将数据写入暂存器的 TH、TL 字节 复制暂存器 48H:把暂存器的 TH、TL 字节写到 E2RAM 中 读电源供电方式 B4H:启动 DS18B20 发送电源供电方式的信号给主 CPU 2.2.4 DS18B20 的初始化 2.2.5 DS18B20 的写操作 2.2.6 DS18B20 的读操作 2 .3 显示部分 显示部分是用 LCD1602 液晶显示 2.3.1 LCD1602 引脚说明

2 .4 报警部分 见下面报警流程图模块及程序。

三、硬件设计
电路原理图如下:

DS18B20 与单片机之间用单总线传输;DS18B20 的数据口与单片机的 P1^7 相连; 液晶 LCD1602 的 RS、 R/W 和 E 分别于单片机的 P^4、 P2^5、 P2^6 相连;

四、软件设计
系统软件程序基于 Keil uvsion3 开发平台,采用 C51 语言编写。本程序 采用模块化程序方法,主要分为以下三个模块: ◆ LCD 初始化显示模块 ◆ DS18B20 数据采集模块 ◆ 温度报警上下限设置模块 程序流程图:

LCD1602

DS18B20

N

DS18B20

Y

480us

45us

DS18B20

TH TL

DS18B20

Temp>=TH||Temp<=TL?
N Y

LED

源程序: #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit DQ=P1^7; //ds18b20 与单片机连接口 sbit RS=P2^4; sbit RW=P2^5; sbit EN=P2^6;

sbit K1=P2^0; sbit K2=P2^1; sbit K3=P2^2; sbit LED=P1^0; sbit beep=P1^5; unsigned char code str1[]={"temperature is:"}; unsigned char code str2[]={" "}; uchar code LCD10[10]={"0123456789"}; uchar data disdata[16]={0x00,0x00,0x00,0x2E,0x00,0xDF,0x20, 0x48,0x3D,0x00,0x00,0x20,0x4C,0x3D,0x00,0x00}; uint tvalue; //温度值 uchar tflag; //温度正负标志 uchar flat,upnum,downnum,temp; /**********************LCD 显示模块***********************/ void delay1ms(unsigned int ms)//延时 1 毫秒 {unsigned int i,j; for(i=0;i<ms;i++) for(j=0;j<100;j++); } void delay1(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void wr_com(unsigned char com)//写指令// { delay1ms(1); RS=0; RW=0; EN=0; P0=com; /*-----------LCD 数据传送口---------- */ delay1ms(1); EN=1; delay1ms(1); EN=0; } void wr_dat(unsigned char dat)//写数据//

{ delay1ms(1);; RS=1; RW=0; EN=0; P0=dat; /*-----------LCD 数据传送口---------- */ delay1ms(1); EN=1; delay1ms(1); EN=0; } void lcd_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); } void display(unsigned char *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 测温模块**********************/ void delay_18B20(unsigned int i)//延时 1 微秒 { while(i--);

} void ds1820rst() { unsigned char x=0; DQ = 1; //DQ 复位 delay_18B20(4); //延时 DQ = 0; //DQ 拉低 delay_18B20(100); //精确延时大于 480us DQ = 1; //拉高 delay_18B20(40); } uchar ds1820rd() { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } void ds1820wr(uchar wdata) {unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata>>=1; } } read_temp() {uchar a,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); } void ds1820disp()//温度值显示 { uchar i; 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; //报警温度还原 } /******************上下限设及报警模块*******************/ void key(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); } } } } }

void compare(void) { if(temp>=upnum||temp<=downnum) { beep=0; LED=0; } else { beep=1; LED=1; } } /************************main 函数*************************/ void main() { init_play();//初始化显示 flat=0; upnum=30; downnum=9; while(1) { read_temp();//读取温度 ds1820disp();//显示 key(); compare(); } }

五、总结与展望
单片机是一门应用性与实践性很强的学科,如何学习单片机? 学单片机不仅要学习理论知识,实践操作同样重要。学过单片机的 人都有这样的经历。就是把自己写的程序烧录到单片机里面的时候会发 现与自己想要的结果又很大的不同。这就是因为缺少实践操作的原因。 设计本系统的过程中我们遇到了两大问题: 一是软件问题。在编写 DS18B20 的测量程序的过程中遇到了很多 问题,刚开始总是得不到测量数据,后来仔细读 DS18B20 说明资料, 发现写时序的时候出了点问题,然后我们又按照着 DS18B20 的通讯时 序和接收时序将程序一条条重写,经过调试后,用 Proteus 仿真软件可 以仿真出正确的结果。但软件仿真与硬件还是有点区别,等我们把电路 板做出来的时候,把程序烧录进去,发现出错!经过再三检查,不断的 思考,最后我发现软件仿真是在硬件理想状态下运行的。因此,我对应 的将软件程序进行了一些细节修改。最后可以在我们做的硬件电路板中 进行正确的测量与显示。 二是硬件问题。刚开始画 PCB 时,没有联系到做实际板的问题。 做第一块板的时候遇到了如下问题:画封装与元器件的实际封装大小不 一致;过孔的设置太小;导线设置太小;封装画反了等。因为第一块板 子的功能还不能顺利的实现,所以我们很认真的检查了电路板,通过电 路检测,发现板子的电路有些封装画反了。通过检查和检查板子出现的 情况,我们 PCB 的错误一点点的改正。后来,我们就是这样一点点的 检查板子的来完成我们的作品。 本系统具有较强的实用性,我对 DS18B20 及一些测量温度的传感 器进行了比较,DS18B20 不仅测量精度高,稳定性好,体积小巧,而且 价格也比较便宜。另外,本系统还具有较高的扩展性,可以制作时钟, 计算器,温度测量于一体,具有较强的实用价值。


相关文档

温度检测报警系统的设计
实时温度检测显示与报警系统
温度检测显示与报警系统
基于STC89C51的温度检测及报警系统设计
温度测量报警系统
基于AT89S52和DS18B20的多点温度检测报警系统
基于51单片机的温度检测和报警系统
单片机课程设计-——多路温度检测及报警系统
基于DS18B20与ISD1420的温度检测与报警系统设计
基于单片机的多路温度检测报警系统
电脑版