📄 i2c_51.lst
字号:
C51 COMPILER V7.50 I2C_51 06/18/2006 10:39:05 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE I2C_51
OBJECT MODULE PLACED IN I2C_51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C_51.C ROM(SMALL) BROWSE DEBUG OBJECTEXTEND
line level source
1 /***************************I2C_51.C****************************************************
2 此程序包括发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,能很方便的与用户程序连接
-并扩展。
3 需要注意的是,函数是采用软件延时的方法产生SCL脉冲,对高晶振频率要做一定的修改(本例是1us机器周期,即晶
-振频率要小于12MHZ)
4 ********************************************************************************************/
5
6 #include "reg52.h"
7 #include "intrins.h"
8
9 #define uchar unsigned char
10 #define uint unsigned int
11 #define _Nop() _nop_()
12
13 void Start_I2C(void);
14 void Stop_I2C(void);
15 void SendB(unsigned char c);
16 unsigned char RcvB(void);
17 void Ack_I2C(bit a);
18 //bit ISendB(unsigned char sla, unsigned char c);
19 //bit IRcvB(unsigned char sla, unsigned char * c);
20 bit ISendStr(unsigned char sla, unsigned char suba, unsigned char * s,unsigned char no);
21 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char * s,unsigned char no);
22 /*端口位定义*/
23 sbit SDA = P3^2;//模拟I2C数据传送位
24 sbit SCL = P3^3;//模拟I2C时钟控制位
25
26 /*状态标志*/
27 bit ack;//应答标志位
28
29 /**********************************void Start_I2C()*********************************
30 该函数是启动总线函数,功能是启动I2C总线,即发送I2C起始条件
31 *********************************************************************************/
32
33 void Start_I2C(void)
34 {
35 1 SDA = 1;//发送起始条件的数据信号
36 1 _Nop();
37 1 SCL = 1;
38 1 _Nop();//起始条件建立时间大于4.7us,延时
39 1 _Nop();
40 1 _Nop();
41 1 _Nop();
42 1 _Nop();
43 1 SDA = 0;//发送起始信号
44 1 _Nop();//起始条件锁定时间大于4us
45 1 _Nop();
46 1 _Nop();
47 1 _Nop();
48 1 _Nop();
49 1 SCL = 0;//嵌住I2C总线准备发送或接收数据
50 1 _Nop();
51 1 _Nop();
52 1 }
53
C51 COMPILER V7.50 I2C_51 06/18/2006 10:39:05 PAGE 2
54 /******************************************************************
55 该函数为结束总线函数,功能是结束I2C总线,即发送I2C结束条件
56 ******************************************************************/
57 void Stop_I2C(void)
58 {
59 1 SDA = 0;//发送结束条件的数据信号
60 1 _Nop();
61 1 SCL = 1;//发送结束条件的时钟信号
62 1 _Nop();//结束条件建立时间大于4us
63 1 _Nop();
64 1 _Nop();
65 1 _Nop();
66 1 _Nop();
67 1 SDA = 1;//发送I2C总线结束信号
68 1 _Nop();
69 1 _Nop();
70 1 _Nop();
71 1 _Nop();
72 1 }
73
74
75
76 /*********************void SendB(unsigned char c)*********************************
77 该函数为字节数据传送函数,功能是将数据c发送出去,可以是地址,也可以是数据,发送完毕后等待应答,
78 并对此状态位进行操作(不应答或非应答都使ack = 0,假)。发送数据正常ack = 1;ack = 0表示被控制
79 器无应答或损坏。
80 ****************************************************************/
81 void SendB(unsigned char c)
82 {
83 1 unsigned char BitCnt;
84 1
85 1 for(BitCnt = 0;BitCnt < 8;BitCnt++)//要传送的数据长度为8位
86 1 {
87 2 if((c<<BitCnt)&0x80)
88 2 SDA = 1;//判断发送位//判断需要发送的bit为0还是1
89 2 else
90 2 SDA = 0;
91 2 _Nop();
92 2
93 2 SCL = 1;//置时钟线为高,通知被控制器开始接收数据位
94 2 _Nop();
95 2 _Nop();//保证时钟高电平周期大于4us
96 2 _Nop();
97 2 _Nop();
98 2 _Nop();
99 2
100 2 SCL = 0;
101 2 }
102 1 _Nop();
103 1 _Nop();
104 1
105 1 SDA = 1;//8位发送完毕后,释放数据线准备接收应答位
106 1 _Nop();
107 1 _Nop();
108 1
109 1 SCL = 1;
110 1 _Nop();
111 1 _Nop();
112 1 _Nop();
113 1
114 1 if(SDA == 1)
115 1 ack = 0;//判断是否接收到应答信号
C51 COMPILER V7.50 I2C_51 06/18/2006 10:39:05 PAGE 3
116 1 else
117 1 ack = 1;
118 1
119 1 SCL = 0;
120 1 _Nop();
121 1 _Nop();
122 1 }
123 /***************************unsigned char RcvB()******************************
124 该函数是字节数据传送函数,功能:接收从器件传来的数据,并判断总线错误(不发应答信号),
125 发送完毕后调用应答函数。
126 ************************************************************************/
127
128 unsigned char RcvB(void)
129 {
130 1 unsigned char retc;
131 1 unsigned char BitCnt;
132 1
133 1 retc = 0;
134 1
135 1 SDA = 1;
136 1 for(BitCnt = 0;BitCnt < 8;BitCnt++)
137 1 {
138 2 _Nop();
139 2 SCL = 0;//置时钟总线为低,准备接收数据
140 2 _Nop();
141 2 _Nop();//时钟低电平大于4us
142 2 _Nop();
143 2 _Nop();
144 2 _Nop();
145 2
146 2 SCL = 1;//置时钟总线为高,是数据线上数据有效
147 2 _Nop();
148 2 _Nop();
149 2
150 2 retc = retc << 1;
151 2 if(SDA == 1) retc = retc + 1;//读数据位,接收的数据位放入retc中
152 2 _Nop();
153 2 _Nop();
154 2 }
155 1
156 1 SCL = 0;
157 1 _Nop();
158 1 _Nop();
159 1 return(retc);
160 1 }
161
162 /***********************************void Ack_I2C(bit a)*********************************
163 该函数为应答函数,功能:主控制器进行应答信号(主机发送的应答信号)(对于从机的应答信号,主机只需要检测)
164 ******************************************************************************************/
165
166 void Ack_I2C(bit a)
167 {
168 1 if(a == 0)
169 1 SDA = 0;//在此发出应答或非应答信号
170 1 else
171 1 SDA = 1;
172 1 _Nop();
173 1 _Nop();
174 1 _Nop();
175 1
176 1 SCL = 1;
177 1 _Nop();//时钟低电平周期大于4us
C51 COMPILER V7.50 I2C_51 06/18/2006 10:39:05 PAGE 4
178 1 _Nop();
179 1 _Nop();
180 1 _Nop();
181 1 _Nop();
182 1
183 1 SCL = 0;//清时钟线,嵌住I2C总线以便接收
184 1 _Nop();
185 1 _Nop();
186 1 }
187
188 /******************************bit ISendB(unsigned char sla, unsigned char c)*****************************
-****
189 该函数为无子地址器件发送字节数据函数,功能:从启动总线到发送地址、数据,结束总线的全过程,从器件地址sla,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -