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

📄 1110.c

📁 ads1110 16位ad转换c语言程序
💻 C
字号:
#include "reg52.h"
#include "intrins.h"


//----------------ADS1110地址、配置字-----------------// 
#define      ADS1110_WR_ADDRESS   0x92 	         //1001	001 0 写
#define      ADS1110_RD_ADDRESS   0x93 			 //1001	001 1 读

#define      ADS1110_CONFIG_REG   0x8d         //连续转换模式,16bit精度,PGA=1 

#define uchar unsigned char
#define uint unsigned int

sbit  ADS1110_SDA = P1^3;    //模拟I2C数据传输位
sbit  ADS1110_CLK = P1^2;    //模拟I2C时钟控制位


sfr P1M0=0X91;
sfr P1M1=0X92;

bit send_flag;
uchar b;
/*******************************************************************************
*******************
名称:    ads1110Start(void)
功能:     ADS1110 I2C Start
********************************************************************************
******************/
void ads1110Start(void) 
{ 
    ADS1110_SDA=1;
    ADS1110_CLK=1; 
    _nop_();
    _nop_();
    ADS1110_SDA=0;
    _nop_();
    _nop_();
    ADS1110_CLK=0;
}   
/*******************************************************************************
*******************
名称:    ads1110Stop(void)
功能: ADS1110 I2C Stop
********************************************************************************
******************/
void ads1110Stop(void) 
{ 
       ADS1110_SDA=0; 
       _nop_();
    _nop_();
    ADS1110_CLK=0;                // -----------结束I2C总线,即发送I2C结束条件.
    _nop_();
    _nop_(); 
    ADS1110_CLK=1;
    ADS1110_SDA=1;    
}
/*******************************************************************************
*******************
名称:    waitAck(void)
功能:     ADS1110 I2C 等待ack
********************************************************************************
******************/ 
uchar waitAck(void) 
{   
    uchar    data    errtime;

       errtime=40; 
    ADS1110_SDA=1;
    while(ADS1110_SDA)                //-----------等待ADS1100应答
    {
        errtime--;
        if(!errtime)
        {       
            ads1110Stop();
            return 0x00;
        }
    }
    ADS1110_CLK=1;
    _nop_();
    _nop_();  
    _nop_();
    _nop_();
    ADS1110_CLK=0; 

    return 0xff;
}
/*******************************************************************************
*******************
名称:    void sendAck(void)
功能:     向ADS1110 I2C 发送 ack
********************************************************************************
******************/ 
void sendAck(void) 
{     
    ADS1110_SDA=0;
    _nop_();
    _nop_(); 
    _nop_();
    _nop_();
    ADS1110_CLK=1;   
    _nop_();
    _nop_(); 
    _nop_();
    _nop_();
    ADS1110_CLK=0;
}
/*******************************************************************************
*******************
名称:    void sendNotAck(void)
功能:     向ADS1110 I2C 不发送 ack
********************************************************************************
******************/
void sendNotAck(void) 
{  
    ADS1110_SDA=1;
    _nop_();
    _nop_(); 
    _nop_();
    _nop_();
    ADS1110_CLK=1;   
    _nop_();
    _nop_(); 
    _nop_();
    _nop_();
    ADS1110_CLK=0;
}
/*******************************************************************************
*******************
名称:    void ads1110SendByte(BYTE sendData)
功能:     向ADS1110 I2C 发送1个字节
********************************************************************************
******************/  
void ads1110SendByte(uchar sendData) 
{ 
       uchar    data    i;

    ADS1110_CLK=0;
       for( i=0; i<8;i++ )
    {
        if(sendData & 0x80) ADS1110_SDA=1;
        else ADS1110_SDA=0;   
        _nop_();   
        _nop_();
        sendData<<=1;
        ADS1110_CLK=1;             //置时钟线为高,通知被控器开始接收数据位 
        _nop_();   
        _nop_();  
        ADS1110_CLK=0;
    } 
}
/*******************************************************************************
*******************
名称:    uchar ads1110ReceiveByte(void)
功能:     ADS1110 I2C 接收1个字节
********************************************************************************
******************/ 
uchar ads1110ReceiveByte(void) 
{       
    uchar    data    i,receiveData;

    receiveData=0;
    ADS1110_CLK=0; 
    for(i=0;i<8;i++    )
    {
        ADS1110_CLK=1;                 //置时钟线为高使数据线上数据有效
        _nop_();
        _nop_();
        receiveData<<=1;              

        ADS1110_SDA=1;
        if(ADS1110_SDA==1)
            receiveData|=1;        //读数据位,接收的数据位放入ucRet中

        ADS1110_CLK=0;          
        _nop_();
        _nop_();     
    }
    return(receiveData);
} 
/*******************************************************************************
*******************
名称:    void ads1110Config(void)
功能:     对ADS1110进行配置    
********************************************************************************
******************/
void ads1110Config(void) 
{ 
    ads1110Start(); 
    ads1110SendByte(ADS1110_WR_ADDRESS); 
    waitAck(); 
    ads1110SendByte(ADS1110_CONFIG_REG); 
    waitAck(); 
    ads1110Stop(); 
}  
/*******************************************************************************
*******************
名称:    读取ADS1100数据子程序
功能:
********************************************************************************
******************/
uint RD_ADS()
{
    uchar    data    temp00;
	uint   W_B1byte_low,W_B1byte_high,W_B1_word;

		

    ads1110Start();                            //-----------启动I2C总线,即发送I2C起始条件.

    ads1110SendByte(ADS1110_RD_ADDRESS);        //-----------寻址ADS1110(ED0)
    temp00=waitAck();                          //-----------等待ADS1100应答  

    if(temp00)                                 //如果应答正确
    {
        W_B1byte_high=ads1110ReceiveByte();     //-----------读数据 高字节
    
        sendAck();                     //主机应答
                        
        W_B1byte_low=ads1110ReceiveByte();        //-----------读数据 低字节  
        sendAck();                     //主机应答

        temp00=ads1110ReceiveByte();         //读配置字

          sendAck();
//        sendNotAck();                //主机不应答
        ads1110Stop();
    	W_B1_word= (W_B1byte_high<<8)+ W_B1byte_low;
        if(W_B1_word>0x7fff)            //>7fffH表示为负数
        W_B1_word=0;
       
        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;
 ads1110Config();
 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 + -