网站导航: 首页 > 设计参考 > 正文 文章搜索
连接多个相同地址I2C设备的C51程序
 
文章编号:
090106112910
文章分类: 单片机 51系列
点 击:
...
关 键 词: I2C
文章来源:
网络
摘 要:
本人初学C,曾为这个问题大伤脑筋^_^,就是一个单片机系统有两个以上的相同地址的I2C设备,无法用两个同一对SDA/SCL引脚

本人初学C,曾为这个问题大伤脑筋^_^,就是一个单片机系统有两个以上的相同地址的I2C设备,无法用两个同一对SDA/SCL引脚

 
  1. #include "stc89c51.h"   
  2. #include "iic.h"   
  3.   
  4. sbit scl0=P3^5;   
  5. sbit sda0 = P3^4;   
  6. sbit scl1= P3^3;   
  7. sbit sda1 = P3^2;   
  8. //这里只写了两个I2C设备,如果需要可以再加上 sbit scl2=xx; sbit sda2=xx; 实际上多个设备的scl脚可以共用   
  9.   
  10. unsigned char iic_delay_time = 8;   
  11.   
  12. void scl(device,value);   
  13. void sda(device,value);   
  14. bit sdasense(char device);   
  15.   
  16. // delay   
  17. void iic_delay(unsigned char m)   
  18. {   
  19.     unsigned char n;   
  20.     for(n=0;n<m;n++);   
  21. }   
  22.   
  23. //   
  24. void scl(device,value)    
  25. {   
  26.     if (device==0)        //设备1   
  27.         scl1=value;   
  28.     if (device==1)        //设备2   
  29.         scl2=value;   
  30. }   
  31. void sda(device,value)   
  32. {   
  33.     if (device==0)        //设备1   
  34.         sda1=value;   
  35.     if (device==1)        //设备2   
  36.         sda2=value;   
  37. }   
  38.   
  39. bit sdasense(char device)   
  40. {   
  41. switch(device)   
  42.     {   
  43.         case 1: return sda1;   
  44.             break;   
  45.         case 2: return sda2;   
  46.             break;   
  47.     }   
  48. }   
  49.   
  50. //启动I2C总线的函数,当scl为高电平时使sda产生一个负跳变    
  51. void iic_start(device)    
  52. {   
  53.     sda(device,1);   
  54.     scl(device,1);   
  55.     iic_delay(iic_delay_time);   
  56.     sda(device,0);   
  57.     iic_delay(iic_delay_time);   
  58.     scl(device,0);   
  59.     iic_delay(iic_delay_time/2);   
  60. }   
  61.   
  62. //终止I2C总线,当scl为高电平时使sda产生一个正跳变   
  63. void iic_stop(device)    
  64. {   
  65.     scl(device,0);   
  66.     sda(device,0);   
  67.     scl(device,1);   
  68.     iic_delay(iic_delay_time);   
  69.     sda(device,1);   
  70.     iic_delay(iic_delay_time);   
  71. }   
  72.   
  73. //发送应答信号   
  74. void iic_ack(device) {   
  75.     sda(device,0);   
  76.     scl(device,1);   
  77.     scl(device,0);   
  78.     sda(device,1);   
  79. }   
  80.   
  81. //发送无应答信号   
  82. void iic_noack(device)    
  83. {   
  84.     sda(device,1);   
  85.     scl(device,1);   
  86.     scl(device,0);   
  87. }    
  88.   
  89. //检测应答信号   
  90. bit iic_testack(device)    
  91. {   
  92.     bit errorbit;      //真确应答,返回0   
  93.     sda(device,1);   
  94.     iic_delay(iic_delay_time);   
  95.     scl(device,1);   
  96.     iic_delay(iic_delay_time);   
  97.     errorbit=sdasense(device);   
  98.     scl(device,0);   
  99.     iic_delay(iic_delay_time);   
  100.     return(errorbit);   
  101. }   
  102.   
  103. //发送一个字节   
  104. void iic_write8bit(device,unsigned char input)    
  105. {   
  106.     unsigned char temp;   
  107.     for(temp=0;temp<8;temp++)    
  108.     {   
  109.         if((input<<temp)&0x80)   
  110.             sda(device,1);   
  111.         else  
  112.             sda(device,0);   
  113.         scl(device,1);   
  114.   
  115.         iic_delay(iic_delay_time);   
  116.         scl(device,0);   
  117.     }   
  118. }   
  119.   
  120. //读一个字节   
  121. unsigned char iic_read8bit(device)    
  122. {   
  123.     unsigned char temp,rbyte=0;   
  124.     for(temp=0;temp<8;temp++)    
  125.     {   
  126.         scl(device,1);   
  127.         iic_delay(iic_delay_time);   
  128.         if(sdasense(device))   
  129.             rbyte=(rbyte<<1)+1;   
  130.         else  
  131.             rbyte=rbyte<<1;   
  132.         scl(device,0);   
  133.     }   
  134.     return(rbyte);   
  135. }    
  136.   

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4