⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lm75.c

📁 温度传感器LM75测试c语言程序(带串口发送程序)
💻 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 + -