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

8 篇文章 2 订阅
7 篇文章 1 订阅

 

/*****************************************************************************
FileName : DS18B20.c
Function : DS18B20温度传感器驱动程序
Author   : mike
Email    : hxtiou@163.com	
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;
}

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值