📄 0.lst
字号:
240 2 }
241 1
C51 COMPILER V8.02 0 06/29/2010 15:15:13 PAGE 5
242 1 return (dat);
243 1 }
244
245 /*******************************************************************/
246 /* */
247 /* 写一位 */
248 /* */
249 /*******************************************************************/
250 void write_bit(char bitval) {
251 1 DQ = 0; // 将DQ 拉低开始写时间隙
252 1 if(bitval==1) DQ =1; // 如果写1,DQ 返回高电平
253 1 Delay(5); // 在时间隙内保持电平值,
254 1 DQ = 1; // Delay函数每次循环延时16μs,因此delay(5) = 104μs
255 1 }
256
257 /*******************************************************************/
258 /* */
259 /* 写一个字节 */
260 /* */
261 /*******************************************************************/
262 WriteOneChar(unsigned char dat)
263 {
264 1 unsigned char i = 0;
265 1 unsigned char temp;
266 1 // for (i = 8; i > 0; i--)
267 1 // {
268 1 for (i=0; i<8; i++) // 写入字节, 每次写入一位
269 1 {
270 2 // DQ = 0;
271 2 // DQ = dat&0x01;
272 2 // Delay(5);
273 2
274 2 // DQ = 1;
275 2 temp = dat>>i;
276 2 temp &= 0x01;
277 2 write_bit(temp);
278 2 // dat>>=1;
279 2
280 2 }
281 1 Delay(5);
282 1 }
283
284 /*******************************************************************/
285 /* */
286 /* 读取64位序列码 */
287 /* */
288 /*******************************************************************/
289 Read_RomCord(void)
290 {
291 1 unsigned char j;
292 1 Init_DS18B20();
293 1
294 1 WriteOneChar(0x33); // 读序列码的操作
295 1 for (j = 0; j < 8; j++)
296 1 {
297 2 RomCode[j] = ReadOneChar() ;
298 2 }
299 1 }
300
301 /*******************************************************************/
302 /* */
303 /*DS18B20的CRC8校验程序 */
C51 COMPILER V8.02 0 06/29/2010 15:15:13 PAGE 6
304 /* */
305 /*******************************************************************/
306 uchar CRC8()
307 {
308 1 uchar i,x; uchar crcbuff;
309 1
310 1 crc=0;
311 1 for(x = 0; x <8; x++)
312 1 {
313 2 crcbuff=RomCode[x];
314 2 for(i = 0; i < 8; i++)
315 2 {
316 3 if(((crc ^ crcbuff)&0x01)==0)
317 3 crc >>= 1;
318 3 else {
319 4 crc ^= 0x18; //CRC=X8+X5+X4+1
320 4 crc >>= 1;
321 4 crc |= 0x80;
322 4 }
323 3 crcbuff >>= 1;
324 3 }
325 2 }
326 1 return crc;
327 1 }
328 /*******************************************************************/
329 /* */
330 /* 数据转换与显示 */
331 /* */
332 /*******************************************************************/
333
334 Disp_RomCode()
335 {
336 1 uchar j;
337 1 uchar H_num=0x40; //LCD第二行初始位置
338 1
339 1 for(j=0;j<8;j++)
340 1 {
341 2 Temp = RomCode[j];
342 2
343 2 display[0]=((Temp&0xf0)>>4);
344 2 if(display[0]>9)
345 2 { display[0]=display[0]+0x37;}
346 2 else{display[0]=display[0]+0x30;}
347 2
348 2 lcd_pos(H_num);
349 2 lcd_wdat(display[0]); //高位数显示
350 2
351 2 H_num++;
352 2 display[1]=(Temp&0x0f);
353 2 if(display[1]>9)
354 2 {display[1]=display[1]+0x37;}
355 2 else {display[1]=display[1]+0x30;}
356 2
357 2 lcd_pos(H_num);
358 2 lcd_wdat(display[1]); //低位数显示
359 2 H_num++;
360 2 }
361 1 }
362
363 /*******************************************************************/
364 /* */
365 /* 蜂鸣器响一声 */
C51 COMPILER V8.02 0 06/29/2010 15:15:13 PAGE 7
366 /* */
367 /*******************************************************************/
368 void beep()
369 {
370 1 unsigned char y;
371 1 for (y=0;y<100;y++)
372 1 {
373 2 Delay(60);
374 2 BEEP=!BEEP; //BEEP取反
375 2 }
376 1 BEEP=1; //关闭蜂鸣器
377 1 Delay(40000);
378 1 }
379
380 /*******************************************************************/
381 /* */
382 /* DS18B20 OK 显示菜单 */
383 /* */
384 /*******************************************************************/
385 void Ok_Menu ()
386 {
387 1 uchar m;
388 1 lcd_init(); //初始化LCD
389 1
390 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
391 1 m = 0;
392 1 while(cdis1[m] != '\0')
393 1 { //显示字符
394 2 lcd_wdat(cdis1[m]);
395 2 m++;
396 2 }
397 1
398 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
399 1 m = 0;
400 1 while(cdis2[m] != '\0')
401 1 {
402 2 lcd_wdat(cdis2[m]); //显示字符
403 2 m++;
404 2 }
405 1 }
406
407 /*******************************************************************/
408 /* */
409 /* DS18B20 ERROR 显示菜单 */
410 /* */
411 /*******************************************************************/
412 void Error_Menu ()
413 {
414 1 uchar m;
415 1 lcd_init(); //初始化LCD
416 1
417 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
418 1 m = 0;
419 1 while(cdis3[m] != '\0')
420 1 { //显示字符
421 2 lcd_wdat(cdis3[m]);
422 2 m++;
423 2 }
424 1
425 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
426 1 m = 0;
427 1 while(cdis4[m] != '\0')
C51 COMPILER V8.02 0 06/29/2010 15:15:13 PAGE 8
428 1 {
429 2 lcd_wdat(cdis4[m]); //显示字符
430 2 m++;
431 2 }
432 1 }
433
434 /*******************************************************************/
435 /* */
436 /* 主函数 */
437 /* */
438 /*******************************************************************/
439 void main()
440 {
441 1 P0 = 0xff;
442 1 P2 = 0xff;
443 1
444 1 while(1)
445 1 {
446 2 Ok_Menu ();
447 2 Read_RomCord(); //读取64位序列码
448 2 CRC8(); //CRC效验
449 2 if(crc==0) //CRC效验正确
450 2 {
451 3 Disp_RomCode(); //显示64位序列码
452 3 beep();
453 3 }
454 2 while(!presence)
455 2 {
456 3 Init_DS18B20();
457 3 delay1(1000);
458 3 }
459 2
460 2 Error_Menu ();
461 2 do
462 2 {
463 3 Init_DS18B20();
464 3 beep();
465 3 }
466 2 while(presence);
467 2 }
468 1 }
469
470 /*******************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 639 ----
CONSTANT SIZE = 68 ----
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 + -