问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

[51单片机]单总线温度采集

创作时间:
作者:
@小白创作中心

[51单片机]单总线温度采集

引用
CSDN
1.
https://blog.csdn.net/star68_/article/details/138004571

一、单总线温度传感器DB18B20

1.简介

单总线(也称1-Wire bus)是由美国DALLAS公司推出的外围串行扩展总线。只有一条数据输入/输出线DQ,总线上所有器件都挂在DQ上,电源也通过这条信号线供给。DS18B20是美国DALLAS公司生产的数字温度传感器,体积小、低功耗、抗干扰能力强。可直接将温度转化成数字信号传送给单片机处理,因而可省去传统的信号放大、A/D转换等外围电路。

2.原理

单总线应用典型案例是采用单总线温度传感器DS18B20的温度测量系统。如图1所示为单片机与多个带有单总线接口的DS18B20组成的分布式温度测量系统,图中多个DS18B20都挂接在单片机的1根I/O口线(即DQ线)上。单片机对每个DS18B20都通过总线DQ寻址。DQ为漏极开路,须加上拉电阻。DS18B20的一种封装形式如图所示。除DS18B20外,在该数字温度传感器系列中还有DS1820、DS18S20、DS1822等其他型号,工作原理与特性基本相同。


图1 单总线构成的分布式温度监测系统

片内有9个字节的高速暂存器RAM单元,9个字节具体分布如下:

第1字节和第2字节是在单片机发给DS18B20温度转换命令发布后,经转换所得的温度值,以两字节补码形式存放其中。一般情况下,用户多使用第1字节和第2字节。单片机通过单总线可读得该数据,读取时低位在前,高位在后。

第3、4字节分别是由软件写入用户报警的上下限值TH和TL。

第5个字节为配置寄存器,可对其更改DS18B20的测温分辨率,高速暂存器的第6、7、8字节未用,为全1。第9字节是前面所有8个字节的CRC码,用来保证正确通信。片内还有1个E2PROM为TH、TL以及配置寄存器的映像。

配置寄存器各位的定义如下:

其中,TM位出厂时已被写入0,用户不能改变;低5位都为1;R1和R0用来设置分辨率。表10-1列出了R1、R0与分辨率和转换时间的关系。用户可通过修改R1、R0位的编码,获得合适的分辨率。

图4 R1、R0与分辨率和转换时间的关系

由图3,DS18B20转换时间与分辨率有关。当设定为9位时,转换时间为93.75ms;设定10位时,转换时间为187.5 ms;当设定11位时,转换时间为375ms;当设定为12位时,转换时间为750ms。图4列出了DS18B20温度转换后所得到的16位转换结果的典型值。


图5 DS18B20温度数据

温度转换的计算:

当DS18B20采集的温度为+125℃时,输出为0x07d0,则:实际温度=(0x07d0)/16=(0×163+7×162+13×161+0×160)/16=125℃

当DS18B20采集的温度为-55℃时,输出为0xfc90,由于是补码,则先将11位数据取反加1得0x0370,注意符号位不变,也不参加运算,则实际温度=(0x0370)/16=(0×163+3×162+7×161+0×160)/16=55℃

注意,负号则需对采集的温度进行判断后,再予以显示。

3.DS18B20的工作时序

工作时序要求严格,延时时间需准确,否则容易出错。

DS18B20的工作时序包括初始化时序、写时序和读时序。

(1)初始化时序,单片机将数据线电平拉低480960µs后释放,等待1560µs,单总线器件即可输出一持续60~240µs的低电平,单片机收到此应答后即可进行操作。

(2)写时序,当单片机将数据线电平从高拉到低时,产生写时序,有写“0”和写“1”两种时序。写时序开始后,DS18B20在15~60µs期间从数据线上采样。如果采样到低电平,则向DS18B20写的是“0”;如果采样到高电平,则向DS18B20写的是“1”。这两个独立时序间至少需拉高总线电平1µs时间。

(3)读时序,当单片机从DS18B20读取数据时,产生读时序。此时单片机将数据线电平从高拉到低使读时序被初始化。如果在此后15µs内,单片机在数据线上采样到低电平,则从DS18B20读的是“0”;如果在此后的15µs内,单片机在数据线上采样到高电平,则从DS18B20读的是“1”。

二、使用51单片机的一个IO口模拟单总线时序与温度传感器DS18B20通信并读取检测的环境温度

1.Proteus仿真

电路图绘制:

c语言代码:

#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit smg1=out^4;
sbit smg2=out^5;
sbit DQ=P3^7;
void delay5(uchar);
void init_ds18b20(void);
uchar readbyte(void);
void writebyte(uchar);
uchar retemp(void);
int main()
{
uchar i,temp;
    delay5(1000);
    while(1)
    {
    temp=retemp();
        for(i=0;i<10;i++)
        {
        out=(temp/10)&0x0f;
            smg1=0;
            smg2=1;
            delay5(1000);
            out=(temp%10)&0x0f;
            smg1=1;
            smg2=0;
            delay5(1000);
        }
    }
    return 0;
}
void delay5(uchar n)
{
do
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    n--;
}
while(n);
}
void init_ds18b20(void)
{
uchar x=0;
    DQ=0;
    delay5(120);
    DQ=1;
    delay5(16);
    delay5(80);
}
uchar readbyte(void)
{
uchar i=0;
    uchar date=0;
    for(i=8;i>0;i--)
    {
    DQ=0;
        delay5(1);
        DQ=1;
        date>>=1;
        if(DQ)
            date|=0x80;
        delay5(11);
    }
    return (date);
}
void writebyte(uchar dat)
{
uchar i=0;
    for(i=8;i>0;i--)
    {
    DQ = 0;
        DQ = dat&0x01;
        delay5(12);
        DQ=1;
        dat >>= 1;
        delay5(5);
    }
}
uchar retemp(void)
{
uchar a,b,tt;
    uint t;
    init_ds18b20();
    writebyte(0xcc);
    writebyte(0x44);
    init_ds18b20();
    writebyte(0xcc);
    writebyte(0xbe);
    a=readbyte();
    b=readbyte();
    t = b;
    t <<= 8;
    t = t|a;
    tt = t * 0.0625;
    return(tt);
}  

运行结果:

改变DS8B0所测温度:

三、总结

通过本次实验了解了单总线温度传感器DB18B20的工作原理及其使用方法。在Proteus中对其进行了仿真,对其应用有了进一步的了解。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号