📄 main3.lst
字号:
190 //串口发送子程序
191 void send(uchar cmd)
192 {
193 1 P3_7 = 1;
194 1 SBUF = cmd;
195 1 while(!TI);
196 1 TI=0;
197 1 P3_7 = 0;
198 1
199 1 }
200
201
202 /************************************************************
203 *Function:18B20初始化
204 *************************************************************/
205 void Init18B20 (void)
206 { DQ = 1;
207 1 _nop_();
208 1 DQ = 0;
209 1 TempDelay(150); //延时 480 uS
210 1 TempDelay(200);
211 1 TempDelay(200);
212 1 //_nop_();
213 1 DQ = 1;
214 1 TempDelay(60); //延时 60 uS
215 1 //_nop_();
216 1
217 1 if(DQ == 0)
218 1 Flag = 1; //检测到总线上有 DS1820
219 1 else
220 1 Flag = 0; //没有检测到总线上的 DS1820
221 1
222 1 TempDelay(250); //250
223 1 TempDelay(200);
224 1 //_nop_();
225 1 //_nop_();
226 1 DQ = 1; //释放DS18B20总线
227 1 }
228
229
230 /************************************************************
231 *Function:向18B20写入一个字节
232 *************************************************************/
233 void WriteByte (uchar WR) //单字节写入
234 { uchar i;
235 1
236 1 for (i = 0;i < 8;i++)
237 1 { DQ = 0; //写时间隙开始
238 2 TempDelay(16); //DS18B20总线复位保持16us
239 2 DQ = WR & 0x01; //写一个bit
C51 COMPILER V8.05a MAIN3 03/20/2008 09:46:54 PAGE 5
240 2 TempDelay(45); //等待 45 uS
241 2 //_nop_();
242 2 WR >>= 1;
243 2 DQ = 1; //释放总线准备写入下一位
244 2 _nop_(); //1us 恢复时间
245 2 }
246 1 DQ = 1; //释放DS18B20总线
247 1 }
248
249
250 /************************************************************
251 *Function:读18B20的一个字节
252 *************************************************************/
253 uchar ReadByte (void) //读取单字节
254 { uchar i,u = 0;
255 1
256 1 for(i = 0;i < 8;i++)
257 1 { u >>= 1;
258 2 DQ = 0; //读时间隙开始
259 2 _nop_();
260 2 DQ = 1; //开始读,总线释放
261 2 TempDelay(8); //持续 8 uS
262 2 if(DQ == 1)
263 2 u |= 0x80; //从DS18B20读得一位bit
264 2 TempDelay(45); //持续 60 uS
265 2 DQ = 1; //释放总线准备读下一位
266 2 _nop_(); //1us 恢复时间
267 2 }
268 1 DQ = 1; //重新释放DS18B20 总线
269 1 return(u); //返回从DS18B20总线上获得的数据
270 1 }
271
272
273 /************************************************************
274 *Function:读18B20
275 *************************************************************/
276 void read_18B20 (uchar j)
277 { uchar i;
278 1 for(i = 0;i < j;i++)
279 1 { *p = ReadByte();
280 2 p++;
281 2 }
282 1 }
283
284
285 /************************************************************
286 *Function:CRC校验
287 *************************************************************/
288 uchar CRC (uchar j)
289 { uchar i,crc_data = 0;
290 1 for(i = 0;i < j;i++) //查表校验
291 1 crc_data = CrcTable[crc_data^temp_buff[i]];
292 1 return (crc_data);
293 1 }
294
295
296 /************************************************************
297 *Function:读取温度
298 *************************************************************/
299 void GemTemp (void)
300 { read_18B20 (9);
301 1 if (CRC(9) == 0) //校验正确
C51 COMPILER V8.05a MAIN3 03/20/2008 09:46:54 PAGE 6
302 1 { Temperature = temp_buff[1]*0x100 + temp_buff[0];
303 2 //Temperature *= 0.0625;
304 2 Temperature /= 16;
305 2 TempDelay(1);
306 2 }
307 1 }
308
309
310 /************************************************************
311 *Function:内部配置
312 *************************************************************/
313 void Config18b20 (void) //重新配置报警限定值和分辨率
314 { Init18B20();
315 1 WriteByte(0xCC); //skip rom
316 1 WriteByte(0x4E); //WRite scratchpad
317 1 WriteByte(0x19); //上限
318 1 WriteByte(0x1A); //下限
319 1 WriteByte(0x7F); //set 11 bit (0.125)
320 1
321 1 Init18B20();
322 1 WriteByte(0xCC); //skip rom
323 1 WriteByte(0x48); //保存设定值
324 1
325 1 Init18B20();
326 1 WriteByte(0xCC); //skip rom
327 1 WriteByte(0xB8); //回调设定值
328 1 }
329
330
331 /************************************************************
332 *Function:读18B20ID
333 *************************************************************/
334 void ReadID (void) //读取器件 id
335 { Init18B20();
336 1 WriteByte(0x33); //read rom
337 1 read_18B20(8);
338 1 }
339
340
341 /************************************************************
342 *Function:18B20ID全处理
343 *************************************************************/
344 void TemperatuerResult(void)
345 { p = ID_buff;
346 1 ReadID(); //读取ID
347 1 Config18b20(); //内部配置
348 1
349 1 Init18B20 (); //复位
350 1 WriteByte(0xCC); //skip rom
351 1 WriteByte(0x44); //开始温度转换
352 1 DQ = 1;
353 1 TempDelay(200);
354 1 TempDelay(200);
355 1 TempDelay(200);
356 1
357 1 Init18B20 (); //复位
358 1 WriteByte(0xCC); //skip rom
359 1 WriteByte(0xBE); //读取暂存器和CRC 字节
360 1 p = temp_buff;
361 1 GemTemp();
362 1 }
363
C51 COMPILER V8.05a MAIN3 03/20/2008 09:46:54 PAGE 7
364
365 //串口接收中断
366 void uart_isr() interrupt 4
367 {
368 1 EA = 0;
369 1
370 1 comData = SBUF; //接收数据
371 1 RI = 0;
372 1
373 1 EA = 1;
374 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 542 ----
CONSTANT SIZE = 256 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 23
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 2 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -