• 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 }
  • 相关阅读:
    JQuery Ajax 在asp.net中使用总结
    直接拿来用!最火的Android开源项目(一)
    专访邓凡平:Android开发路上的快速学习之道
    C/C++使用心得:enum与int的相互转换
    学习汇编的第一步
    《汇编程序》王爽实验9的解法(显示的问题)
    《汇编程序》王爽实验10.2的解法
    GDB调试精粹及使用实例
    aptget 使用详解
    《汇编程序》王爽实验10.3的解法
  • 原文地址:https://www.cnblogs.com/chris-cp/p/3886518.html
Copyright © 2020-2023  润新知