这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 学习AI8051开发板例程:22AI8051的实现单线制DS18B2温度

共2条 1/1 1 跳转至

学习AI8051开发板例程:22AI8051的实现单线制DS18B2温度

高工
2026-02-04 18:41:45   被打赏 50 分(兑奖)     打赏

一:DS18B20介绍:

    DS18B20数字温度计提供9到12bit分辨率的温度测量,可以通过可编程非易失性存储单元实现温度的下限和上限报警。DS18B20采用单总线协议与上位机进行通信,只需要一根信号线和一根地线。它的温度测量范围为-55'C~+125'C(-67°Fto +257°F)。在-10°C~70°C范围内的测试精度可以达到土0.4°C。此外它还可以工作在寄生模式下,直接通过信号线对芯片供电,从而不需要额外的供电电源。

    每个DS18B20都有一个全球唯一的64位序列号,可以将多个DS18B20串联在同一跟单总线上进行组网,只需要一个处理器就可以控制分布在大面积区域中的多颗DS18B20。这种组网方式特别适合HVAC环境控制,建筑、设备、粮情测温和工业测温以及过程监测控制等应用领域。

二:基本性能

    采用单总线接口仅需一个端口引脚进行通信

    每颗芯片具有全球唯一的64位的序列号

    具有多点分布式测温功能无需外围元器件可通过数据线供电;

    供电电压范围为2.5V~5.5V

    测度测量范围为-55°Cto+125°C(-67°Fto+257°F)

    在-10°C~70°C范围内精确度为+0.4°C温度

    分辨率9-12位可选

    最高12位精度下,温度转换速度小于750ms具有

    用户自定义的非易失性温度报警设置

    报警搜索命令识别并标识超过程序设定温度的器件

    超强静电保护能力:HBM8000VMM800V

    可提供3脚的TO-92封装

三:AI8051的单线控制器

     单片机内部集成了一个单总线控制器。单总线控制器支持对WS2812、DS18B20、DHT11等器件的控制,并支持通用红外发送接收模式。单总线支持直接寄存器读写数据,也支持DMA方式读写数据。

DS18B20的内部寄存器

    复位信号长度:{OWCFG1,OWCFG2}

    时间隙长度:OWCFG3

    恢复时间长度:OWCFG4

    读写起始信号长度:OWCFG5

    读数据有效长度:OWCFG6

    存在检测高电平长度:OWCFG7

    存在检测低电平长度:OWCFG8

四:软件代码:

4.1 复位DS18B20

/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset()
{
    CY = 1;
    while (CY)
    {
        DQ = 0;                     //送出低电平复位信号
        delay_us(240);              //延时至少480us
        delay_us(240);
        DQ = 1;                     //释放数据线
        delay_us(60);               //等待60us
        CY = DQ;                    //检测存在脉冲
        delay_us(240);              //等待设备释放数据线
        delay_us(180);
    }
}

4.2 DS18B20 读取字节

u8 DS18B20_ReadByte()
{
    u8 i;
    u8 dat = 0;

    for (i=0; i<8; i++)             //8位计数器
    {
        dat >>= 1;
        DQ = 0;                     //开始时间片
        delay_us(1);                //延时等待
        DQ = 1;                     //准备接收
        delay_us(1);                //接收延时
        if (DQ) dat |= 0x80;        //读取数据
        delay_us(60);               //等待时间片结束
    }

    return dat;
}

4.3 DS18B20写入一个字节

/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(u8 dat)
{
    char i;

    for (i=0; i<8; i++)             //8位计数器
    {
        DQ = 0;                     //开始时间片
        delay_us(1);                //延时等待
        dat >>= 1;                  //送出数据
        DQ = CY;
        delay_us(60);               //等待时间片结束
        DQ = 1;                     //恢复数据线
        delay_us(1);                //恢复延时
    }
}

4.4 : 读取DS18B20的数据函数如下所示:

u16 ReadTemperature()
{
    u16 TempH, TempL, Temperature;
    
    DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0x44);        //开始转换命令
    while (!DQ);                    //等待转换完成

    DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0xBE);        //读暂存存储器命令
    TempL = DS18B20_ReadByte();     //读温度低字节
    TempH = DS18B20_ReadByte();     //读温度高字节
    
    if(TempH & 0xf8)    //判断是否位负数
    {
        MinusFlag = 1;  //设置负数标志
        Temperature = (TempH<<8) | TempL;
        Temperature = ~Temperature + 1;
        Temperature *= 0.625;       //0.0625 * 10,保留1位小数点
    }
    else
    {
        MinusFlag = 0;  //清除负数标志
        Temperature = (((TempH<<8) | TempL) * 0.625); //0.0625 * 10,保留1位小数点
    }

    return Temperature;
}

五:实物测试如下:

ai22-1.png

同时将采集到的数据通过串口将数据发出至PC端:

ai22-2.png




关键词: AI8051     DS18B2     温度    

院士
2026-02-05 18:01:51     打赏
2楼

还是尽量少使用这种阻塞式的实现方式。

还是尝试一下中断,外设,至少也是状态机的方式


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]