• I2C总线模拟(郭天祥视屏)


    电路图

    I2C

    思路

    1.向EEPROM中通过I2C总线写入一个字节

    2.通过I2C总线读出写入的字节

    3.如果写入和读出成功点亮发光二极管

    程序

      1 #include <REGX51.H>
      2 
      3 #define uchar unsigned char
      4 #define uint unsigned int
      5 
      6 void init();
      7 void start();
      8 void stop();
      9 void write(uchar byte);
     10 void write_add(uchar byte,uchar address);//向指定地址中写入字节
     11 void delay1(uchar x);
     12 uchar read_add(uchar address);
     13 uchar read();//从指定地址中读出字节
     14 
     15 void delay()
     16 {;;}
     17 
     18 sbit led = P0^0;
     19 sbit sck = P2^0;
     20 sbit sad = P2^1;
     21 
     22 void main()
     23 {
     24     uchar test = 0;
     25     init();
     26     write_add(0x01,0xaf);
     27     delay1(100);
     28     
     29     test =read_add(0xaf); 
     30     if(test == 0x01)
     31         led = 0;
     32     while(1);
     33 }
     34 
     35 void init()
     36 {
     37     sck = 1;
     38     delay();
     39     sad = 1;//数据线和信号线都空闲
     40     delay();
     41     led = 1;
     42 }
     43 //起始信号
     44 void start()
     45 {
     46     sad = 1;
     47     delay();
     48     sck = 1;
     49     delay();
     50     sad = 0;
     51     delay();
     52 }
     53 //停止信号
     54 void stop()
     55 {
     56     sad = 0;
     57     delay();
     58     sck = 1;
     59     delay();
     60     sad = 1;
     61     delay();
     62 }
     63 //等待回应
     64 void response()
     65 {
     66     uchar i = 0;
     67     sck = 1;
     68     delay();
     69     while((sad == 1) && (i < 250))
     70         i++;    
     71     sck = 0;
     72     delay();
     73 }
     74 //向指定地址写入一个字节
     75 void write(uchar byte)
     76 {
     77     uchar i = 0;
     78     uchar temp = byte;
     79 
     80     for(; i < 8; i++)
     81     {
     82         temp = temp << 1;//temp左移一位
     83         sck = 0;
     84         delay();
     85         sad = CY;
     86         delay();
     87         sck = 1;
     88         delay();          
     89     } 
     90     sck = 0;
     91     delay();//这样就不会产生开始信号或结束信号    
     92     sad = 1;
     93     delay();        
     94 }
     95 //从指定地址读取一个字符
     96 uchar read()
     97 {
     98     uchar i,k;
     99     sck = 0;
    100     delay();
    101     sad = 1;
    102     delay();
    103     for(; i < 8; i++)
    104     {
    105         sck = 1;
    106         delay();
    107         k = (k << 1) | sad;
    108         sck = 0;
    109         delay();
    110     }    
    111     return k;
    112 }
    113 //写入一个字节
    114 void write_add(uchar byte,uchar address)
    115 {
    116     start();
    117     write(0xa0);
    118     response();
    119     write(address);
    120     response();
    121     write(byte);
    122     response();
    123     stop();    
    124 }
    125 //读出写入的字节
    126 uchar read_add(uchar address)
    127 {
    128     uchar result;
    129     start();
    130     write(0xa0);
    131     response();
    132     write(address);
    133     response();
    134     start();
    135     write(0xa1);
    136     response();
    137     result = read();
    138     stop();
    139     return result;
    140 }
    141 void delay1(uchar x)
    142 {
    143     uchar a,b;
    144     for(a=x;a>0;a--)
    145      for(b=100;b>0;b--);
    146 }

    运行结果

    result

  • 相关阅读:
    es5中的类 继承 (原型链继承,寄生继承,组合继承)
    typeScript类型
    javaScript 不可思议问题
    javaScript 运算符(操作符)
    window.a 与 window[a]区别
    Event Loop事件循环
    生产环境vue-router模式为history导致页面404
    Axios请求添加token
    vue页面利用keep-alive实现页面快速缓存
    js原型链原理
  • 原文地址:https://www.cnblogs.com/huifeidewoniu/p/3416968.html
Copyright © 2020-2023  润新知