📄 lm75.c
字号:
#include "reg52.h"
#include "intrins.h"
//----------------lm75地址、配置字-----------------//
#define lm75_WR_ADDRESS 0x90 //1001 000 0 写
#define lm75_RD_ADDRESS 0x91 //1001 000 1 读
#define lm75_POINT 0x00 //指针寄存器选择 TEMP
#define uchar unsigned char
#define uint unsigned int
sbit lm75_SDA = P1^3; //模拟I2C数据传输位
sbit lm75_CLK = P1^2; //模拟I2C时钟控制位
sfr P1M0=0X91;
sfr P1M1=0X92;
bit send_flag;
uchar b;
/*******************************************************************************
*******************
名称: LM75Start(void)
功能: LM75 I2C Start
********************************************************************************
******************/
void lm75Start(void)
{
lm75_SDA=1;
lm75_CLK=1;
_nop_();
_nop_();
lm75_SDA=0;
_nop_();
_nop_();
lm75_CLK=0;
}
/*******************************************************************************
*******************
名称: LM75Stop(void)
功能: LM75 I2C Stop
********************************************************************************
******************/
void lm75Stop(void)
{
lm75_SDA=0;
_nop_();
_nop_();
lm75_CLK=0; // -----------结束I2C总线,即发送I2C结束条件.
_nop_();
_nop_();
lm75_CLK=1;
lm75_SDA=1;
}
/*******************************************************************************
*******************
名称: waitAck(void)
功能: LM75 I2C 等待ack
********************************************************************************
******************/
uchar waitAck(void)
{
uchar data errtime;
errtime=40;
lm75_SDA=1;
while(lm75_SDA) //-----------等待ADS1100应答
{
errtime--;
if(!errtime)
{
lm75Stop();
return 0x00;
}
}
lm75_CLK=1;
_nop_();
_nop_();
_nop_();
_nop_();
lm75_CLK=0;
return 0xff;
}
/*******************************************************************************
*******************
名称: void sendAck(void)
功能: 向LM75 I2C 发送 ack
********************************************************************************
******************/
void sendAck(void)
{
lm75_SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
lm75_CLK=1;
_nop_();
_nop_();
_nop_();
_nop_();
lm75_CLK=0;
}
/*******************************************************************************
*******************
名称: void sendNotAck(void)
功能: 向LM75 I2C 不发送 ack
********************************************************************************
******************/
void sendNotAck(void)
{
lm75_SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
lm75_CLK=1;
_nop_();
_nop_();
_nop_();
_nop_();
lm75_CLK=0;
}
/*******************************************************************************
*******************
名称: void ads1110SendByte(BYTE sendData)
功能: 向LM75 I2C 发送1个字节
********************************************************************************
******************/
void lm75SendByte(uchar sendData)
{
uchar data i;
lm75_CLK=0;
for( i=0; i<8;i++ )
{
if(sendData & 0x80) lm75_SDA=1;
else lm75_SDA=0;
_nop_();
_nop_();
sendData<<=1;
lm75_CLK=1; //置时钟线为高,通知被控器开始接收数据位
_nop_();
_nop_();
lm75_CLK=0;
}
}
/*******************************************************************************
*******************
名称: uchar ads1110ReceiveByte(void)
功能: LM75 I2C 接收1个字节
********************************************************************************
******************/
uchar lm75ReceiveByte(void)
{
uchar data i,receiveData;
receiveData=0;
lm75_CLK=0;
for(i=0;i<8;i++ )
{
lm75_CLK=1; //置时钟线为高使数据线上数据有效
_nop_();
_nop_();
receiveData<<=1;
lm75_SDA=1;
if(lm75_SDA==1)
receiveData|=1; //读数据位,接收的数据位放入ucRet中
lm75_CLK=0;
_nop_();
_nop_();
}
return(receiveData);
}
/*******************************************************************************
*******************
名称: void ads1110Config(void)
功能: 对LM75进行配置
********************************************************************************
******************/
void lm75Config(void)
{
lm75Start();
lm75SendByte(lm75_WR_ADDRESS);
waitAck();
lm75SendByte(lm75_POINT);
waitAck();
lm75Stop();
}
/*******************************************************************************
*******************
名称: 读取LM75数据子程序
功能:
********************************************************************************
******************/
uint RD_ADS()
{
uchar data temp00;
uint W_B1byte_low,W_B1byte_high,W_B1_word;
lm75Start(); //-----------启动I2C总线,即发送I2C起始条件.
lm75SendByte(lm75_RD_ADDRESS); //-----------寻址ADS1110(ED0)
temp00=waitAck(); //-----------等待ADS1100应答
if(temp00) //如果应答正确
{
W_B1byte_high=lm75ReceiveByte(); //-----------读数据 高字节
sendAck(); //主机应答
W_B1byte_low=lm75ReceiveByte(); //-----------读数据 低字节
sendAck(); //主机应答
temp00=lm75ReceiveByte(); //读配置字
sendAck();
// sendNotAck(); //主机不应答
lm75Stop();
//W_B1_word= (W_B1byte_high<<8)+ W_B1byte_low;
//if(W_B1_word>0xfa) //
//W_B1_word=0;
W_B1_word= W_B1byte_high;
return W_B1_word;
}
else return 0x0000;
}
/*******************************************************************************
*******************
名称: 串口发送子程序
功能:
********************************************************************************
******************/
/*void T0_initial(void)
{
TMOD=0x01;
TR0=0;
TH0=0x15;
TL0=0xa0;
TR0=1;//启动定时器/计数器0
ET0=1;//允许定时器中断
EA=1;//开中断
}
//************定时器T0中断程序******************
void clock_T0()interrupt 1 using 2
{
TR0=0;
TH0=0x15;
TL0=0xa0;
b++;
if(b>200)
{
send_flag=1;
if(b>205)
{b=0;}
}
TR0=1;
} */
void delay(void)
{
unsigned char m,n;
for(m=5000;m>0;m--)
for(n=1000;n>0;n--);
}
void sendbyte(uint one_byte)
{
TI=0;
SBUF=one_byte;
while (TI==0);
TI=0;
}
void init_uart(void)
{
ES=0;
TMOD=0x21; //定时器1,内部RC
SCON=0x50; //串口方式1,波特率4800
TH1=0xfd;
TL1=0xfd;
TR1=1;
ES=1;
}
main()
{
uint result;
unsigned char res[5];
P1M0=0;
P1M1=0;
lm75Config();
init_uart();
//T0_initial();
while(1)
{
result=RD_ADS();
res[0]=result/10000+0x30;
res[1]=(result%10000)/1000+0x30;
res[2]=(result%1000)/100+0x30;
res[3]=(result%100)/10+0x30;
res[4]=result%10+0x30;
sendbyte(res[0]);
delay();
delay();
delay();
sendbyte(res[1]);
delay();
delay();
delay();
sendbyte(res[2]);
delay();
delay();
delay();
sendbyte(res[3]);
delay();
delay();
delay();
sendbyte(res[4]);
delay();
delay();
sendbyte(0xaa);
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -