基于AT89S52单片机与DS18B20的温度测量系统.docx

上传人:b****5 文档编号:7339974 上传时间:2023-01-23 格式:DOCX 页数:16 大小:234.89KB
下载 相关 举报
基于AT89S52单片机与DS18B20的温度测量系统.docx_第1页
第1页 / 共16页
基于AT89S52单片机与DS18B20的温度测量系统.docx_第2页
第2页 / 共16页
基于AT89S52单片机与DS18B20的温度测量系统.docx_第3页
第3页 / 共16页
基于AT89S52单片机与DS18B20的温度测量系统.docx_第4页
第4页 / 共16页
基于AT89S52单片机与DS18B20的温度测量系统.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

基于AT89S52单片机与DS18B20的温度测量系统.docx

《基于AT89S52单片机与DS18B20的温度测量系统.docx》由会员分享,可在线阅读,更多相关《基于AT89S52单片机与DS18B20的温度测量系统.docx(16页珍藏版)》请在冰豆网上搜索。

基于AT89S52单片机与DS18B20的温度测量系统.docx

基于AT89S52单片机与DS18B20的温度测量系统

基于AT89S52单片机与DS18B20的

温度测量系统

1.设计目的

(1)掌握DS18B20数字温度传感器的工作原理及使用方法

(2)掌握对DS18B20转换数据进行处理的方法

(3)学习用数码管显示复杂数据的方法

2.设计任务

用AT89S52控制DS18B20,读取数据,并对DS18B20转换后的数据进行处理,最后在数码管上显示DS18B20测出的温度。

要求使用6位数码管显示,最高位为符号位,如果温度值为正,不显示,如果温度为负,则显示负号;第2—4位显示温度值的整数部分,并在第4位数据上显示小数点;第5位显示一位小数,最低位显示摄氏度符号“C”。

(1)基本要求

Ø用AT89C51控制DS18B20,读取数据

Ø对DS18B20转换后的数据进行处理,转换成实际温度值

Ø将符号位,整数值和小数值分别存放在特定的存储单元中.

(2)中级要求

在数码管上显示DS18B20测出的温度,只要求显示出温度值的整数部分及符号位。

(3)高级要求

Ø使用6位数码管显示测得的温度

Ø最高位为符号位,如果温度值为正,不显示,如果温度为负,则显示负号

Ø第2—4位显示温度值的整数部分,并在第4位数据上显示小数点

Ø第5位显示一位小数

Ø最低位显示摄氏度符号“C”

3.设计原理

(1)系统结构图

图4-1基于DS18B20的测温系统结构图

(2)DS18B20数字温度传感器概述

DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。

因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。

DS18B20产品的特点:

Ø只要求一个端口即可实现通信。

Ø在DS18B20中的每个器件上都有独一无二的序列号。

Ø实际应用中不需要外部任何元器件即可实现测温。

Ø测量温度范围在-55。

C到+125。

C之间。

Ø数字温度计的分辨率用户可以从9位到12位选择。

Ø内部有温度上、下限告警设置。

TO-92封装的DS18B20的引脚排列见图4-2,其引脚功能描述见表4-1。

图4-2DS18B20引脚结构图(底视图)

表4-1 DS18B20详细引脚功能描述

序号

名称

引脚功能描述

1

GND

地信号

2

DQ

数据输入/输出引脚。

开漏单总线接口引脚。

当被用着在寄生电源下,也可以向器件提供电源。

3

VDD

可选择的VDD引脚。

当工作于寄生电源时,此引脚必须接地。

(3)DS18B20的内部结构

DS18B20的内部框图如图4-3所示。

64位ROM存储器件独一无二的序列号。

暂存器包含两字节(0和1字节)的温度寄存器,用于存储温度传感器的数字输出。

暂存器还提供一字节的上线警报触发(TH)和下线警报触发(TL)寄存器(2和3字节),和一字节的配置寄存器(4字节),使用者可以通过配置寄存器来设置温度转换的精度。

暂存器的5、6和7字节器件内部保留使用。

第八字节含有循环冗余码(CRC)。

使用寄生电源时,DS18B20不需额外的供电电源;当总线为高电平时,功率由单总线上的上拉电阻通过DQ引脚提供;高电平总线信号同时也向内部电容CPP充电,CPP在总线低电平时为器件供电。

图4-3DS18B20的内部框图

DS18B20加电后,处在空闲状态。

要启动温度测量和模拟到数字的转换,处理器须向其发出ConvertT[44h]命令;转换完后,DS18B20回到空闲状态。

温度数据是以带符号位的16-bit补码存储在温度寄存器中的,如图4-4所示:

图4-4温度寄存器格式

符号位说明温度是正值还是负值,正值时S=0,负值时S=1。

表4-2给出了一些数字输出数据与对应的温度值的例子。

