温度监测报警系统设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
一、设计任务与设计要求 (1)
二、设计原理 (1)
2.1 主要硬件介绍 (1)
2.1.1 DS18B20数字温度传感器 (1)
2.1.2 AT89C51单片机芯片 (3)
2.2 系统原理结构 (3)
三、设计方案 (4)
3.1 硬件部分 (4)
3.1.1 温度测量模块 (4)
3.1.2 LED数码管显示模块 (4)
3.1.3 按键模块 (5)
3.1.4 系统整体结构仿真图 (5)
3.2 软件部分 (5)
3.2.1DS18B20传感器程序 (5)
3.2.2键盘读取及确认程序 (7)
3.2.3DS18B20操作流程图 (8)
四、调试与性能分析 (9)
4.1 proteus仿真结果 (9)
4.2实物测试 (9)
4.2.1正常情况 (9)
4.2.2报警状态 (10)
五、心得体会 (10)
六、成品展示 (11)
七、附录部分 (12)
附件一、电路设计原理图 (12)
附件二、系统设计原始代码程序 (13)
一、设计任务与设计要求
本设计主要利用单片机AT89C51 芯片和以美国MAXIM/DALLAS半导体公司的单总线温度传感器DS18B20相结合来实现装置周围温度的采集,其中以单片机AT89C51 芯片为核心,辅以温度传感器DS18B20和LED数码管及必要的外围电路,构成一个结构简单、测温准确、具有一定控制功能的温度监视警报装系统。

功能要求:
添加温度报警功能,通过4个按键来设置温度的上下限值,当用DS18B20
测得的温度不在所设置的温度范围内,蜂鸣器开始鸣报。

二、设计原理
2.1 主要硬件介绍
2.1.1 DS18B20数字温度传感器
DS18B20 数字温度传感器提供9~12 位摄氏温度的测量,拥有非易失性用户可编程最高与最低触发点告警功能。

DS18B20 通过单总线实现通信,单总线通常是DS18B20连接到中央微控制器的一条数据线(和地)。

它能够感应温度的范围为-55℃~+125℃,在-10℃~+85℃的测量的精度是±0.5℃,而且DS18B20 可以直接从数据线上获取供电(寄生电源)而不需要一个额外的外部电源。

DS18B20 使用DALLAS 独有的单总线(1—wire)协议使得总线通信只需要一根控制线,控制线需要一个较小的上拉电阻,因为所有的期间都是通过三态或开路端口连接在总线上的(DS18B20 是这种情况)。

在这种总线系统中,微控制器(主器件)识别和寻址挂接在总线上具有独特64 位序列号的器件。

因为每个器件拥有独特的序列号,因此挂接到总线上的器件在理论上是不受限制的,单总线(1-wire)协议包括指令的详细解释和“时隙”。

这个数据表包含在单总线系统(1-WIRE BUS SYSTEM)部分。

DS18B20 的另外一个特征是能够在没有外部供电的情况下工作。

当总线为高的时候,电源有上拉电阻通过DQ 引脚提供,高总线信号给内部电容(Cpp)充电,这就使得总线为的时候给器件提供电源,这种从单总线上移除电源的方法跟寄生电源有关,作为一种选择,DS8B20 也可以采用引脚VDD 通过外部电源给器件供电。

DS18B20 引脚定义:
(1) GND为电源地;
(2) DQ为数字信号输入/输出端;
(3)VDD 为外接供电电源输入端(在寄生电源接线方式时接地)
图2.1.1 DS18B20 引脚排列图
DS18B20温度测量
DS18B20 测温原理如图2.1.2所示。

图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。

高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2 的脉冲输入。

计数器1 和温度寄存器被预置在-55℃所对应的一个基数值。

计数器1 对低温度系数晶振产生的脉冲信号进行减法计数,当
计数器1 的预置值减到0 时,温度
寄存器的值将加1,计数器1 的预
置将重新被装入,计数器1 重新开
始对低温度系数晶振产生的脉冲信
号进行计数,如此循环直到计数器
2 计数到0 时,停止温度寄存器值
的累加,此时温度寄存器中的数值
即为所测温度。

图2.1.2 中的斜率
累加器用于补偿和修正测温过程中
的非线性,其输出用于修正计数器
图2.1.2 DS18B20 测温原理框图
1 的预置值。

DS18B20工作时序
DS18B20需要严格的单总线协议以确保数据的完整性。

协议包括集中单总线信号类型:复位脉冲、存在脉冲、写0、写1、读0 和读1。

