MCU开发之I2C通信

  程序状态字PSW是8位寄存器,用于存放程序运行的状态信息,PSW中各位状态通常是在指令执行的过程中自动形成的,但也可以由用户根据需要采用传送指令加以改变。各个标志位的意义如下: 
PSW.7(Cy):进位标志位。 
PSW.6(AC):辅助进位标志位,又称为半进位标志位。 
PSW.5(F0):用户标志位。 
PSW.4、PSW.3(RS1和 RS0):寄存器组选择位。 
PSW.2(OV):溢出标志位。 
PSW.1(空缺位):此位未定义。 
PSW.0(P):奇偶校验位

  1 /*    I2C通信流程

  2     a、初始化I2C总线;

  3     b、发送起始信号;

  4     c、发送目标地址;(芯片的硬件地址)

  5     d、等待应答;

  6     e、发送或接收数据,这取决于c中目标地址中最后一位的设置;

  7     f、应答;

  8     g、从c-f循环;

  9     h、发送终止信号;

 10 */

 11 

 12 

 13 #include <reg51.h>

 14 #define uchar unsigned char

 15 #define uint  unsigned int

 16 

 17 void delay()

 18 {

 19     for(;;)

 20         ;

 21 }

 22 

 23 //I2C的初始化

 24 void init()

 25 {

 26     SDA = 1;

 27     delay();

 28     SCL = 1;

 29     delay();

 30 }

 31 

 32 //发送起始信号

 33 void start()

 34 {

 35     SDA = 0;

 36     delay();

 37 }

 38  39 //发送目标地址

 40 //发送函数,发送目标地址可以调用发送函数即可

 41 void  write(uchar content)

 42 {

 43     uchar i;

 44     uchar temp = content;

 45 

 46     for(i=0;i<8;i++)

 47     {

 48         temp=temp<<1; //左移一位 移出的一位在CY中,涉及程序状态字PSW 

 49         SCL = 0;

 50         delay();

 51         SDA = CY;

 52         delay();

 53         SCL = 1;

 54         delay();

 55     }

 56 

 57     SCL = 0;

 58     delay();

 59     SDA = 1;

 60     delay();        

 61 }

 62 

 63 //等待应答    ACK

 64 /*

 65     从机应答,在SCL为高电平时,将SDA拉低;即产生应答信号;

 66 */

 67 void respons()

 68 {

 69     uchar i;  

 70     SCL=1;  

 71     delay();  

 72     while((SDA==1)&&(i<250))//没收到应答,我等!~~  

 73         i++;        //等了250次没收到就不管他了,就当他收到了-_-  

 74                     //其实没收到的话可以结束程序的  

 75     SCL=0;  

 76 }

 77 

 78 //接收数据;发送、接收数据,取决于前面地址字的最后一位。读/ 79 uchar read()

 80 {

 81      uchar k, i = 0;

 82      for(i=0;i<8;i++)  

 83     {  

 84         SCL=1;  

 85         delay();  

 86         k=(k<<1)|SDA;//先左移一位,再在最低位接受当前位  

 87         SCL=0;  

 88         delay();  

 89     }  

 90     return k;

 91 }

 92 

 93 void finish()

 94 {

 95     SCL = 1;

 96     delay()

 97     SDA = 0;

 98     delay();

 99     SDA = 1;

100     delay();

101 }

 

你可能感兴趣的:(通信)