找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4847|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

數(shù)字溫度傳感器LM75驅(qū)動(dòng)(可移植)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:75926 發(fā)表于 2015-4-10 17:04 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
/*******************************LM75*******************************/
#define I2C_SDA_HIGH()
#define I2C_SDA_LOW()
#define I2C_SCL_HIGH()
#define I2C_SCL_LOW()
#define I2C_SDA_Read()

I2C 發(fā)送時(shí):SDA每發(fā)送8位數(shù)據(jù) SDA 就要接收一位應(yīng)答位
     接收時(shí):SDA每接收8位數(shù)據(jù) SDA 就要發(fā)送一位應(yīng)答位
static void Delay(void)
{
    //實(shí)現(xiàn)延時(shí)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位數(shù)據(jù)中 MSB位為1表示溫度值為負(fù)數(shù)  //負(fù)數(shù)以補(bǔ)碼表示
  //  D7,D6,D5,D4,D3,D2,D1,LSB 這7位表示溫度值*2
  //  所以溫度的大小為 (Data[0]<<1|(Data[0]>>7))*0.5
    //注意處理MSB位為1的時(shí)候出現(xiàn)負(fù)數(shù)的情況
D7,D6,D5,D4,D3,D2,D1,LSB 要-1 取反才是真實(shí)值
   
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:162134 發(fā)表于 2017-3-16 16:09 | 只看該作者
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表