51单片机使用DS18B20

#include <REG52.H>
#include <MYLIB.H>

sbit DQ = P3^7; //定义DQ引脚

//初始化DS18B20
uchar DS18B20_inint()
{
    uchar i = 0;

    DQ = 0;
    delay_10us(50);
    DQ = 1;
    while (DQ)
    {
        delay_10us(1);
        i++;
        if(i>5)
            return 0;
    }
    return 1;
}
//向DS18B20写入一个字节
void DS18B20_write_byte(uchar date)
{
    uchar i;

    for (i = 0; i < 8; i++)
    {
        DQ = 0;
        DQ = date&0x01;
        delay_10us(6);
        DQ = 1;
        date >>= 1;
    }
}
//在DS18B20读取一个字节
uchar DS18B20_read_byte()
{
    uchar i,value;

    for (i = 0; i < 8; i++)
    {
        DQ = 0;
        value >>= 1;
        DQ = 1;
        //delay_10us(1);
        if(DQ)
            value |= 0x80;
        delay_10us(6);
    }
    return value;
}
//DS18B20获取温度总函数
uint read_temperature()
{
    uchar a,b;
    uint temp = 0;

    DS18B20_inint();
    delay_ms(1);
    DS18B20_write_byte(0xcc);       //跳过ROM操作
    DS18B20_write_byte(0x44);       //启动温度测量

    delay_10us(300);

    DS18B20_inint();
    delay_ms(1);
    DS18B20_write_byte(0xcc);       //跳过ROM操作
    DS18B20_write_byte(0xbe);       //发送读取温度命令

    a = DS18B20_read_byte();        //读取低八位
    b = DS18B20_read_byte();        //读取高八位

    temp = b;
    temp <<=8;

    temp |= a;

    return temp;
}

/* 调用示例 */

//实验现象:前四个数码管显示当前的温度,保留两位小数,四舍五入。


uchar display_temp[10];
void display_smg()
{
    uchar i;
    for (i = 1; i <= 4; i++)
    {
        LSA = LSA_NODE1[i];
        LSB = LSB_NODE1[i];
        LSC = LSC_NODE1[i];
        P0 = SMG[display_temp[i]];
        if (i==2)
        {
            P0 = SMG[display_temp[i]]|0x80;   //加一个小数点
        }
        delay_10us(50);
        P0 = 0x00;
    }
}

void main()
{
    uint temp; //注意要使用unit类型,防止溢出
    
    while(1)
    {
        temp = read_temperature() *0.0625*100 + 0.5; 
		//乘以0.0625将16进制数转换为10进制数
		//乘以100保留两位小数
		//加0.5,四舍五入
        display_temp[1] = temp/1000;
        display_temp[2] = temp%1000/100;
        display_temp[3] = temp%100/10;
        display_temp[4] = temp%10;

        display_smg();
    }
}

可能会出现的问题提示

显示15.96------------------------没有正确处理高八位,返回值溢出
显示不正确----------------------初始化错误,温度值溢出

猜你喜欢

转载自blog.csdn.net/qq_39592312/article/details/107327039