打印
[资料分享]

ads1110驱动程序--PIC16F877

[复制链接]
502|2
手机看帖
扫描二维码
随时随地手机跟帖
沙发
xyz549040622|  楼主 | 2019-12-21 15:46 | 只看该作者
//本程序采用IIC通信方式,4兆PIC16F877
//是ADS1100,ADS1110的通用程序。
刚通过。


# include<pic.h>
# define uch unsigned char
# define unint unsigned int
# define SDA  RD1
# define SCL  RD0
uch ACK;
unint j;
void delay()            //延时
{
for(j=5535;--j;) continue;
}
void start (void)       //开始
{
   TRISD0=0;
   TRISD1=0;
   SDA=1;
   asm("nop");
   SCL=1;
   asm("nop");
   asm("nop");
   asm("nop");
   SDA=0;
   asm("nop");
   asm("nop");
   asm("nop");
   SCL=0;
   asm("nop");
   asm("nop");
}

void stop(void)             //结束
   {
    TRISD0=0;
    TRISD1=0;
    SDA=0;
    asm("nop");
    SCL=1;
    asm("nop");
    asm("nop");
    asm("nop");
    SDA=1;
    asm("nop");
    asm("nop");
    asm("nop");
    SCL=0;
    asm("nop");
    asm("nop");
    }
  
    uch  check(void)    //  检查应答信号
     {  
        TRISD1=1;
        SCL=0;
        SCL=1;
   
        if (SDA )
        {
            ACK = 1;
        }
       else
        {
            ACK = 0;
         }
       SCL=0;
      return(ACK);
     }
     
      void sendBYTE(uch data)   //  发送一个字节
{
     uch bitcount=8;               //发送8位

          do
          {
            TRISD0=0;
            TRISD1=0;            //置输出
           
            if((data&0x80)==0x80)   
                {
                 SDA=1;         //写 1
                 }
            else  
                {
                 SDA=0;        //写 0
                }
            SCL=0;              //在时钟大于4u秒期间写数据
            SCL=1;
           asm("nop");
           asm("nop");
           asm("nop");
           asm("nop");
           asm("nop");
            SCL=0;
          data=data<<1;
          bitcount--;
          } while(bitcount);
           TRISD1=1 ;                  //释放总线等待应答
           asm("nop");
           asm("nop");
           asm("nop");
           asm("nop");
           asm("nop");         
}   

uch reciveBYTE(void)             //接受一个字节
  {
    uch temp1=0;
    uch bitcount1=8;
    TRISD0=0;
    TRISD1=1;               //置输入
   do
   { SCL=0;              //在时钟大于4u秒期间读数据
     SCL=1;
     asm("nop");
     asm("nop");
  
    if(SDA)                //读 1
       {
        temp1=temp1|0x01;    
       }
    else                     //读 0
      {
        temp1=temp1&0xfe;
      }
     SCL=0;
     if(bitcount1-1)
      {
         temp1=temp1<<1;
         
      }
       bitcount1--;  
      }while(bitcount1);
       return(temp1);
  }  
  
   void ack(void)          //  发送连续读信号
{
    TRISD0=0;
    TRISD1=0;
    SDA=0;
    SCL=0;
    SCL=1;
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
    SCL=0;
}
    
  void nack(void)        //  发送不连续读信号
  {
    TRISD0=0;
    TRISD1=0;
    SDA=1;
    SCL=0;
    SCL=1;
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    SCL=0;
  }  
  
   void wrtoIIC(uch data)     //写器件地址和配置字

  {

    
     start();               //开始写
     sendBYTE(0x90);         //写器件地址(写)
         
     do{
          ;
        }while(check());       //等待应答
         sendBYTE(data);      //写配置字
    do{;
        }while(check());
        
     stop();            //结束写
    
    
     
}     

   void rdfromIIC(void)       //从ADS1100中读出数据
{  

  
     start();                  //开始读
     sendBYTE(0x91);           //写器件地址(读)
      do{
         ;
         }while(check());      //等待应答
      
     
      TMR1H=reciveBYTE();     // 读高8位
       ack();                  //连续读
      TMR1L=reciveBYTE();     //读低8位
      ack();                  //连续读
      TMR2=reciveBYTE();      //读配置字
      nack();
      stop();                  //结束读
  //    delay();
   
}
     

main()
{
   

   
   while(1)
    {
     di();
     wrtoIIC( 0x8c);
     rdfromIIC();
  
    }
}  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2810

主题

19297

帖子

104

粉丝