DS18B20温度传感器驱动(单线通信)

 

/*****************************************************************************
FileName : DS18B20.c
Function : DS18B20温度传感器驱动程序
Author   : mike
Email    : [email protected]	
Version  : V1.0
Date     : 2019-07-12
Note     :

主控:STC12C5A60S2
*****************************************************************************/
#include "include.h"
#include "DS18B20.h"

sbit DQ = P3^6;	

void delayus(int m)//1T--->STC12C5A60S2
{
    for(;m>0;m--)	
    {
        _nop_();
        _nop_();
    }
}

u8 ds18b20_init(void)//初始化ds18B20
{
    u8 retry = 0;
    DQ = 1;    		//DQ复位
    delayus(8);  	//稍做延时
    DQ = 0;    		//单片机将DQ拉低
    delayus(250); 	//精确延时 大于 480us
    DQ = 1;    		//拉高总线
    delayus(15);
	
    while((!DQ) && (retry++ < 250))
    {
        delayus(2);
    }
    delayus(20);
	
    if(retry >= 250)
        return 1;	//1初始化失败
	
    return 0;	//0初始化成功
}
//******************************************************************************
u8 readonechar(void)//读一字节
{
    u8 i=0;
    u8 dat = 0;
    for (i=8;i>0;i--)
    {
        DQ = 0; // 给脉冲信号
        dat >>= 1;
        DQ = 1; // 给脉冲信号
        if(DQ)
            dat |= 0x80;
        delayus(15);
    }
    return dat;
}

//******************************************************************************
void writeonechar(u8 dat)//写一字节
{
    u8 i = 0;
    for (i = 8;i > 0;i--)
    {
        DQ = 0;
        DQ = dat&0x01;
        delayus(5); //不能延时过久
        DQ = 1;
        dat >>= 1;
    }
}
//******************************************************************************
u16 read_temperature(void)//读取温度
{
    u8 TPL = 0;
    u8 TPH = 0;
    u16 temp = 0;

    u8 retry = 0;	
	
    ds18b20_init();
    writeonechar(0xCC); // 跳过读序号列号的操作
    writeonechar(0x44); // 启动温度转换
	
    //while(!DQ);        //等待转换完成
    while((!DQ) && (retry++ < 250))
    {
        delayus(2);
    }
	
    ds18b20_init();
    writeonechar(0xCC); //跳过读序号列号的操作
    writeonechar(0xBE); //读取温度寄存器
    TPL = readonechar();//读低8位
    TPH = readonechar();//读高8位

    temp = ((u16)TPH << 8) | (u16)TPL;  //高8位和低8位转化为u16 	

//温度在寄存器中为12位,分辨率为0.0625,放大10倍输出并四舍五入
    temp = 	(u16)((float)temp*0.0625*10+0.5);
    return temp;
}

u16 temp_disp(void)//显示温度---消抖计算,使温度更准确
{
    u16 read_dat = 0;

    read_dat = read_temperature();

    //printf("DS18B20读出dat = %d",read_dat);
    //printf("℃\n");

    return read_dat;
}

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章