【蓝桥杯单片机11】单总线温度传感器DS18B20的基本操作

【蓝桥杯单片机11】单总线温度传感器DS18B20的基本操作

广东职业技术学院 欧浩源

    单总线数字温度传感器DS18B20几乎成了各类单片机甚至ARM实验板的标配模块来,在蓝桥杯的往届省赛和国赛中,这个内容考查的频率也相当的高。不管是单片机学习还是蓝桥杯备赛,都应掌握DS18B20的基本操作,也就是把传感器的数据读出来。

1、关于DS18B20你应该知道
    在蓝桥杯“单片机设计与开发”赛项中,会提供一个关于DS18B20的库文件,里面有传感器复位写字节读字节三个函数。所以,你不一定要把单总线的时序搞清楚,但你一定要把DS18B20的基本操作流程弄明白。
    DS18B20单线通信功能是分时完成的,它有严格的时隙概念,如果出现序列混乱,器件将不响应主机,因此读写时序很重要。
    通过单线总线端口访问DS18B20的协议如下:
    步骤1: 复位初始化
    步骤2: ROM操作指令
    步骤3: DS18B20功能指令
    DS18B20的高速暂存存储器由9个字节组成,当温度转换命令发布后,经转换所得的温度以二字节补码形式存放在高速暂存存储器的第0和第1个字节。在上电状态下,DS18B20默认的精度为12位。启动后它保持低功耗等待状态。当需要执行温度测量和AD转换时,总线控制器必须发出温度转换命令。在那之后,产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中,DS18B20继续保持等待状态。单片机可通过单线接口可以读到该数据,读取时低位在前,高位在后

2、三个重要的DS18B20指令
    <1> CCH:跳过ROM指令,忽略64位ROM地址,直接向DS18B20发起各种温度转换指令。
    <2> 44H:温度转换指令,启动DS18B20进行温度转换,转换时间最长为500ms(典型值为200ms),结果保存在高速RAM中。
    <3> BEH:读暂存器指令,读取高速暂存存储器9个字节的内容。

3、读取一次DS18B20温度的基本操作
    <1> 主机对DS18B20进行复位初始化。
    <2> 主机向DS18B20写0xCC命令,跳过ROM。
    <3> 主机向DS18B20写0x44命令,开始进行温度转换。
    <4> 主机对DS18B20进行复位初始化。
    <5> 主机向DS18B20写0xCC命令,跳过ROM。
    <6> 主机向DS18B20写0xBE命令,依次读取DS18B20发出的从第0一第8,共九个字节的数据。如果只想读取温度数据,那在读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可。
    具体的代码实现,可以参考一下框架:

4、单元实训题目

    注意:如果你利用大赛提供的DS18B20的库文件,也就是onewire.c和onewire.h,进行程序设计的时候,没能正确的读出温度传感器的数值,对库文件中代码的时序进行适当的调整即可,本人就是对原有库文件中的延时加大了10倍才正确读出数据。至于怎么调整,调整多少,要实际调试。

5、实现源码参考

#include "reg52.h"  
#include "onewire.h"

sbit HC138_A = P2^5;        
sbit HC138_B = P2^6;        
sbit HC138_C = P2^7;        

sbit S5 = P3^2;        
sbit S4 = P3^3;        

unsigned char code SMG_NoDot[18] = 
    {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};
unsigned char code SMG_IsDot[10] = 
    {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
     0x00,0x10};

unsigned int temp = 0;
                 
void DelaySMG(unsigned int time)
{
        while(time--);
}

void Init74HC138(unsigned char n)
{
        switch(n)
        {
                case 4:
                        HC138_A = 0;
                        HC138_B = 0;
                        HC138_C = 1;
                        break;
                case 5:
                        HC138_A = 1;
                        HC138_B = 0;
                        HC138_C = 1;
                        break;
                case 6:
                        HC138_A = 0;
                        HC138_B = 1;
                        HC138_C = 1;
                        break;
                case 7:
                        HC138_A = 1;
                        HC138_B = 1;
                        HC138_C = 1;
                        break;
                case 8:
                        HC138_A = 0;
                        HC138_B = 0;
                        HC138_C = 0;
                        break;
        }
}

void DispaySMG_Bit(unsigned char value, unsigned char pos)
{
        Init74HC138(6);
        P0 = (0x01 << pos);
        Init74HC138(7);
        P0 = value;
}

void ReadTemperature()
{
        unsigned char LSB,MSB ;
        
        Init_DS18B20(); 
        Write_DS18B20(0xCC); 
        Write_DS18B20(0x44); 
        Init_DS18B20(); 
        Write_DS18B20(0xCC); 
        Write_DS18B20(0xBE); 
        LSB = Read_DS18B20(); 
        MSB = Read_DS18B20(); 
        
        temp = 0x0000;
        temp = MSB;
        temp <<= 8;
        temp = temp | LSB;
        temp >>= 4;
        temp = temp*10;
        temp = temp + (LSB&0x0f)*0.625;
        
        if((MSB>>4) == 0x0f)
        {
                temp |= 0x8000;
        }
}

void ShowTemperature()
{
        DispaySMG_Bit(SMG_NoDot[temp%10],7);
        DelaySMG(500);
        DispaySMG_Bit(0xff,0);
        DispaySMG_Bit(SMG_IsDot[(temp/10)%10],6);
        DelaySMG(500);
        DispaySMG_Bit(0xff,0);
        DispaySMG_Bit(SMG_NoDot[(temp/100)%10],5);
        DelaySMG(500);
        DispaySMG_Bit(0xff,0);
}

void main()
{
        while(1)
        {
                ReadTemperature();
                ShowTemperature();
        }
}

猜你喜欢

转载自www.cnblogs.com/ALittleBee/p/9427165.html