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

📄 ads1110.c~

📁 i2c操作ads1110
💻 C~
字号:
/*
file name:ads1110.c
head file:ads1110.h  delay.h
说明:
chip:mega16L
编译器:CodeVisionAVR C Compiler
在ADS1100测试通过
i2c程序包包括:
             void     io_dir(uchar dir);
             void     ads1100_start(void);                                       i2c start 
             void     ads1100_stop(void);                                        i2c stop
             uchar    ackby_ads1100(void);                                       ads1100应答
             void     ackby_master(void);                                        主机应答
             void     send_frame(uchar framedata);                               send 8bit to ads1100
             uchar    read_frame(void);                                          read bbit from 
其他函数为ADS1100用
其中引脚定义在ads1110.h定义,请更改引脚
编写日期:2006.04.27
作    者:吴青松
注:只供学习,不能商用
*/
#include <ads1110.h>     //
#include <delay.h>       //延时函数用,此为CodeVisionAVR C Compiler自带,其他编译器中的延时                         //则需要自己编写
/*====================================================================================
函数功能:改变I/O数据线的方向
如果是其他类型单片机,此处需要更改
======================================================================================*/
void     io_dir(uchar dir)
{                 
   out_data=1;
   if(dir==IN)
   {
      io_data=0;  
   }
   if(dir==OUT)
   {
      io_data=1;  
   }
}
/*
////////////////////////////////////////////////////////////////////////////////////////////
函数功能:I2C起动,注意起动前,保证scl=1,data=1,data =>out(i/o输出)
A start condition is when the clock line is HIGH and the data line goes from HIGH to LOW. 
当时钟线为高电平时,数据线从1->0,形成一个开始条件
编写日期:2006.04.27
作    者:吴青松
////////////////////////////////////////////////////////////////////////////////////////////
*/
void     ads1100_start(void)
{  
 //inital:scl=1,data=1,data =>out
 //data line putout      get bus 
    
 out_data=0;     //=0
 delay_us(5);
 scl=0;         //insure scl=0
 delay_us(5);
 
 //finally :scl=0,data=0,data =>out
} 
/*
////////////////////////////////////////////////////////////////////////////////////////////
函数功能:I2C停止
A stop condition is when the clock line is HIGH and the data line goes from LOW to HIGH.
当时钟线为高电平时,数据线从0->1,形成一个开始条件
编写日期:2006.04.27
作    者:吴青松
////////////////////////////////////////////////////////////////////////////////////////////
*/
void     ads1100_stop(void)
{            
  //initial:scl=0 data no confire
    
  //data line putout  get bus :data=0 =>out
  io_dir(OUT);
  delay_us(10);
  out_data=0;
  delay_us(10);
        
  // scl=1 data=0=>data=1
  scl=1;
  delay_us(10);     
  out_data=1;
  delay_us(10);  
  //finallay:scl=1,data=1,data =>out
} 
/*
////////////////////////////////////////////////////////////////////////////////////////////函数功能:i2c从器件(ads1100) 应答
参数说明:当i2c器件响应 返回1,否则返回0
编写日期:2006.04.27
作    者:吴青松
////////////////////////////////////////////////////////////////////////////////////////////
*/
uchar    ackby_ads1100(void)
{                        
 unsigned char times=0;
 //start:scl=0 data=>out 
 //give up bus     setup data in     

 io_dir(IN);     
 delay_us(5);  //wait for ads1100 ready data           
 
 //wait ads1100 ack
 scl=1;  
 while((in_data==1)&&(times<100))           //wait for ads ack   data=0 
 {
    times++;
 }
 
 scl=0;                  //ready for next 
 delay_us(5);                             
 //fianlly:scl=0;data <in     
 if(times>90)
 {
    return 0;
 }           
 else
 {
    return 1;
 }
} 
/*
////////////////////////////////////////////////////////////////////////////////////////////函数功能:主机应答
编写日期:2006.04.27
作    者:吴青松
////////////////////////////////////////////////////////////////////////////////////////////
*/   
void     ackby_master(void)
{ 
 //start:scl=0 
 //get bus
 io_dir(OUT);
 
 //ready ack data
 out_data=0;
 delay_us(5);  //ready data
 
 scl=1;         //wait for ads1100 receive 
 delay_us(10);              
 
 scl=0;     //ready for next
 delay_us(5);      
 //fianlly:scl=0,data >out
}      

/*========================================================================================
函数功能:向I2C从器件发送一帧(8bit)
编写日期:2006.04.27
作    者:吴青松
=========================================================================================*/
void     send_frame(uchar framedata)
{
 unsigned char i;   
 
 //initial:scl=0  
 //get bus
 io_dir(OUT);
 delay_us(10);
  
  for(i=0;i<8;i++)
  {  
     scl=0;             //read for next  scl=0      
     if(  ( (framedata << i) & 0x80) ==0 )
     {
         out_data=0;
     }             
     else
     {
         out_data=1;
     }      
     delay_us(5);     //稳定数据
     
     scl=1;           //suo shuju
     delay_us(5);     //wait for ads1100  receive data             
  }                                                   
  scl=0;             //read for next  scl=0
//finally:scl=0,data getbus   
}  
/*=============================================================== 
函数功能:向I2C从器件读取一帧(8bit)
编写日期:2006.04.27
作    者:吴青松
===============================================================*/
uchar    read_frame(void)
{  
 uchar data=0,i; 
 
 //start:scl=0; data no confire
 //give up bus     setup data in
 io_dir(IN);     
 delay_us(5);         //wait for ads ready data
 
 for(i=0;i<8;i++)
 {
     scl=1;
     data=data<<1;            //bit0=0
     delay_us(5);           //等待数据稳定
     if(in_data==1)
     {
        data=data+1;
     }
     scl=0;               
     delay_us(5);         //wait for ads ready data
 }                 
 //fially:scl=0 data <in 
 return data;
}
/*
////////////////////////////////////////////////////////////////////////////////////////////
函数功能:写一个命令码到ADS1100
参数说明:addr器件地址,command命令码
          此为ads1100用函数
编写日期:2006.04.27
作    者:吴青松
////////////////////////////////////////////////////////////////////////////////////////////
*/
void     ads1100_write(unsigned char addr,unsigned char command)
{
 //addr=0x90;                          //1001(固定) 000(器件编号) 0(写)
 
 //a start
 ads1100_start();
 
 //sent for a frame    addr      
 send_frame(addr); 
 ackby_ads1100(); 
 
 //sent for a frame    command
 send_frame(command);
 ackby_ads1100();
 
 //a stop 
 ads1100_stop(); 
}
/*
////////////////////////////////////////////////////////////////////////////////////////////
函数功能:读写一次转换数据从ADS1100
参数说明:addr器件地址
          此为ads1100用函数
编写日期:2006.04.27
作    者:吴青松
////////////////////////////////////////////////////////////////////////////////////////////
*/
unsigned int     ads1100_read(unsigned char addr)
{
 uint  data;
 uchar datah,datal,datac;
 //addr=0x91;                          //1001(固定) 000(器件编号) 1(读)           
 
 //a start
 ads1100_start();
 
 //sent for a frame    addr      
 send_frame(addr);
 ackby_ads1100();
 
 //read a 8bit data for ads1100  datah
 datah=read_frame();
 ackby_master();
 
 //read a 8bit data for ads1100  datal
 datal=read_frame(); 
 ackby_master();
 
 //read a 8bit data for ads1100  datac
 datac=read_frame();  
 ackby_master(); 

 //a stop 
 ads1100_stop(); 
 
 data=(((uint)datah)<<8) + datal;
 return data;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -