[资料分享] ADS1100驱动程序-PIC16F877

[复制链接]
 楼主| xyz549040622 发表于 2020-1-27 11:10 | 显示全部楼层 |阅读模式
  1. 本程序采用IIC通信方式,4兆PIC16F877
  2. //是ADS1100,ADS1110的通用程序。
  3. 刚通过。


  4. # include<pic.h>
  5. # define uch unsigned char
  6. # define unint unsigned int
  7. # define SDA  RD1
  8. # define SCL  RD0
  9. uch ACK;
  10. unint j;
  11. void delay()            //延时
  12. {
  13. for(j=5535;--j;) continue;
  14. }
  15. void start (void)       //开始
  16. {
  17.    TRISD0=0;
  18.    TRISD1=0;
  19.    SDA=1;
  20.    asm("nop");
  21.    SCL=1;
  22.    asm("nop");
  23.    asm("nop");
  24.    asm("nop");
  25.    SDA=0;
  26.    asm("nop");
  27.    asm("nop");
  28.    asm("nop");
  29.    SCL=0;
  30.    asm("nop");
  31.    asm("nop");
  32. }

  33. void stop(void)             //结束
  34.    {
  35.     TRISD0=0;
  36.     TRISD1=0;
  37.     SDA=0;
  38.     asm("nop");
  39.     SCL=1;
  40.     asm("nop");
  41.     asm("nop");
  42.     asm("nop");
  43.     SDA=1;
  44.     asm("nop");
  45.     asm("nop");
  46.     asm("nop");
  47.     SCL=0;
  48.     asm("nop");
  49.     asm("nop");
  50.     }
  51.   
  52.     uch  check(void)    //  检查应答信号
  53.      {  
  54.         TRISD1=1;
  55.         SCL=0;
  56.         SCL=1;
  57.    
  58.         if (SDA )
  59.         {
  60.             ACK = 1;
  61.         }
  62.        else
  63.         {
  64.             ACK = 0;
  65.          }
  66.        SCL=0;
  67.       return(ACK);
  68.      }
  69.      
  70.       void sendBYTE(uch data)   //  发送一个字节
  71. {
  72.      uch bitcount=8;               //发送8位

  73.           do
  74.           {
  75.             TRISD0=0;
  76.             TRISD1=0;            //置输出
  77.            
  78.             if((data&0x80)==0x80)   
  79.                 {
  80.                  SDA=1;         //写 1
  81.                  }
  82.             else  
  83.                 {
  84.                  SDA=0;        //写 0
  85.                 }
  86.             SCL=0;              //在时钟大于4u秒期间写数据
  87.             SCL=1;
  88.            asm("nop");
  89.            asm("nop");
  90.            asm("nop");
  91.            asm("nop");
  92.            asm("nop");
  93.             SCL=0;
  94.           data=data<<1;
  95.           bitcount--;
  96.           } while(bitcount);
  97.            TRISD1=1 ;                  //释放总线等待应答
  98.            asm("nop");
  99.            asm("nop");
  100.            asm("nop");
  101.            asm("nop");
  102.            asm("nop");         
  103. }   

  104. uch reciveBYTE(void)             //接受一个字节
  105.   {
  106.     uch temp1=0;
  107.     uch bitcount1=8;
  108.     TRISD0=0;
  109.     TRISD1=1;               //置输入
  110.    do
  111.    { SCL=0;              //在时钟大于4u秒期间读数据
  112.      SCL=1;
  113.      asm("nop");
  114.      asm("nop");
  115.   
  116.     if(SDA)                //读 1
  117.        {
  118.         temp1=temp1|0x01;   
  119.        }
  120.     else                     //读 0
  121.       {
  122.         temp1=temp1&0xfe;
  123.       }
  124.      SCL=0;
  125.      if(bitcount1-1)
  126.       {
  127.          temp1=temp1<<1;
  128.          
  129.       }
  130.        bitcount1--;  
  131.       }while(bitcount1);
  132.        return(temp1);
  133.   }  
  134.   
  135.    void ack(void)          //  发送连续读信号
  136. {
  137.     TRISD0=0;
  138.     TRISD1=0;
  139.     SDA=0;
  140.     SCL=0;
  141.     SCL=1;
  142.    asm("nop");
  143.    asm("nop");
  144.    asm("nop");
  145.    asm("nop");
  146.    asm("nop");
  147.     SCL=0;
  148. }
  149.    
  150.   void nack(void)        //  发送不连续读信号
  151.   {
  152.     TRISD0=0;
  153.     TRISD1=0;
  154.     SDA=1;
  155.     SCL=0;
  156.     SCL=1;
  157.     asm("nop");
  158.     asm("nop");
  159.     asm("nop");
  160.     asm("nop");
  161.     asm("nop");
  162.     SCL=0;
  163.   }  
  164.   
  165.    void wrtoIIC(uch data)     //写器件地址和配置字

  166.   {

  167.    
  168.      start();               //开始写
  169.      sendBYTE(0x90);         //写器件地址(写)
  170.          
  171.      do{
  172.           ;
  173.         }while(check());       //等待应答
  174.          sendBYTE(data);      //写配置字
  175.     do{;
  176.         }while(check());
  177.         
  178.      stop();            //结束写
  179.    
  180.    
  181.      
  182. }     

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

  185.   
  186.      start();                  //开始读
  187.      sendBYTE(0x91);           //写器件地址(读)
  188.       do{
  189.          ;
  190.          }while(check());      //等待应答
  191.       
  192.      
  193.       TMR1H=reciveBYTE();     // 读高8位
  194.        ack();                  //连续读
  195.       TMR1L=reciveBYTE();     //读低8位
  196.       ack();                  //连续读
  197.       TMR2=reciveBYTE();      //读配置字
  198.       nack();
  199.       stop();                  //结束读
  200.   //    delay();
  201.    
  202. }
  203.      

  204. main()
  205. {
  206.    

  207.    
  208.    while(1)
  209.     {
  210.      di();
  211.      wrtoIIC( 0x8c);
  212.      rdfromIIC();
  213.   
  214.     }
  215. }  


 楼主| xyz549040622 发表于 2020-1-27 11:10 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2841

主题

19330

帖子

110

粉丝
快速回复 在线客服 返回列表 返回顶部