📄 i2c.lst
字号:
4 =2 //定义按键
5 =2 sbit KEY1 = P3^2; //按键1
6 =2 sbit KEY2 = P3^3; //按键2
C51 COMPILER V8.16 I2C 10/04/2008 14:53:01 PAGE 6
7 =2
8 =2 sbit Buzzer=P2^4;//????
9 =2
10 =2 #define TemperatureMax 50
11 =2
12 =2 #define TemperatureMin 5
13 =2
14 =2 void INTInit();
15 =2
16 =2 #endif
17 =2
16 =1
17 =1 sbit LEDCool = P2^0; //定义LED由P0.0控制
18 =1 sbit LEDHot = P2^1; //定义LED由P0.0控制
19 =1 sbit LEDSet = P2^2; //定义LED由P0.0控制
20 =1
21 =1
22 =1 //unsigned char Temperature_Set;//设定温度
23 =1
24 =1 #endif
10
11 //定义延时变量,用于宏I2C_Delay()
12 unsigned char data I2C_Delay_t;
13
14 /*
15 宏定义:I2C_Delay()
16 功能:延时,模拟I2C总线专用
17 */
18 #define I2C_Delay()\
19 {\
20 I2C_Delay_t = (I2C_DELAY_VALUE);\
21 while ( --I2C_Delay_t != 0 );\
22 }
23
24
25 /*
26 函数:I2C_Init()
27 功能:I2C总线初始化,使总线处于空闲状态
28 说明:在main()函数的开始处,通常应当要执行一次本函数
29 */
30 void I2C_Init()
31 {
32 1 I2C_SCL = 1;
33 1 I2C_Delay();
34 1 I2C_SDA = 1;
35 1 I2C_Delay();
36 1 }
37
38
39 /*
40 函数:I2C_Start()
41 功能:产生I2C总线的起始状态
42 说明:
43 SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
44 不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态
45 本函数也可以用来产生重复起始状态
46 本函数执行后,I2C总线处于忙状态
47 */
48 void I2C_Start()
49 {
50 1 I2C_SDA = 1;
51 1 I2C_Delay();
C51 COMPILER V8.16 I2C 10/04/2008 14:53:01 PAGE 7
52 1 I2C_SCL = 1;
53 1 I2C_Delay();
54 1 I2C_SDA = 0;
55 1 I2C_Delay();
56 1 I2C_SCL = 0;
57 1 I2C_Delay();
58 1 }
59
60
61 /*
62 函数:I2C_Write()
63 功能:向I2C总线写1个字节的数据
64 参数:
65 dat:要写到总线上的数据
66 */
67 void I2C_Write(unsigned char dat)
68 {
69 1 unsigned char t = 8;
70 1 do
71 1 {
72 2 I2C_SDA = (bit)(dat & 0x80);
73 2 dat <<= 1;
74 2 I2C_SCL = 1;
75 2 I2C_Delay();
76 2 I2C_SCL = 0;
77 2 I2C_Delay();
78 2 } while ( --t != 0 );
79 1 }
80
81
82 /*
83 函数:I2C_Read()
84 功能:从从机读取1个字节的数据
85 返回:读取的一个字节数据
86 */
87 unsigned char I2C_Read()
88 {
89 1 unsigned char dat;
90 1 unsigned char t = 8;
91 1 I2C_SDA = 1; //在读取数据之前,要把SDA拉高
92 1 do
93 1 {
94 2 I2C_SCL = 1;
95 2 I2C_Delay();
96 2 dat <<= 1;
97 2 if ( I2C_SDA ) dat |= 0x01;
98 2 I2C_SCL = 0;
99 2 I2C_Delay();
100 2 } while ( --t != 0 );
101 1 return dat;
102 1 }
103
104
105 /*
106 函数:I2C_GetAck()
107 功能:读取从机应答位
108 返回:
109 0:从机应答
110 1:从机非应答
111 说明:
112 从机在收到每个字节的数据后,要产生应答位
113 从机在收到最后1个字节的数据后,一般要产生非应答位
C51 COMPILER V8.16 I2C 10/04/2008 14:53:01 PAGE 8
114 */
115 bit I2C_GetAck()
116 {
117 1 bit ack;
118 1 I2C_SDA = 1;
119 1 I2C_Delay();
120 1 I2C_SCL = 1;
121 1 I2C_Delay();
122 1 ack = I2C_SDA;
123 1 I2C_SCL = 0;
124 1 I2C_Delay();
125 1 return ack;
126 1 }
127
128
129 /*
130 函数:I2C_PutAck()
131 功能:主机产生应答位或非应答位
132 参数:
133 ack=0:主机产生应答位
134 ack=1:主机产生非应答位
135 说明:
136 主机在接收完每一个字节的数据后,都应当产生应答位
137 主机在接收完最后一个字节的数据后,应当产生非应答位
138 */
139 void I2C_PutAck(bit ack)
140 {
141 1 I2C_SDA = ack;
142 1 I2C_Delay();
143 1 I2C_SCL = 1;
144 1 I2C_Delay();
145 1 I2C_SCL = 0;
146 1 I2C_Delay();
147 1 }
148
149
150 /*
151 函数:I2C_Stop()
152 功能:产生I2C总线的停止状态
153 说明:
154 SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
155 不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态
156 本函数执行后,I2C总线处于空闲状态
157 */
158 void I2C_Stop()
159 {
160 1 unsigned int t = I2C_STOP_WAIT_VALUE;
161 1 I2C_SDA = 0;
162 1 I2C_Delay();
163 1 I2C_SCL = 1;
164 1 I2C_Delay();
165 1 I2C_SDA = 1;
166 1 I2C_Delay();
167 1 while ( --t != 0 ); //在下一次产生Start之前,要加一定的延时
168 1 }
169
170
171 /*
172 函数:I2C_Puts()
173 功能:主机通过I2C总线向从机发送多个字节的数据
174 参数:
175 SlaveAddr:从机地址(高7位是从机地址,最低位是写标志0)
C51 COMPILER V8.16 I2C 10/04/2008 14:53:01 PAGE 9
176 SubAddr:从机的子地址
177 Size:数据的字节数
178 *dat:要发送的数据
179 返回:
180 0:发送成功
181 1:在发送过程中出现异常
182 */
183 bit I2C_Puts(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)
184 {
185 1 //检查长度
186 1 if ( Size == 0 ) return 0;
187 1 //确保从机地址最低位是0
188 1 SlaveAddr &= 0xFE;
189 1 //启动I2C总线
190 1 I2C_Start();
191 1 //发送从机地址
192 1 I2C_Write(SlaveAddr);
193 1 if ( I2C_GetAck() )
194 1 {
195 2 I2C_Stop();
196 2 return 1;
197 2 }
198 1 //发送子地址
199 1 I2C_Write(SubAddr);
200 1 if ( I2C_GetAck() )
201 1 {
202 2 I2C_Stop();
203 2 return 1;
204 2 }
205 1 //发送数据
206 1 do
207 1 {
208 2 I2C_Write(*dat++);
209 2 if ( I2C_GetAck() )
210 2 {
211 3 I2C_Stop();
212 3 return 1;
213 3 }
214 2 } while ( --Size != 0 );
215 1 //发送完毕,停止I2C总线,并返回结果
216 1 I2C_Stop();
217 1 return 0;
218 1 }
219
220 bit I2C_Puts_s(unsigned char SlaveAddr, unsigned char SubAddr)
221 {
222 1 //检查长度
223 1 //if ( Size == 0 ) return 0;
224 1 //确保从机地址最低位是0
225 1 SlaveAddr &= 0xFE;
226 1 //启动I2C总线
227 1 I2C_Start();
228 1 //发送从机地址
229 1 I2C_Write(SlaveAddr);
230 1 if ( I2C_GetAck() )
231 1 {
232 2 I2C_Stop();
233 2 return 1;
234 2 }
235 1 //发送子地址
236 1 I2C_Write(SubAddr);
237 1 if ( I2C_GetAck() )
C51 COMPILER V8.16 I2C 10/04/2008 14:53:01 PAGE 10
238 1 {
239 2 I2C_Stop();
240 2 return 1;
241 2 }
242 1 //发送数据
243 1 /*
244 1 do
245 1 {
246 1 I2C_Write(*dat++);
247 1 if ( I2C_GetAck() )
248 1 {
249 1 I2C_Stop();
250 1 return 1;
251 1 }
252 1 } while ( --Size != 0 );
253 1 //发送完毕,停止I2C总线,并返回结果
254 1 I2C_Stop();
255 1 return 0;
256 1 */
257 1 }
258 /*
259 函数:I2C_Put()
260 功能:主机通过I2C总线向从机发送1个字节的数据
261 参数:
262 SlaveAddr:从机地址(高7位是从机地址,最低位是写标志0)
263 SubAddr:从机的子地址
264 dat:要发送的数据
265 返回:
266 0:发送成功
267 1:在发送过程中出现异常
268 */
269 bit I2C_Put(unsigned char SlaveAddr, unsigned char SubAddr, char dat)
270 {
271 1 return I2C_Puts(SlaveAddr,SubAddr,1,&dat);
272 1 }
273
274
275 /*
276 函数:I2C_Gets()
277 功能:主机通过I2C总线从从机接收多个字节的数据
278 参数:
279 SlaveAddr:从机地址(高7位是从机地址,最低位是读标志1)
280 SubAddr:从机的子地址
281 Size:数据的字节数
282 *dat:保存接收到的数据
283 返回:
284 0:接收成功
285 1:在接收过程中出现异常
286 */
287 bit I2C_Gets(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)
288 {
289 1 //检查长度
290 1 if ( Size == 0 ) return 0;
291 1 //确保从机地址最低位是0
292 1 SlaveAddr &= 0xFE; //确保最低位是0
293 1 //启动I2C总线
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -