📄 i2c.lst
字号:
C51 COMPILER V7.06 I2C 12/12/2008 20:59:38 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN i2c.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include<string.h>
2 #include<reg51.h>
3 #define TIME 4
4 #define TRUE 1
5 #define FALSE 0
6 sbit SCL=P1^2; /*定义时钟信号线*/
7 sbit SDA=P1^1; /*定义数据信号线*/
8 sbit wp=P1^0;
9 void WriteOneByte(char addr,char d);
10 char Read_One_Byte(char addr);
11 void delay(unsigned int t);
12 void main()
13 {
14 1 char i;
15 1 wp=0;
16 1 for(i=0;i<10;i++)
17 1 {
18 2 WriteOneByte(i,i+1);
19 2 }
20 1 while(1)
21 1 {wp=1;
22 2 for(i=0;i<10;i++)
23 2 {
24 3 P2=Read_One_Byte(i);
25 3 delay(50000);
26 3 }
27 2 }
28 1 }
29
30 /*延时函数*/
31 void delay(unsigned int t)
32 {
33 1 unsigned int i;
34 1 for (i=0;i<t;i++);
35 1 }
36
37 /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
38 void Start(void)
39 {
40 1 SDA=1;
41 1 SCL=1;
42 1 delay(TIME);
43 1 SDA=0;
44 1 delay(TIME);
45 1 SCL=0;
46 1 delay(TIME);
47 1 }
48
49 /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
50 void Stop(void)
51 {
52 1 SDA=0;
53 1 SCL=1;
54 1 delay(TIME);
55 1 SDA=1;
C51 COMPILER V7.06 I2C 12/12/2008 20:59:38 PAGE 2
56 1 delay(TIME);
57 1 SCL=0;
58 1 delay(TIME);
59 1 }
60
61 /*发送完一个字节后检验设备的应答信号*/
62 bit Check_Ack (void)
63 {
64 1 bit q;
65 1 SDA=1;
66 1 SCL=1;
67 1 delay(TIME/2);
68 1 q=SDA;
69 1 delay(TIME/2);
70 1 SCL=0;
71 1 delay(TIME);
72 1 if (q==1)
73 1 return(FALSE);
74 1 else
75 1 return(TRUE);
76 1 }
77
78 /*发送1,在SCL为高电平时使SDA信号为高*/
79 void SEND_1 (void)
80 {
81 1 SDA=1;
82 1 SCL=1;
83 1 delay(TIME);
84 1 SCL=0;
85 1 delay(TIME);
86 1 }
87
88 /*发送0,在SCL为高电平时使SDA信号为低*/
89 void SEND_0(void)
90 {
91 1 SDA=0;
92 1 SCL=1;
93 1 delay(TIME);
94 1 SCL=0;
95 1 delay(TIME);
96 1 }
97
98 /*从I2C总线读一个字节*/
99 char ReadI2CByte(void)
100 {
101 1 bit q;
102 1 char b=0,i;
103 1 for (i=0;i<8;i++)
104 1 {
105 2 SDA=1; /*释放总线*/
106 2 SCL=1; /*接受数据*/
107 2 delay(10);
108 2 q=SDA;
109 2 delay(10);
110 2 SCL=0;
111 2 if (q==1)
112 2 {
113 3 b=b<<1;
114 3 b=b|0x01;
115 3 }
116 2 else
117 2 b=b<<1;
C51 COMPILER V7.06 I2C 12/12/2008 20:59:38 PAGE 3
118 2 }
119 1 return(b);
120 1 }
121
122 /*向I2C总线写一个字节*/
123 void WriteI2CByte(char b)
124 {
125 1 char i;
126 1 for (i=0;i<8;i++)
127 1 if ((b<<i)&0x80)
128 1 SEND_1();
129 1 else
130 1 SEND_0();
131 1 }
132
133 /**********以下为读写24c02的函数**********/
134 void WriteOneByte(char addr,char d) //单字节写
135 {
136 1 bit ack=1;
137 1 Start();
138 1 WriteI2CByte(0xa0);
139 1 ack=Check_Ack();
140 1 WriteI2CByte(addr); //地址
141 1 ack=Check_Ack();
142 1 WriteI2CByte(d); //数据
143 1 ack=Check_Ack();
144 1 Stop();
145 1 }
146 char Read_One_Byte(char addr)
147 {
148 1 bit ack=1;
149 1 char mydata;
150 1 Start();
151 1 WriteI2CByte(0xa0);
152 1 ack=Check_Ack();
153 1 WriteI2CByte(addr); /* 地址 */
154 1 ack=Check_Ack();
155 1 Start();
156 1 WriteI2CByte(0xa1);
157 1 ack=Check_Ack();
158 1 mydata=ReadI2CByte();
159 1 ack=Check_Ack();
160 1 return(mydata);
161 1 Stop();
162 1 }
163
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 329 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
IDATA SIZE = ---- ----
BIT SIZE = ---- 4
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -