基于OneWire组件的DS18B20组件


DS18B20.h

#ifndef _DS18B20_H
#define _DS18B20_H

bit DS18B20_start();
bit DS18B20_getTemperature(int16_t * temp);

uint8_t getIntPart(int16_t temp);
uint8_t getDecPart(int16_t temp);
bit getSign(int16_t temp);

#endif // _DS18B20_H


DS18B20.c

#include <reg52.h>
#include "stdint.h"
#include "OneWire.h"
#include "DS18B20.h"

/* 启动一次18B20温度转换,返回值-表示是否启动成功 */
bit DS18B20_start() {
    bit ack;

    ack = OneWire_reset();   //执行总线复位,并获取18B20应答
    //如18B20正确应答,则启动一次转换
    if (ack == 0) {
        OneWire_write(0xCC);  //跳过ROM操作
        OneWire_write(0x44);  //启动一次温度转换
    }
    return ~ack;   //ack==0表示操作成功,所以返回值对其取反
}
/* 读取DS18B20转换的温度值,返回值-表示是否读取成功 */
bit DS18B20_getTemperature(int16_t * temp) { //温度有正负,有符号
    bit ack;
    uint8_t lowByte, highByte; //16bit温度值的低字节和高字节

    ack = OneWire_reset();    //执行总线复位,并获取18B20应答
    //如18B20正确应答,则读取温度值
    if (ack == 0) {
        OneWire_write(0xCC);   //跳过ROM操作
        OneWire_write(0xBE);   //发送读命令
        lowByte = OneWire_read();  //读温度值的低字节
        highByte = OneWire_read();  //读温度值的高字节
        *temp = ((int16_t)highByte << 8) | lowByte;  //合成为16bit有符号整型数
    }
    return ~ack;  //ack==0表示操作应答,所以返回值为其取反值
}

uint8_t getIntPart(int16_t temp) {  //温度是16位有符号数
    if (temp & 0x8000)  //温度是负数
        temp = -temp;   //取绝对值
    temp >>= 4;
    return (uint8_t)temp;
}

uint8_t getDecPart(int16_t temp) {  //精确到十进制的一位小数
    uint8_t lowByte;

    if (temp & 0x8000)  //温度是负数
        temp = -temp;   //取绝对值
    lowByte = temp;     //取低字节
    lowByte &= 0x0F;    //高4位清0
    return (lowByte * 10) >> 4; //乘以10,除以16
}

bit getSign(int16_t temp) {   //温度是16位有符号数
    if (temp & 0x8000)
        return 1;
    else
        return 0;
}

你可能感兴趣的:(基于OneWire组件的DS18B20组件)