zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    使用 Sentry集中处理错误
    laravel实现多对多的分析
    windows下phpstorm的快捷键
    npm 升级
    squid----正向代理
    nginx----配置优化
    负载均衡----nginx
    负载均衡----HAproxy
    负载均衡----LVS
    mysql-8.0.12读写分离
  • 原文地址:https://www.cnblogs.com/chris-cp/p/3886518.html
Copyright © 2011-2022 走看看