51学习库(7)--DS18B20温度传感器

这篇博客主要介绍了如何在51单片机中,特别是STC12C5A60S2型号,使用DS18B20温度传感器,并提供了相应的库函数。内容包括对51单片机库的封装方法,以及针对DS18B20传感器的实测应用,确保所有例程在实际开发板上经过验证,适合初学者学习。

学过51单片机的回过头来都会觉得51还是比较简单的,在此我将贴出在我的学习过程中,把对各种外设所进行的操作,封装成函数库的形式,以供新手学习。

注:使用的单片机是stc12c5a60s2,该系列单片机属于加强51,在运行速度上是普通51的8-12倍,有关时序的操作需要加以注意。
注2:使用说明:

unsigned int temp = Ds18b20ReadTemp();    //调用函数,取得测温结果(相对大小)
float num0 = temp*0.0625+0.05;    //使用公式,将结果转化为人看得懂的温度值(实际大小)

申明:本系列全部例程通过单片机开发板,实验亲测有效!

#include "ds18b20.h"
#include <intrins.h>

/**************************************************************
模块名:驱动Ds18b20
模块功能:实现Ds18b20的测温
时间:2017.5.4
备注:可选择调用,关键输出Temp值
***************************************************************/

bit Ds18b20Init()           //Ds18b20初始化
{
    bit ack;

    DQ = 0;                 //产生500us复位脉冲
    delay10us(50);
    DQ = 1;
    delay10us(6);           //延时60us
    ack = DQ;               //读取存在脉冲
    while(!DQ);             //等待存在脉冲结束

    return ack;             //返回0表示成功
}

void Ds18b20WriteByte(unsigned char date)
{
    unsigned char mask;

    for (mask=0x01; mask!=0; mask<<=1)       //低位在先,依次移出8个bit
    {
        DQ = 0;                              //产生2us低电平脉冲
        _nop_();
        _nop_();
        if ((mask&date) == 0)                //输出该bit值
            DQ = 0;
        else
            DQ = 1;
        delay10us(6);                        //延时60us
        DQ = 1;                              //拉高通信引脚
    }
}

unsigned char Ds18b20ReadByte()
{
    unsigned char date, mask;

    for (mask=0x01; mask!=0; mask<<=1)         //低位在先,依次采集8个bit
    {
        DQ = 0;                                //产生2us低电平脉冲
        _nop_();
        _nop_();
        DQ = 1;                                //结束低电平脉冲,等待18B20输出数据
        _nop_();                               //延时2us
        _nop_();
        if (!DQ)                               //读取通信引脚上的值
            date &= ~mask;
        else
            date |= mask;
        delay10us(6);                          //再延时60us
    }

    return date;
}

bit Ds18b20Convert()
{
    bit ack;

    ack = Ds18b20Init();                      //执行总线复位,并获取18B20应答,0正确
    if (ack == 0)                             //如18B20正确应答,则启动一次转换
    {
        Ds18b20WriteByte(0xCC);               //跳过ROM操作
        Ds18b20WriteByte(0x44);               //启动一次温度转换
    }
    return ~ack;                              //ack==0表示操作成功,所以返回值对其取反
}

unsigned int Ds18b20ReadTemp()                       //读取Ds18b20—1温度数值
{
    bit ack;
    unsigned char lsb, msb;                       //16bit温度值的低字节和高字节
    unsigned int temp;

    Ds18b20Convert();
    ack = Ds18b20Init();                     //Ds18b20初始化
    if (ack == 0)                            //如Ds18b20正确应答,则读取温度值
    {
        Ds18b20WriteByte(0xcc);              //跳过检测Rom
        Ds18b20WriteByte(0xbe);              //发送读命令
        lsb = Ds18b20ReadByte();             //读温度值的低字节
        msb = Ds18b20ReadByte();             //读温度值的高字节
        temp = ((unsigned int)msb << 8) + lsb;        //合成为16bit整型数
    }
    return temp; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值