LM75 --温度采集(时序及代码)

一、 LM75A传感器介绍

 

二、寄存器介绍

 

三、时序图 

四、代码


#define LM75A_SCL_GPIO   GPIOB
#define LM75A_SCL_PIN    GPIO_Pin_8
#define LM75A_SDA_GPIO   GPIOB
#define LM75A_SDA_PIN    GPIO_Pin_7

#define LM75A_SCL(value)           GPIO_WRITE_BIT(LM75A_SCL_GPIO, LM75A_SCL_PIN, value);
#define LM75A_SDA(value)           GPIO_WRITE_BIT(LM75A_SDA_GPIO, LM75A_SDA_PIN, value);
#define LM75A_READ_GPIO(value)     {value = GPIO_READ_IDB(LM75A_SDA_GPIO, LM75A_SDA_PIN);}

#define SDA_H LM75A_SDA(1)
#define SDA_L LM75A_SDA(0)
#define SCL_H LM75A_SCL(1)
#define SCL_L LM75A_SCL(0)
#define SDA_read  GPIO_READ_IDB(LM75A_SDA_GPIO, LM75A_SDA_PIN)
#define I2C_delay() LM75A_DELAY
#define I2C_TM_ERR  0
#define I2C_TM_OK  1
#define LM75_ADDRESS 0x94

// 0x00 temperature  0x01 conf  0x00 temperature 0x00 temperature 
#define LM75A_addr                0x94
#define LM75A_REG_TEMPERATUYA     0x00
#define LM75A_REG_CONF            0x01
#define LM75A_REG_THYST           0x02
#define LM75A_REG_TOS             0x03


//1NOP = 1CLOCK = 5.95ns
/*
TP min: 2.5us
TH min: 0.6us
TL min: 1.3us
*/
#define LM75A_DELAY   NOP_1000;//2.975us

void LM75A_MDIO_Out()
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

    //MDIO
    GPIO_InitStructure.GPIO_Pin = LM75A_SDA_PIN;
    GPIO_Init(LM75A_SDA_GPIO, &GPIO_InitStructure);
}

void LM75A_MDIO_In()
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

    //MDIO
    GPIO_InitStructure.GPIO_Pin = LM75A_SDA_PIN;
    GPIO_Init(LM75A_SDA_GPIO, &GPIO_InitStructure);
}

void LM75A_InitGpio()
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

    //MDC
    GPIO_InitStructure.GPIO_Pin = LM75A_SCL_PIN;
    GPIO_Init(LM75A_SCL_GPIO, &GPIO_InitStructure);

    LM75A_MDIO_Out();

    LM75A_SCL(0);
    LM75A_SDA(1);
}

/********************************************************************************
* 使用I2C1读写AT24C256,LM75
*******************************************************************************/


u16 I2C_Start(void)
{
    SDA_H;
    SCL_H;
    I2C_delay();
    SDA_L;
    I2C_delay();
    SCL_L;
    I2C_delay();
    return (I2C_TM_OK);
}

void I2C_Stop(void)
{
    SCL_L;
    I2C_delay();
    SDA_L;
    I2C_delay();
    SCL_H;
    I2C_delay();
    SDA_H;
    I2C_delay();
    SCL_L;
    I2C_delay();
}

void I2C_Ack(void)
{
    SCL_L;
    I2C_delay();
    SDA_L;
    I2C_delay();
    SCL_H;
    I2C_delay();
    SCL_L;
    I2C_delay();
}

void I2C_NoAck(void)
{        
    SCL_L;
    I2C_delay();
    SDA_H;
    I2C_delay();
    SCL_H;
    I2C_delay();
    SCL_L;
    I2C_delay();
}

u16 I2C_WaitAck(void)        //返回为:=1有ACK,=0无ACK
{
    SCL_L;
    I2C_delay();
    SCL_H;
    LM75A_MDIO_In();
    I2C_delay();
    if(SDA_read)
    {
        SCL_L;
        return(I2C_TM_ERR);
    }
    SCL_L;
    LM75A_MDIO_Out();
    return(I2C_TM_OK);
}

void I2C_SendByte(u8 SendByte)        //数据从高位到低位//
{
    u8 i=8;
    while(i--)
    {
        SCL_L;
        I2C_delay();
        if(SendByte&0x80)
        {
            SDA_H;
        }
        else
        {
            SDA_L;
        }
        SendByte<<=1;
        I2C_delay();
        SCL_H;
        I2C_delay();
    }
    SCL_L;
  
}

u8 I2C_ReceiveByte(void)        //数据从高位到低位//
{ 
    u8 i=8;
    u8 ReceiveByte=0;

    SDA_H;
    while(i--)
    {
        ReceiveByte<<=1;
        SCL_L;
        I2C_delay();
        SCL_H;
        I2C_delay();
        if(SDA_read)
        {
            ReceiveByte|=0x01;
        }
    }
    SCL_L;
    return ReceiveByte;
}


/*******************************************************************************
* Function Name  : I2C_LM75_Read
* Description    : Reads Temperature data from the LM75.
* Input          : None
* Output         : 0xFFFF -- Error
*                                        0x0000 ~ 0x01FF -- Valid data
*                                        Temp        Binary                                         Hex
*                                        +125        0111 1101 0xxx xxxx         0FAh
*                                        +25                0001 1001 0xxx xxxx         032h
*                                        +0.5        0000 0000 1xxx xxxx         001h
*                                        0                0000 0000 0xxx xxxx                000h
*                                        -0.5        1111 1111 1xxx xxxx         1FFh
*                                        -25                1110 0111 0xxx xxxx         1CEh
*                                        -55                1100 1001 0xxx xxxx         192h
* Return         : None
*******************************************************************************/
float I2C_LM75_Read(void)
{
    float temp;
    vu16 TempH,TempL;
    if(I2C_Start()==I2C_TM_ERR)return(I2C_TM_ERR);
    I2C_SendByte(LM75_ADDRESS);                         //器件地址
    if(I2C_WaitAck()==I2C_TM_ERR){I2C_Stop(); return(I2C_TM_ERR);}
    I2C_SendByte(0x00); 
    //设置温度寄存器地址
    if(I2C_Start()==I2C_TM_ERR)return(I2C_TM_ERR);
    I2C_SendByte(LM75_ADDRESS | 0x01);               //设置器件地址 
    if(I2C_WaitAck()==I2C_TM_ERR){I2C_Stop(); return(I2C_TM_ERR);}
    LM75A_MDIO_In();
    TempH = I2C_ReceiveByte();
    I2C_Ack();
    TempL = I2C_ReceiveByte();
    I2C_NoAck();
    LM75A_MDIO_Out();
    I2C_Stop();

    temp=TempH+(TempL>>5)*0.125;

    
    return(temp);
}

 

  • 12
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值