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