表4-2温度/数据的关系

(4)DS18B20的命令序列

Ø初始化

ØROM命令跟随着需要交换的数据;

Ø功能命令跟随着需要交换的数据。

访问DS18B20必须严格遵守这一命令序列,如果丢失任何一步或序列混乱,DS18B20都不会响应主机(除了SearchROM和AlarmSearch这两个命令,在这两个命令后,主机都必须返回到第一步)。

①初始化:

DS18B20所有的数据交换都由一个初始化序列开始。

由主机发出的复位脉冲和跟在其后的由DS18B20发出的应答脉冲构成。

当DS18B20发出响应主机的应答脉冲时,即向主机表明它已处在总线上并且准备工作。

②ROM命令:

ROM命令通过每个器件64-bit的ROM码,使主机指定某一特定器件(如果有多个器件挂在总线上)与之进行通信。

DS18B20的ROM如表4-3所示,每个ROM命令都是8bit长。

表4-3DS18B20ROM命令

命令

描述

协议

此命令发出后1-Wire

总线上的活动

SEARCHROM

识别总线上挂着的所有DS18B20的ROM码

F0h

所有DS18B20向主机

传送ROM码

READROM

当只有一个DS18B20挂在总线上时,可用此命令来读取ROM码

33h

DS18B20向主机传送ROM码

MATCHROM

主机用ROM码来指定某一DS18B20,只有匹配的DS18B20才会响应

55h

主机向总线传送一个ROM码

SKIPROM

用于指定总线上所有的器件

CCh

ALARMSEARCH

与SEARCHROM命令类似,但只有温度超出警报线的DS18B20才会响应

ECh

超出警报线的DS18B20

向主机传送ROM码

③功能命令:

主机通过功能命令对DS18B20进行读/写Scratchpad存储器,或者启动温度转换。

DS18B20的功能命令如表4-4所示。

表4-4DS18B20功能命令

命令

描述

协议

此命令发出后1-Wire

总线上的活动

温度转换命令

ConvertT

开始温度转换

44h

DS18B20向主机传送转换状态(寄生电源不适用)

存储器命令

ReadScratchpad

读暂存器完整的数据

BEh

DS18B20向主机传送

总共9字节的数据

WriteScratchpad

向暂存器的2、3和4字节写入数据(TH,TL和精度)

4Eh

主机向DS18B20传送

3个字节的数据

CopyScratchpad

将TH,TL和配置寄存器的数据复制到EEPROM

48h

RecallE2

将TH,TL和配置寄存器的数据从EEPROM中调到暂存器中

B8h

DS18B20向主机传送调用状态

ReadPowerSupply

向主机示意电源供电状态

B4h

DS18B20向主机传送供电状态

(5)DS18B20的信号方式

DS18B20采用严格的单总线通信协议,以保证数据的完整性。

该协议定义了几种信号类型:

复位脉冲、应答脉冲、写0、写1、读0和读1。

除了应答脉冲所有这些信号都由主机发出同步信号。

总线上传输的所有数据和命令都是以字节的低位在前。

1初始化序列:

复位脉冲和应答脉冲

在初始化过程中,主机通过拉低单总线至少480µs,以产生复位脉冲(TX)。

然后主机释放总线并进入接收(RX)模式。

当总线被释放后,5kΩ的上拉电阻将单总线拉高。

DS18B20检测到这个上升沿后,延时15µs~60µs,通过拉低总线60µs~240µs产生应答脉冲。

初始化波形如图4-5所示。

图4-5初始化脉冲

②读和写时序

在写时序期间,主机向DS18B20写入数据;而在读时序期间,主机读入来自DS18B20的数据。

在每一个时序,总线只能传输一位数据。

读/写时序如图3-6所示。

✧写时序

存在两种写时序:

“写1”和“写0”。

主机在写1时序向DS18B20写入逻辑1,而在写0时序向DS18B20写入逻辑0。

所有写时序至少需要60µs,且在两次写时序之间至少需要1µs的恢复时间。

两种写时序均以主机拉低总线开始。

产生写1时序:

主机拉低总线后,必须在15µs内释放总线,然后由上拉电阻将总线拉至高电平。

产生写0时序:

主机拉低总线后,必须在整个时序期间保持低电平(至少60µs)。

在写时序开始后的15µs~60µs期间,DS18B20采样总线的状态。

如果总线为高电平,则逻辑1被写入DS18B20;如果总线为低电平,则逻辑0被写入DS18B20。

✧读时序

DS18B20只能在主机发出读时序时才能向主机传送数据。

所以主机在发出读数据命令后,必须马上产生读时序,以便DS18B20能够传送数据。

所有读时序至少60µs,且在两次独立的读时序之间至少需要1µs的恢复时间。

每次读时序由主机发起,拉低总线至少1µs。

