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