找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4936|回复: 1
收起左侧

数字温度传感器LM75驱动(可移植)

[复制链接]
ID:75926 发表于 2015-4-10 17:04 | 显示全部楼层 |阅读模式
/*******************************LM75*******************************/
#define I2C_SDA_HIGH()
#define I2C_SDA_LOW()
#define I2C_SCL_HIGH()
#define I2C_SCL_LOW()
#define I2C_SDA_Read()

I2C 发送时:SDA每发送8位数据 SDA 就要接收一位应答位
     接收时:SDA每接收8位数据 SDA 就要发送一位应答位
static void Delay(void)
{
    //实现延时4us
}
static void I2C_Start(void)
{
    I2C_SDA_HIGH();
    I2C_SCL_HIGH();
    Delay();
    I2C_SDA_LOW();
    Delay();
    I2C_SCL_LOW();
    Delay();
}

static void I2C_Stop(void)
{
    I2C_SDA_LOW();
    I2C_SCL_HIGH();
    Delay();
    I2C_SDA_HIGH();
    Delay();
}

void I2C_SendByte(uint8_t Byte)
{
    uint8_t Cnt;
    for(Cnt=0;Cnt<8;Cnt++)
    {
        if(Byte&0x80)
           I2C_SDA_HIGH();
        else
           I2C_SDA_LOW();
        Delay();
        Byte<<=1;
        I2C_SCL_HIGH();
        Delay();
        I2C_SCL_LOW();
        Delay();
    }
}

uint8_t I2C_ReceiveByte(void)
{
    uint8_t Byte=0,Cnt;
    for(Cnt=0;Cnt<8;Cnt++)
    {
        Byte<<=1;
        I2C_SDA_HIGH():
        Delay();
        I2C_SCL_HIGH();
        Delay();
        if(I2C_SDA_Read())
            Byte++;
        I2C_SCL_LOW();
        Delay();
    }
    return Byte;
}
static uint8_t I2C_WaitAck(void)//0:Ack  1:NoAck
{
    I2C_SDA_HIGH();
    Delay();
    I2C_SCL_HIGH();
    Delay();
    if(I2C_SDA_Read())
        return 1;
    I2C_SCL_LOW();
    Delay();
    return 0;
}

static void I2C_SendAck(void)
{
    I2C_SDA_LOW();
    Delay();
    I2C_SCL_HIGH();
    Delay();
    I2C_SCL_LOW();
    Delay();
}

static void I2C_SendNoAck(void)
{
    I2C_SDA_HIGH();
    Delay():
    I2C_SCL_HIGH();
    Delay();
    I2C_SCL_LOW();   
    Delay();
}
/****************LM75***********************/

static uint8_t LM75_SendByte(uint8_t Address,uint8_t Byte)//0 :成功  1:失败
{
    I2C_Start();
    I2C_SendByte(Address);
    if(I2C_WaitAck())
        return 1;
    I2C_SendByte(Byte);
    if(I2C_WaitAck())
        return 1;
    I2C_Stop();
    return 0;
}

static uint8_t LM75_ReviceByte(uint8_t Address,uint8_t *pByte)
{
    I2C_Start();
    I2C_SendByte(Address);
    if(I2C_WaitAck())
        return 1;
    I2C_Start();
    *Byte=I2C_ReceiveByte();
    I2C_SendAck():
    *(Byte+1)=I2C_ReceiveByte();
    I2C_SendNoAck();
    I2C_Stop();
}


int main(void)
{
    uint8_t Data[2];
    I2C_Init()//初始化  代码未给出
    LM75_SendByte(Address,0x00);
    LM75_SendByte(Address,Data);
  /*  MSB,D7,D6,D5,D4,D3,D2,D1,LSB ,x,x,x,x,x,x*/
  //  这16位数据中 MSB位为1表示温度值为负数  //负数以补码表示
  //  D7,D6,D5,D4,D3,D2,D1,LSB 这7位表示温度值*2
  //  所以温度的大小为 (Data[0]<<1|(Data[0]>>7))*0.5
    //注意处理MSB位为1的时候出现负数的情况
D7,D6,D5,D4,D3,D2,D1,LSB 要-1 取反才是真实值
   
}



回复

使用道具 举报

ID:162134 发表于 2017-3-16 16:09 | 显示全部楼层
学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表