IIC编程

此次试验目的:IIC总线编程,通过写入向硬件写入数据,然后读出数据,让一个发光二极管点亮.

我大概用了两天的时间,终于搞定了它.感觉IIC总线的编程中,对IIC总线数据传送的概念必须的了解透彻才行.看着时序图,然后去编程,一定要靠自己的能力去把写下来,然后测试通过.

I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。如下图所示:

SCL高电平,SDA数据稳定

SCL高电平,SDA数据稳定

另外IIC定义了自己的起始信号跟终止信号以及相应信号,如下图所示:

IIC起始信号,终止信号,响应信号的SCL,SDA变化

IIC起始信号,终止信号,响应信号的SCL,SDA变化

IIC写数据的时序图如下:

iic写数据的时序图

iic写数据的时序图

IIC读数据的时序图:

IIC读数据的时序图

IIC读数据的时序图

具体代码如下所示:

[csharp] view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <reg52.h>  
  2. #define uchar unsigned char  
  3. sbit sda = P2 ^ 0;  
  4. sbit scl = P2 ^ 1;  
  5. //延时函数1   
  6. void delay()  
  7. {  
  8.     ; ;  
  9. }  
  10.    
  11. //延时函数2   
  12. void delay1(uchar time)  
  13. {  
  14.     uchar x, y;  
  15.     for (x = time; x > 0; x–)  
  16.         for (y = 110; y > 0; y–);  
  17. }  
  18.    
  19. //IIC起始信号   
  20. void start()  
  21. {  
  22.     sda = 1;  
  23.     delay();  
  24.     scl = 1;  
  25.     delay();  
  26.     sda = 0;  
  27.     delay();  
  28. }  
  29.    
  30. //IIC终止信号   
  31. void stop()  
  32. {  
  33.     sda = 0;  
  34.     delay();  
  35.     scl = 1;  
  36.     delay();  
  37.     sda = 1;  
  38.     delay();  
  39. }  
  40.    
  41. //IIC应答信号   
  42. void respons()  
  43. {  
  44.     uchar i;  
  45.     scl = 1;  
  46.     while ( (sda == 1) && (i < 250) ) i++;  
  47.     scl = 0;  
  48.     delay();  
  49. }  
  50.    
  51. //IIC初始化函数   
  52. void init()  
  53. {  
  54.     sda = 1;  
  55.     scl = 1;  
  56. }  
  57.    
  58. void write_byte(uchar da)  
  59. {  
  60.     uchar i, temp;  
  61.     temp = da;  
  62.     for (i = 0; i < 8; i++) {  
  63.         temp = temp << 1;  
  64.         scl = 0;  
  65.         delay();  
  66.         sda = CY;  
  67.         delay();  
  68.         scl = 1;  
  69.         delay();  
  70.     }  
  71.     scl = 0;  
  72.     delay();  
  73.     sda = 1;  
  74.     delay();  
  75. }  
  76.    
  77. uchar read_byte()  
  78. {  
  79.     uchar i, j, k;  
  80.     scl = 0;  
  81.     delay();  
  82.     sda = 1;  
  83.     delay();  
  84.     for (i = 0; i < 8; i++) {  
  85.         scl = 1;  
  86.         delay();  
  87.         j = sda;  
  88.         k = (k << 1) | j;  
  89.         scl = 0;  
  90.         delay();  
  91.     }  
  92.     return k;  
  93. }  
  94.    
  95. void main()  
  96. {  
  97.     //此处对照写数据时序图进行编码   
  98.     init();  
  99.     start();  
  100.     write_byte(0xa0);  
  101.     respons();  
  102.     write_byte(3);  
  103.     respons();  
  104.     write_byte(0xfe);  
  105.     respons();  
  106.     stop();  
  107.    
  108.     delay1(100);  
  109.     //此处对照读数据时序图进行编码   
  110.     start();  
  111.     write_byte(0xa0);  
  112.     respons();  
  113.     write_byte(3);  
  114.     respons();  
  115.     start();  
  116.     write_byte(0xa1);  
  117.     respons();  
  118.     P1 = read_byte();  
  119.     stop();  
  120. }  
#include <reg52.h>




#define uchar unsigned char sbit sda = P2 ^ 0; sbit scl = P2 ^ 1; //延时函数1 void delay() { ; ; } //延时函数2 void delay1(uchar time) { uchar x, y; for (x = time; x > 0; x--) for (y = 110; y > 0; y--); } //IIC起始信号 void start() { sda = 1; delay(); scl = 1; delay(); sda = 0; delay(); } //IIC终止信号 void stop() { sda = 0; delay(); scl = 1; delay(); sda = 1; delay(); } //IIC应答信号 void respons() { uchar i; scl = 1; while ( (sda == 1) && (i < 250) ) i++; scl = 0; delay(); } //IIC初始化函数 void init() { sda = 1; scl = 1; } void write_byte(uchar da) { uchar i, temp; temp = da; for (i = 0; i < 8; i++) { temp = temp << 1; scl = 0; delay(); sda = CY; delay(); scl = 1; delay(); } scl = 0; delay(); sda = 1; delay(); } uchar read_byte() { uchar i, j, k; scl = 0; delay(); sda = 1; delay(); for (i = 0; i < 8; i++) { scl = 1; delay(); j = sda; k = (k << 1) | j; scl = 0; delay(); } return k; } void main() { //此处对照写数据时序图进行编码 init(); start(); write_byte(0xa0); respons(); write_byte(3); respons(); write_byte(0xfe); respons(); stop(); delay1(100); //此处对照读数据时序图进行编码 start(); write_byte(0xa0); respons(); write_byte(3); respons(); start(); write_byte(0xa1); respons(); P1 = read_byte(); stop(); }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值