📄 i2c.lst
字号:
C51 COMPILER V7.02b I2C 10/28/2005 08:10:42 PAGE 1
C51 COMPILER V7.02b, 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
2 #include <intrins.h>
3 #include <reg52.h>
4 #include"define.h"
5 sbit SCL = P1^3;
6 sbit SDA = P1^4;
7 bit ack;
8
9
10 /*******************************************************************
11 起动总线函数
12 函数原型: void Start_I2c();
13 功能: 启动I2C总线,即发送I2C起始条件.
14 ********************************************************************/
15 void Start_I2c()
16 {
17 1 SDA=1; /*发送起始条件的数据信号*/
18 1 _nop_();
19 1 SCL=1;
20 1 _nop_(); /*起始条件建立时间大于4.7us,延时*/
21 1 _nop_();
22 1 _nop_();
23 1 _nop_();
24 1 _nop_();
25 1 SDA=0; /*发送起始信号*/
26 1 _nop_(); /* 起始条件锁定时间大于4μs*/
27 1 _nop_();
28 1 _nop_();
29 1 _nop_();
30 1 _nop_();
31 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
32 1 _nop_();
33 1 _nop_();
34 1 }
35
36 /*******************************************************************
37 结束总线函数
38 函数原型: void Stop_I2c();
39 功能: 结束I2C总线,即发送I2C结束条件.
40
41 ********************************************************************/
42 void Stop_I2c()
43 {
44 1 SDA=0; /*发送结束条件的数据信号*/
45 1 _nop_(); /*发送结束条件的时钟信号*/
46 1 SCL=1; /*结束条件建立时间大于4μs*/
47 1 _nop_();
48 1 _nop_();
49 1 _nop_();
50 1 _nop_();
51 1 _nop_();
52 1 SDA=1; /*发送I2C总线结束信号*/
53 1 _nop_();
54 1 _nop_();
55 1 _nop_();
C51 COMPILER V7.02b I2C 10/28/2005 08:10:42 PAGE 2
56 1 _nop_();
57 1 }
58
59
60
61
62 /*******************************************************************
63 字节数据传送函数
64 函数原型: void SendByte(unsigned char c);
65 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
66 此状态位进行操作.(不应答或非应答都使ack=0 假)
67 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
68 ********************************************************************/
69 void SendByte(unsigned char c)
70 {
71 1 unsigned char BitCnt;
72 1
73 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
74 1 {
75 2 if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
76 2 else SDA=0;
77 2 _nop_();
78 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
79 2 _nop_();
80 2 _nop_(); /*保证时钟高电平周期大于4μs*/
81 2 _nop_();
82 2 _nop_();
83 2 _nop_();
84 2 SCL=0;
85 2 }
86 1
87 1 _nop_();
88 1 _nop_();
89 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
90 1 _nop_();
91 1 _nop_();
92 1 SCL=1;
93 1 _nop_();
94 1 _nop_();
95 1 _nop_();
96 1 if(SDA==1)ack=0;
97 1 else ack=1; /*判断是否接收到应答信号*/
98 1 SCL=0;
99 1 _nop_();
100 1 _nop_();
101 1 }
102
103 /*******************************************************************
104 字节数据传送函数
105 函数原型: unsigned char RcvByte();
106 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
107 发完后请用应答函数。
108 ********************************************************************/
109 unsigned char RcvByte()
110 {
111 1 unsigned char retc;
112 1 unsigned char BitCnt;
113 1
114 1 retc=0;
115 1 SDA=1; /*置数据线为输入方式*/
116 1 for(BitCnt=0;BitCnt<8;BitCnt++)
117 1 {
C51 COMPILER V7.02b I2C 10/28/2005 08:10:42 PAGE 3
118 2 _nop_();
119 2 SCL=0; /*置时钟线为低,准备接收数据位*/
120 2 _nop_();
121 2 _nop_(); /*时钟低电平周期大于4.7μs*/
122 2 _nop_();
123 2 _nop_();
124 2 _nop_();
125 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
126 2 _nop_();
127 2 _nop_();
128 2 retc=retc<<1;
129 2 if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
130 2 _nop_();
131 2 _nop_();
132 2 }
133 1 SCL=0;
134 1 _nop_();
135 1 _nop_();
136 1 return(retc);
137 1 }
138
139
140
141
142 /********************************************************************
143 应答子函数
144 原型: void Ack_I2c(bit a);
145
146 功能:主控器进行应答信号,(可以是应答或非应答信号)
147 ********************************************************************/
148 void Ack_I2c(bit a)
149 {
150 1
151 1 if(a==0)SDA=0; /*在此发出应答或非应答信号 */
152 1 else SDA=1;
153 1 _nop_();
154 1 _nop_();
155 1 _nop_();
156 1 SCL=1;
157 1 _nop_();
158 1 _nop_(); /*时钟低电平周期大于4μs*/
159 1 _nop_();
160 1 _nop_();
161 1 _nop_();
162 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
163 1 _nop_();
164 1 _nop_();
165 1 }
166
167 /*******************************************************************
168 向无子地址器件发送字节数据函数
169 函数原型: bit ISendByte(unsigned char sla,ucahr c);
170 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
171 如果返回1表示操作成功,否则操作有误。
172 注意: 使用前必须已结束总线。
173 ********************************************************************/
174 /*
175 bit ISendByte(unsigned char sla,unsigned char c)
176 {
177 Start_I2c(); //启动总线/
178 SendByte(sla); //发送器件地址/
179 if(ack==0)return(0);
C51 COMPILER V7.02b I2C 10/28/2005 08:10:42 PAGE 4
180 SendByte(c); //发送数据/
181 if(ack==0)return(0);
182 Stop_I2c(); //结束总线/
183 return(1);
184 }
185
186 */
187
188
189 /*******************************************************************
190 向有子地址器件发送多字节数据函数
191 函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
192 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
193 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
194 如果返回1表示操作成功,否则操作有误。
195 注意: 使用前必须已结束总线。
196 ********************************************************************/
197 bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
198 {
199 1 unsigned char i;
200 1
201 1 Start_I2c(); /*启动总线*/
202 1 _nop_();
203 1 SendByte(sla); /*发送器件地址*/
204 1 _nop_();
205 1 if(ack==0)return(0);
206 1 SendByte(suba); /*发送器件子地址*/
207 1 _nop_();
208 1 if(ack==0)return(0);
209 1
210 1 for(i=0;i<no;i++)
211 1 {
212 2 SendByte(*s); /*发送数据*/
213 2 if(ack==0)return(0);
214 2 s++;
215 2 _nop_();
216 2 _nop_();
217 2 _nop_();
218 2 }
219 1 Stop_I2c(); /*结束总线*/
220 1
221 1 return(1);
222 1 }
223
224
225
226
227
228
229 /*******************************************************************
230 向无子地址器件读字节数据函数
231 函数原型: bit IRcvByte(unsigned char sla,ucahr *c);
232 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
233 址sla,返回值在c.
234 如果返回1表示操作成功,否则操作有误。
235 注意: 使用前必须已结束总线。
236 ********************************************************************/
237 /*
238 bit IRcvByte(unsigned char sla,unsigned char *c)
239 {
240 Start_I2c(); //启动总线/
241 SendByte(sla+1); //发送器件地址/
C51 COMPILER V7.02b I2C 10/28/2005 08:10:42 PAGE 5
242 if(ack==0)return(0);
243 *c=RcvByte(); //读取数据/
244 Ack_I2c(1); //发送非就答位/
245 Stop_I2c(); //结束总线/
246 return(1);
247 }
248
249 */
250
251 /*******************************************************************
252 向有子地址器件读取多字节数据函数
253 函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
254 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
255 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
256 如果返回1表示操作成功,否则操作有误。
257 注意: 使用前必须已结束总线。
258 ********************************************************************/
259 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
260 {
261 1 unsigned char i;
262 1
263 1 Start_I2c();
264 1 SendByte(sla);
265 1 if(ack==0)return(0);
266 1 SendByte(suba);
267 1 if(ack==0)return(0);
268 1
269 1 Start_I2c();
270 1 SendByte(sla+1);
271 1 if(ack==0)return(0);
272 1
273 1 for(i=0;i<no-1;i++)
274 1 {
275 2 *s=RcvByte();
276 2 Ack_I2c(0);
277 2 s++;
278 2 }
279 1 *s=RcvByte();
280 1 Ack_I2c(1);
281 1 Stop_I2c();
282 1 return(1);
283 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 310 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -