普通IO模拟i2c总线

 

          相关文章:

                 一 .   i2c总线协议

                 二.   普通IO模拟i2c总线

                 三.   简单i2c设备驱动实例

 

下面简单的单片机程序,理解之后会让你对I2c总线有更深的认识,

思路

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

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

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

运行结果:D1亮,

 

 

程序:

 

 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 }

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kevin@1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值