所有这些信号,除存在脉冲外,都是由总线控制器发出的。

和DS18B20间的任何通讯都需要以初始化序列开始。

一个复位脉冲跟着一个存在脉冲表明DS18B20已经准备好发送和接收数据。

在初始化序列期间,总线控制器拉低总线并保持480us以发出(TX)一个复位脉冲,然后释放总线,进入接收状态(RX)。

单总线由5K上拉电阻拉到高电平。

当DS18B20探测到I/O引脚上的上升沿后,等待15-60us,然后发出一个由60-240us低电平信号构成的存在脉冲DS18B20的数据读写是通过时序处理位来确认信息交换的。

有两种写时序:写1时序和写0时序。

总线控制器通过写1时序写逻辑1到DS18B20,写0时序写逻辑0到DS18B20。

所有写时序必须最少持续60us,包括两个写周期之间至少1us的恢复时间。

当总线控制器把数据线从逻辑高电平拉到低电平的时候,写时序开始。

总线控制器要生产一个写时序,必须把数据线拉到低电平然后释放,在写时序开始后的15us释放总线。

当总线被释放的时候,5K的上拉电阻将拉高总线。

总控制器要生成一个写0时序,必须把数据线拉到低电平并持续保持(至少60us)。

总线控制器初始化写时序后,DS18B20在一个15us到60us的窗口内对I/O线采样。

如果线上是高电平,就是写1。

如果线上是低电平,就是写0。

总线控制器发起读时序时,DS18B20仅被用来传输数据给控制器。

因此,总线控制器在发出读暂存器指令[BEh]或读电源模式指令[B4H]后必须立刻开始读时序,DS18B20可以提供请求信息。

除此之外,总线控制器在发出发送温度转换指令[44h]或召回EEPROM指令[B8h]之后读时序。

所有读时序必须最少60us,包括两个读周期间至少1us的恢复时间。

当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持1us,然后总线被释放在总线控制器发出读时序后,DS18B20 通过拉高或拉低总线上来传输1或0。

当传输逻辑0结束后,总线将被释放,通过上拉电阻回到上升沿状态。

从DS18B20输出的数据在读时序的下降沿出现后15us 内有效。


此,总线控制器在读时序开始后必须停止把I/O脚驱动为低电平15us,以读取I/O 脚状态。

2.1.2 AT89C51单片机芯片
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。

ATC9C51的引脚排列图如图2.1.3。

主要参数如下:
·与MCS-51产品指令系统完全兼容
·4k字节可重擦写Flash闪速存储器
·1000次擦写周期
·全静态操作:0Hz-24MHz
·三级加密程序存储器
·128×8字节内部RAM
·32个可编程I/O口线
·2个16位定时/计数器
·6个中断源·可编程串行UART通道
·低功耗空闲和掉电模图2.1.3 AT89C51的引脚排列2.2 系统原理结构
系统主要由硬件和软件两大部分构成,当接收到系统发出的温度转换命令后, DS18B20开始进行温度转换操作并把转化后的结果放到16 位暂存寄存器中的温度寄存器内,然后与系统进行数据通信,系统将温度读出并驱动LED数码管显示当前温度。

如果温度值低于设定下限值或高于设定上限值,则自动启动报警装置。

由于DS18B20单总线通信功能是分时完成的,它有严
º电源
LED温度显示
DS18B20
蜂鸣器
AT89C51
上限+键上限-键下限+键下限-键图2.2.4 系统结构原理图
三、设计方案
3.1 硬件部分
3.1.1 温度测量模块
温度测量传感器采用DALLAS公司DS18B20的单总线数字化温度传感器测温范围为-55℃~125℃,可编程为9位~12位A/D转换精度,测温分辨率达到0.0625℃,采用寄生电源工作方式,CPU只需一根口线便能与DS18B20通信,占用CPU口线少,可节省大量引线和逻辑电路,接口电路如图3.1.1所示。

图3.1.1 DS18B20温度测量模块
3.1.2 LED数码管显示模块
采用LED作为显示器,尽可能的把温度等信息通过LED显示出来,速率比较快,显示更直观。

图3.1.4 LCD1602显示模块
3.1.3 按键模块
方案一:矩阵键盘
如果选择此方案,那么在修改温度上下限或其他功能键就可以直接从键盘输入,方便、快捷。

缺点也很明显,一是浪费按键,用全键盘来实现功能不免大材小用;二是从实用性考虑,全键盘体积大,不经济不方便。

方案二:独立式按键
如果设置过多按键,将会占用较多I/O口,而且会给布线带来不便,同时浪费按键,不高效,程序繁琐。

本次设计适用于按键较少的情况。

为了尽量实现按键的高效性,此次设计采用四个独立式按键,分别定义为key1(上限温度加数键)、key2(上限温度减数键)、key3(下限温度加数键)、key4(下限温度减数键)。

3.1.4 系统整体结构仿真图
图3.1.6 系统整体结构仿真图
3.2 软件部分
3.2.1DS18B20传感器程序
(1)DS18B20初始化函数
void rst_ds18b20(void)
{
DQ=1;
Delay_18b20(4);
DQ=0;
Delay_18b20(100);
DQ=1;
Delay_18b20(40);
}
(2)读取DS18B20数据函数
uchar read_ds18b20(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Delay_18b20(10);
}
return(dat);
}
(2)向DS18B20中写入数据函数
void write_ds18b20(uchar wdata)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=wdata&0x01;
Delay_18b20(10);
DQ=1;
wdata>>=1;
}
}
(3)读取温度值并转换函数
void read_ds18b20_temp(void)
{
uchar a,b;
rst_ds18b20();
write_ds18b20(0xcc); // 跳过读序号列号的操作 write_ds18b20(0x44); // 启动温度转换
rst_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0xbe); //读取温度寄存器等(共可读9个寄存器)a=read_ds18b20();
b=read_ds18b20();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
tvalue=tvalue*(0.625);
}
(4)温度显示函数
void Display_ds18b20()
{
dispbuf[7]=Tbottom/100;
dispbuf[6]=Tbottom%100/10;
dispbuf[5]=16;
dispbuf[4]=tvalue/100;
dispbuf[3]=tvalue%100/10;
dispbuf[2]=16;
dispbuf[1]=Ttop/100;
dispbuf[0]=Ttop%100/10;
}
3.2.2键盘读取及确认程序
(1)键盘消抖函数
void keyscan()
{
uchar temp=0; //临时变量
if(keytemp!=0xff) temp=keytemp;
if(temp==0)
{
keyup=1; //按键已经放开
keyback=0; //清除按键备份值
keyval=0;
}
else if(temp==keyback&&keyup==1) //两次的检测的值一样且按键已经放开{
keyval=temp; //存放按键值
keyup=0;
}
else //按键已经执行且还没放开
keyback=temp; //把新的键值放入备份单元
}
(2)设置key1、key2为上限调节键,设置key3、key4为下限调节键void Key_job()
{
keyscan();
switch(keyval)
{
case 0x7f: if(flag==1){Ttop+=10;flag=0;}break;
case 0xb7: if(flag==1){Ttop-=10;flag=0;}break;
case 0xcf: if(flag==1){Tbottom+=10;flag=0;}break;
case 0xdf: if(flag==1){Tbottom-=10;flag=0;}break;
default:flag=1;break;
}
}
3.2.3DS18B20
图3.2.1 DS18B20操作流程图
四、调试与性能分析
4.1 proteus仿真结果
图4.1.1 系统proteus仿真结果
如图所示,点击开始运行仿真时, LED数码管上从左到右分别显示设置温度下限为10度,中间显示DS18B02温度传感器采集温度为15度,右侧显示设置温度上限为20度。

其中上限与下限值可通过按键更改。

4.2实物测试
4.2.1正常情况
图4.2.1 温度正常时显示情况
如图所示,此时温度报警下限为5度,上限为17度,而DS18B02温度传感器采集温度为13度,处于设定温度上下限之间,蜂鸣器未报警,系统工作正常。

4.2.2报警状态
图4.2.2温度高于上限时显示情况
如图所示,此时温度报警下限为5度,上限为11度,而DS18B02温度传感器采集温度为13度,高于设定的上限温度,蜂鸣器报警,系统工作正常。

五、心得体会
在老师的指导和同学的帮助下,经过不懈的努力,终于成功完成了此次设计任务,基本实现设计要求,读出并显示DS18B20采集的温度,能够在温度超过限定温度是通过蜂鸣器报警,并且可以实现通过按键设置温度上下限。

但是系统还存在许多可以改进的地方、还有许多可以扩展的功能比如用LCD液晶显示器更精确清除的显示温度和警报信息等。

通过这次独立的系统设计经验,我加深了对单片机理论的理解,学会如何将理论应用到实践,我还明白了在设计前,要有一个清晰的思路和一套高效的设计实施方案,在设计过程中要严格按照既定大的方案执行,才不会在过程中出现混乱,比如设计的程序功能与硬件设备不符等情况。

最后,我认识到不管做什么设计,都要有坚实的理论知识作基础,其次要提高我们自己的创新思维及动手能力,希望以后通过更努力的学习和锻炼让自己获得更大的能力提升。

六、成品展示
七、附录部分
附件一、电路设计原理图
设计电路原理图
附件二、系统设计原始代码程序
/************************************************
DS18B20监测警报
作者:XXX 班级:XXXXXXXXXXX
功能如下:实现基本测温功能
通过四个按键,可设置高低限温度,不在所
设定温度范围内,将蜂鸣器和屏幕显示报警
*************************************************/ #include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit LEDCLK=P3^4;
sbit LEDDIN=P2^3;
sbit Key_Input=P1^0;
sbit DQ=P3^2;
sbit sound=P1^2;
uchar code ledtable[]=
{0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,
0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,0xfd}; uchar dispbuf[8];
uchar keytemp=0; //定义且给扫描键值赋初始值0 uchar keyval=0; //定义且给键值赋初始值0 uchar keyback; //定义一个备份键值
bit keyup; //定义一个按键值
uint Ttop=150;
uint Tbottom=50;
uint tvalue;
uchar flag;
void Delayms(uint i) //延时函数
{
uint j;
for(;i>0;i--)
for(j=123;j>0;j--);
}
void Delay_18b20(uint i)
{
while(i--);
}
void Read_Key()
{
keytemp<<=1;
if(Key_Input)
{
keytemp++;
}
}
void keyscan()
{
if(keytemp==0xff)
{
keyup=1;
keyback=0;
keyval=0;
flag=1;
}
else if(keytemp==keyback&&keyup==1)
{
keyval=keytemp;
keyup=0;
keyback=0;
}
else
{
keyback=keytemp;
}
}
void Key_job() //读取键值
{
keyscan();
switch(keyval)
{
case 0x7f: if(flag==1){Ttop+=10;flag=0;}break;
case 0xb7: if(flag==1){Ttop-=10;flag=0;}break;
case 0xcf: if(flag==1){Tbottom+=10;flag=0;}break;
case 0xdf: if(flag==1){Tbottom-=10;flag=0;}break;
default:flag=1;break;
}
}
void rst_ds18b20(void) //DS18B20初始及设置函数
{
DQ=1;
Delay_18b20(4);
DQ=0;
Delay_18b20(100);
DQ=1;
Delay_18b20(40);
}
uchar read_ds18b20(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Delay_18b20(10);
}
return(dat);
}
void write_ds18b20(uchar wdata) //向DS18B20中写入数据{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=wdata&0x01;
Delay_18b20(10);
DQ=1;
wdata>>=1;
}
}
void read_ds18b20_temp(void) //读取温度值
{
uchar a,b;
rst_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0x44);
rst_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0xbe);
a=read_ds18b20();
b=read_ds18b20();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
tvalue=tvalue*(0.625);
}
void Display_ds18b20() //温度显示函数{
dispbuf[7]=Tbottom/100;
dispbuf[6]=Tbottom%100/10;
dispbuf[5]=16;
dispbuf[4]=tvalue/100;
dispbuf[3]=tvalue%100/10;
dispbuf[2]=16;
dispbuf[1]=Ttop/100;
dispbuf[0]=Ttop%100/10;
}
void Close_led()
{
uchar i;
for(i=0;i<8;i++)
{
LEDCLK=0;
LEDDIN=1;
_nop_();
LEDCLK=1;
}
}
void Warning() //温度警报函数{
if(Tbottom>tvalue)
{
Delayms(2);
sound=0;
Delayms(2);
sound=1;
}
else if(tvalue>Ttop)
{
sound=0;
Delayms(2);
sound=1;
}
else
{
sound=1;
}
}
main()
{
Close_led();
read_ds18b20_temp();
Delayms(1000);
read_ds18b20_temp();
sound=1;
while(!0 )
{
uchar j;
LEDCLK=0;
LEDDIN=0;
_nop_();
LEDCLK=1;
read_ds18b20_temp();
Display_ds18b20();
for(j=0;j<8;j++)
{
P0=0XFF;
P0=ledtable[dispbuf[j]];
Delayms(1);
P0=0XFF;
Read_Key();
LEDCLK=0;
LEDDIN=1;
_nop_();
LEDCLK=1;
}
keyscan();
Key_job();
Warning();
}
}。

相关文档
最新文档