在主机发起读时序之后,DS18B20开始在总线上传送1或0。

若DS18B20发送1,则保持总线为高电平;若发送0,则拉低总线。

当传送0时,DS18B20在该时序结束时释放总线,再由上拉电阻将总线拉回空闲高电平状态。

DS18B20发出的数据在读时序下降沿起始后的15µs内有效,因此主机必须在读时序开始后的15µs内释放总线,并且采样总线状态。

 

图4-6DS18B20读/写时序图

DS18B20在使用时,一般都采用单片机来实现数据采集。

只需将DS18B20信号线与单片机1位I/O线相连,且单片机的1位I/O线可挂接多个DS18B20,就可实现单点或多点温度检测。

(6)小数的显示方法

DS18B20转换后的数据有四位二进制小数,精度为0.0625,可连续表示一位十进制小数,因此在数码显示时,只显示1位小数。

在对四位二进制小数进行处理时,可先计算出这四位二进制小数对应的四位十进制小数,然后对这四位十进制小数舍弃后三位,只保留一位。

在编写程序时,可编制一个反映二进制小数与显示码对应关系的表格,根据四位二进制小数的十六种不同情况查找对应的一位十进制小数的段码,具体映射关系如表4-5所示:

 

表4-5二进制小数与显示码的对应关系

二进制小数位

四位十进制小数

保留一位

对应显示码(共阴)

0000

0.0000

0

3FH

0001

0.0625

1

06H

0010

0.1250

1

06H

0011

0.1875

2

5BH

0100

0.2500

3

4FH

0101

0.3125

3

4FH

0110

0.3750

4

66H

0111

0.4375

4

66H

1000

0.5000

5

6DH

1001

0.5625

6

7DH

1010

0.6250

6

7DH

1011

0.6875

7

07H

1100

0.7500

8

7FH

1101

0.8125

8

7FH

1110

0.8750

9

6FH

1111

0.9375

9

6FH

4.程序设计流程

5.C语言程序源代码

/*---------------------------------------------------

名称:

基于AT89S52单片机与DS18B20的温度测量系统

编写:

吴善刚

日期:

2011-07-17

内容:

用AT89S52控制DS18B2,读取数据并在数码管上显示

----------------------------------------------------*/

//包含头文件,程序开始

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P2^4;//18B20数据线引脚

unsignedcharflag;//负数标志

//行扫描数组

ucharcodescan[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//数码管显示的段码表

ucharcodetable[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x39,0x00};

//小数部分显示查询表

ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,

0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

uchardispbuf[8];//显示缓冲区

uchartemper[2];//存放温度的数组

//延时函数

voiddelay(unsignedintus)

{

while(us--);

}

//DS18B20复位函数

voidreset(void)

{

ucharx=0;

DQ=1;

delay(8);

DQ=0;

delay(80);

DQ=1;

delay(14);

x=DQ;

delay(20);

}

//从DS18B20中读一个字节

ucharreadbyte(void)

{

uchari=0;

uchardat=0;

for(i=8;i>0;i--)

{

DQ=0;

dat>>=1;

DQ=1;

if(DQ)

dat|=0x80;

delay(4);

}

return(dat);

}

//向DS18B20中写一个字节

voidwritebyte(unsignedchardat)

{

uchari=0;

for(i=8;i>0;i--)

{

DQ=1;

DQ=dat&0x01;

delay(5);

DQ=1;

dat>>=1;

}

delay(4);

}

//从DS18B20中读取实时温度值

voidreadtemp(void)

{

uchara=0,b=0;

reset();

writebyte(0xCC);//跳过序列号

writebyte(0x44);//启动温度转换

reset();

writebyte(0xCC);

writebyte(0xBE);//读九个寄存器,前两个为温度

a=readbyte();//低位

b=readbyte();//高位

if(b>0x0f)//判断是否为负值

{

a=~a+1;

if(a==0)

b=~b+1;

else

b=~b;

flag=10;

}

else

flag=12;

temper[0]=a&0x0f;

a=a>>4;

temper[1]=b<<4;

temper[1]=temper[1]|a;

}

//动态扫描显示函数

voidscandisp()

{

unsignedchari,value;

for(i=0;i<8;i++)

{

P3=0xff;

value=table[dispbuf[i]];

if(i==3)

value|=0x80;

P0=value;

P3=scan[i];

delay(50);

}

}

//主函数

voidmain()

{

uchartemp,temp1;

while

(1)

{

scandisp();

readtemp();

temp1=temper[0];

temp=temper[1];

dispbuf[4]=ditab[temp1];

dispbuf[1]=temp/100;

dispbuf[3]=temp%10;

temp=temp/10;

dispbuf[2]=temp%10;

dispbuf[0]=flag;

dispbuf[5]=11;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1