/*******************************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 取反才是真實值
}
|