📄 i2c_c51.lst
字号:
C51 COMPILER V7.06 I2C_C51 05/09/2005 09:55:25 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE I2C_C51
OBJECT MODULE PLACED IN I2C_C51.OBJ
COMPILER INVOKED BY: e:\Keil\C51\BIN\C51.EXE I2C_C51.c BROWSE INCDIR(C:\Keil\C51\INC\) DEBUG OBJECTEXTEND
stmt level source
1 /************************************************************************/
2 /* 天煌科技实业有限公司 http://www.Teamkit.com */
3 /************************************************************************/
4 /************************************************************************/
5 /* */
6 /*文件名: I2C_C51.C */
7 /*创建人:晁洪超 */
8 /*创建日期:2004.3.28 */
9 /*修改日期: */
10 /*功 能: 实现I2C数据总线的数据的发送和接收 */
11 /*包含的函数说明: */
12 /* bit ISendByte(uchar sla,uchar c) 无子地址器件写单字节数据 */
13 /* bit IRcvByte(uchar sla,uchar *c) 无子地址器件读单字节数据 */
14 /* bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)有子地址器件*/
15 /* 读取no个字节数据 */
16 /* bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)有子地址器件 */
17 /* 写入no个字节数据 */
18 /*版本号:1.0
19 /************************************************************************/
20
21
22 #include <reg52.h> /*头文件的包含*/
23 #include <intrins.h>
24
25 #define uchar unsigned char /*宏定义*/
26 #define uint unsigned int
27
28 #define _Nop() _nop_() /*定义空指令*/
29
30 /* 常,变量定义区 */
31
32 /*端口位定义*/
33 sbit SDA=P1^7; /*模拟I2C数据传送位*/
34 sbit SCL=P1^6; /*模拟I2C时钟控制位*/
35
36 /*状态标志*/
37 bit ack; /*应答标志位*/
38
39
40
41
42
43
44 /**************************************************************************/
45 /*函数名称:void Start_I2c() */
46 /*功能描述:启动I2C总线,发送了I2C起始条件, SCL为高电平时SDA由高变为低 */
47 /*输入:无 */
48 /*输出:无 */
49 /*创建日期:2004.3.28 */
50 /*修改日期: */
51 /**************************************************************************/
52
53 void Start_I2c()
54 {
55 1 SDA=1; /*发送起始条件的数据信号*/
C51 COMPILER V7.06 I2C_C51 05/09/2005 09:55:25 PAGE 2
56 1 _Nop();
57 1 SCL=1;
58 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
59 1 _Nop();
60 1 _Nop();
61 1 _Nop();
62 1 _Nop();
63 1 SDA=0; /*发送起始信号*/
64 1 _Nop(); /* 起始条件锁定时间大于4μs*/
65 1 _Nop();
66 1 _Nop();
67 1 _Nop();
68 1 _Nop();
69 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
70 1 _Nop();
71 1 _Nop();
72 1 }
73
74
75
76
77 /**************************************************************************/
78 /*函数名称:void Stop_I2c() */
79 /*功能描述:结束I2C总线,发送了I2C结束条件,SCL为高电平时SDA由低变为高 */
80 /*输入:无 */
81 /*输出:无 */
82 /*创建日期:2004.3.28 */
83 /*修改日期: */
84 /**************************************************************************/
85
86 void Stop_I2c()
87 {
88 1 SDA=0; /*发送结束条件的数据信号*/
89 1 _Nop(); /*发送结束条件的时钟信号*/
90 1 SCL=1; /*结束条件建立时间大于4μs*/
91 1 _Nop();
92 1 _Nop();
93 1 _Nop();
94 1 _Nop();
95 1 _Nop();
96 1 SDA=1; /*发送I2C总线结束信号*/
97 1 _Nop();
98 1 _Nop();
99 1 _Nop();
100 1 _Nop();
101 1 }
102
103
104
105
106 /**************************************************************************/
107 /*函数名称:void SendByte(uchar c) */
108 /*功能描述:字节数据传送函,将数据C发送出,发送完成后等待应答, */
109 /* 并对状态位进行操作(不应答或非应答信号时使ACK=0,正常数 */
110 /* 据时使ACK=1). */
111 /*输入:c */
112 /*返回:ack=1送出成功,ack=0送出失败 */
113 /*创建日期:2004.3.28 */
114 /*修改日期: */
115 /**************************************************************************/
116
117 void SendByte(uchar c)
C51 COMPILER V7.06 I2C_C51 05/09/2005 09:55:25 PAGE 3
118 {
119 1 uchar BitCnt;
120 1
121 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
122 1 {
123 2 if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
124 2 else SDA=0;
125 2 _Nop();
126 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
127 2 _Nop();
128 2 _Nop(); /*保证时钟高电平周期大于4μs*/
129 2 _Nop();
130 2 _Nop();
131 2 _Nop();
132 2 SCL=0;
133 2 }
134 1
135 1 _Nop();
136 1 _Nop();
137 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
138 1 _Nop();
139 1 _Nop();
140 1 SCL=1;
141 1 _Nop();
142 1 _Nop();
143 1 _Nop();
144 1 if(SDA==1)ack=0;
145 1 else ack=1; /*判断是否接收到应答信号*/
146 1 SCL=0;
147 1 _Nop();
148 1 _Nop();
149 1 }
150
151
152 /**************************************************************************/
153 /*函数名称:uchar RcvByte() */
154 /*功能描述:字节数据传送函数,用来接收从器件传来的数据,并判断总线的 */
155 /* 错误(不发送应答信号)发送完调用应答函数。 */
156 /*输入:无 */
157 /*返回:retc */
158 /*创建日期:2004.3.28 */
159 /*修改日期: */
160 /**************************************************************************/
161 uchar RcvByte()
162 {
163 1 uchar retc;
164 1 uchar BitCnt;
165 1
166 1 retc=0;
167 1 SDA=1; /*置数据线为输入方式*/
168 1 for(BitCnt=0;BitCnt<8;BitCnt++)
169 1 {
170 2 _Nop();
171 2 SCL=0; /*置时钟线为低,准备接收数据位*/
172 2 _Nop();
173 2 _Nop(); /*时钟低电平周期大于4.7μs*/
174 2 _Nop();
175 2 _Nop();
176 2 _Nop();
177 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
178 2 _Nop();
179 2 _Nop();
C51 COMPILER V7.06 I2C_C51 05/09/2005 09:55:25 PAGE 4
180 2 retc=retc<<1;
181 2 if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
182 2 _Nop();
183 2 _Nop();
184 2 }
185 1 SCL=0;
186 1 _Nop();
187 1 _Nop();
188 1 return(retc);
189 1 }
190
191
192
193
194 /**************************************************************************/
195 /*函数名称:void Ack_I2c() */
196 /*功能描述:主控器进行应答信号 */
197 /*输入:a */
198 /*输出:无 */
199 /*创建日期:2004.3.28 */
200 /*修改日期: */
201 /**************************************************************************/
202 void Ack_I2c(bit a)
203 {
204 1
205 1 if(a==0)SDA=0; /*在此发出应答或非应答信号 */
206 1 else SDA=1;
207 1 _Nop();
208 1 _Nop();
209 1 _Nop();
210 1 SCL=1;
211 1 _Nop();
212 1 _Nop(); /*时钟低电平周期大于4μs*/
213 1 _Nop();
214 1 _Nop();
215 1 _Nop();
216 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
217 1 _Nop();
218 1 _Nop();
219 1 }
220
221
222 /**************************************************************************/
223 /*函数名称:bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) */
224 /*功能描述:向有子地址的IIC器件读取多字节数据函数 */
225 /* 从启动总线到发送地址、子地址、结束总线的全过程 */
226 /*调用函数:Start_I2C SendByte() RcvByte() Ack_I2C() Stop_I2c() */
227 /*输入:sla从器件地址、s为读到的数据 */
228 /*返回:1成功 0操作有误 */
229 /*创建日期:2004.3.28 */
230 /*修改日期: */
231 /**************************************************************************/
232
233 bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
234 {
235 1 uchar i;
236 1
237 1 Start_I2c(); /*启动总线*/
238 1 SendByte(sla); /*发送器件地址*/
239 1 if(ack==0)return(0);
240 1 SendByte(suba); /*发送器件子地址*/
241 1 if(ack==0)return(0);
C51 COMPILER V7.06 I2C_C51 05/09/2005 09:55:25 PAGE 5
242 1
243 1 Start_I2c();
244 1 SendByte(sla+1);
245 1 if(ack==0)return(0);
246 1
247 1 for(i=0;i<no-1;i++)
248 1 {
249 2 *s=RcvByte(); /*发送数据*/
250 2 Ack_I2c(0); /*发送就答位*/
251 2 s++;
252 2 }
253 1 *s=RcvByte();
254 1 Ack_I2c(1); /*发送非应位*/
255 1 Stop_I2c(); /*结束总线*/
256 1 return(1);
257 1 }
258
259
260
261
262
263
264 /* 完毕 */
265
266
267
268
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 246 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 6
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 + -