📄 ds1302.lst
字号:
311 1 else
312 1 {
313 2 Time->TimeString[3] = ' ';
314 2 Time->TimeString[4] = ' ';
315 2 }
316 1 Time->TimeString[5] = ':';
317 1 if(hide_sec<2)
318 1 {
319 2 Time->TimeString[6] = Time->Second/10 + '0';
320 2 Time->TimeString[7] = Time->Second%10 + '0';
321 2 }
322 1 else
323 1 {
324 2 Time->TimeString[6] = ' ';
325 2 Time->TimeString[7] = ' ';
326 2 }
327 1 Time->TimeString[8] = '\0';
328 1 }
329
330 //******************************
331 //时钟芯片初始化
332 //******************************
333 void Initial_DS1302(void)
334 {
335 1 uchar Second=Read1302(DS1302_SECOND);
336 1 if(Second&0x80) //判断时钟芯片是否关闭
337 1 {
338 2 Write1302(0x8e,0x00); //写入允许
339 2 Write1302(0x8c,0x07); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55
340 2 Write1302(0x88,0x07);
341 2 Write1302(0x86,0x25);
342 2 Write1302(0x8a,0x07);
343 2 Write1302(0x84,0x23);
344 2 Write1302(0x82,0x59);
345 2 Write1302(0x80,0x55);
346 2 Write1302(0x8e,0x80); //禁止写入
347 2 }
348 1
349 1 }
350
351 //****************************************
352 //ds18b20子程序模块
353 //****************************************
354
355
356 /***********ds18b20子程序*************************/
357
358 /***********ds18b20延迟子函数(晶振12MHz )*******/
359
360 void delay_18B20(unsigned int i)
361 {
362 1 while(i--);
363 1 }
C51 COMPILER V6.12 DS1302 09/30/2007 20:22:51 PAGE 7
364
365 /**********ds18b20初始化函数**********************/
366
367 void Init_DS18B20(void)
368 {
369 1 unsigned char x=0;
370 1 DQ = 1; //DQ复位
371 1 delay_18B20(8); //稍做延时
372 1 DQ = 0; //单片机将DQ拉低
373 1 delay_18B20(40); //精确延时 大于 480us
374 1 DQ = 1; //拉高总线
375 1 delay_18B20(7);
376 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
377 1 delay_18B20(10);
378 1 }
379
380 /***********ds18b20读一个字节**************/
381
382 uchar ReadOneChar(void)
383 {
384 1 uchar i=0;
385 1 uchar dat = 0;
386 1 for (i=8;i>0;i--)
387 1 {
388 2 DQ = 0; // 给脉冲信号
389 2 dat>>=1;
390 2 DQ = 1; // 给脉冲信号
391 2 if(DQ)
392 2 dat|=0x80;
393 2 delay_18B20(4);
394 2 }
395 1 return(dat);
396 1 }
397
398 /*************ds18b20写一个字节****************/
399
400 void WriteOneChar(uchar dat)
401 {
402 1 uchar i=0;
403 1 for (i=8; i>0; i--)
404 1 {
405 2 DQ = 0;
406 2 DQ = dat&0x01;
407 2 delay_18B20(5);
408 2 DQ = 1;
409 2 dat>>=1;
410 2 }
411 1 }
412
413 /**************读取ds18b20当前温度************/
414
415 void ReadTemp(void)
416 {
417 1 uchar a=0;
418 1 uchar b=0;
419 1 uchar t;
420 1
421 1 Init_DS18B20();
422 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
423 1 WriteOneChar(0x44); // 启动温度转换
424 1
425 1 delay_18B20(100); // this message is wery important
C51 COMPILER V6.12 DS1302 09/30/2007 20:22:51 PAGE 8
426 1
427 1 Init_DS18B20();
428 1 WriteOneChar(0xCC); //跳过读序号列号的操作
429 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
430 1
431 1 delay_18B20(50);
432 1
433 1 a=ReadOneChar(); //读取温度值低位
434 1 b=ReadOneChar(); //读取温度值高位
435 1 t=b&0xf8;
436 1 if(t)
437 1 {
438 2 TempBuffer[0]=':';
439 2 TempBuffer[1]='-';
440 2 temp_value=b<<4;
441 2 temp_value+=(a&0xf0)>>4;
442 2 temp_value=~temp_value+1;
443 2 temp1_value=~a&0x0f;
444 2 }
445 1 else
446 1 {
447 2 temp_value=b<<4;
448 2 temp_value+=(a&0xf0)>>4;
449 2 temp1_value=a&0x0f;
450 2 TempBuffer[0]=':';
451 2 TempBuffer[1]=temp_value/100+'0'; //百位
452 2 if(TempBuffer[1]=='1')
453 2 {
454 3 TempBuffer[1]='1';
455 3 }
456 2 else
457 2 {
458 3 TempBuffer[1]=' ';
459 3 }
460 2 }
461 1 }
462 void temp_to_str() //温度数据转换成液晶字符显示
463 {
464 1
465 1 TempBuffer[2]=temp_value%100/10+'0'; //十位
466 1 TempBuffer[3]=temp_value%10+'0'; //个位
467 1 TempBuffer[4]='.';
468 1 TempBuffer[5]=temp1_value*625/1000%10+'0';
469 1 //TempBuffer[6]=temp1_value*625/100%10+'0';
470 1 //TempBuffer[7]=temp1_value*625/10%10+'0';
471 1 //TempBuffer[8]=temp1_value*625%10+'0';
472 1 TempBuffer[6]='\0';
473 1 }
474 //**********************************************
475 //延时子程序模块
476 //**********************************************
477 void mdelay(uint delay)
478 { uint i;
479 1 for(;delay>0;delay--)
480 1 {for(i=0;i<80;i++) //1ms延时.
481 2 {;}
482 2 }
483 1 }
484
485 //************************************************
486 //按键设置程序模块
487 //************************************************
C51 COMPILER V6.12 DS1302 09/30/2007 20:22:51 PAGE 9
488
489 //************************************
490 //跳出调整模式,返回默认显示
491 //************************************
492 void outkey()
493 { uchar Second;
494 1 if(out==0)
495 1 { mdelay(5);
496 2 count=0;
497 2 hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
498 2 Second=Read1302(DS1302_SECOND);
499 2 Write1302(0x8e,0x00); //写入允许
500 2 Write1302(0x80,Second&0x7f);
501 2 Write1302(0x8E,0x80); //禁止写入
502 2 done=0;
503 2 }
504 1 }
505 //////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
506 //*************************
507 //升序按键
508 //*************************
509 void Upkey()
510 {
511 1 Up=1;
512 1 if(Up==0)
513 1 {
514 2 mdelay(5);
515 2 switch(count)
516 2 {case 1:
517 3 temp=Read1302(DS1302_SECOND); //读取秒数
518 3 temp=((temp&0x70)>>4)*10 + (temp&0x0F);
519 3 temp=temp+1; //秒数加1
520 3 up_flag=1; //数据调整后更新标志
521 3 if((temp)>59) //超过59秒,清零
522 3 temp=0;
523 3 temp=temp/10*16+temp%10;
524 3 break;
525 3 case 2:
526 3 temp=Read1302(DS1302_MINUTE); //读取分数
527 3 temp=((temp&0x70)>>4)*10 + (temp&0x0F);
528 3 temp=temp+1; //分数加1
529 3 up_flag=1;
530 3 if(temp>59) //超过59分,清零
531 3 temp=0;
532 3 temp=temp/10*16+temp%10;
533 3 break;
534 3 case 3:
535 3 temp=Read1302(DS1302_HOUR); //读取小时数
536 3 temp=((temp&0x70)>>4)*10 + (temp&0x0F);
537 3 temp=temp+1; //小时数加1
538 3 up_flag=1;
539 3 if(temp>23) //超过23小时,清零
540 3 temp=0;
541 3 temp=temp/10*16+temp%10;
542 3 break;
543 3 case 4:
544 3 temp=Read1302(DS1302_WEEK); //读取星期数
545 3 temp=((temp&0x70)>>4)*10 + (temp&0x0F);
546 3 temp=temp+1; //星期数加1
547 3 up_flag=1;
548 3 if(temp>7)
C51 COMPILER V6.12 DS1302 09/30/2007 20:22:51 PAGE 10
549 3 temp=1;
550 3 temp=temp/10*16+temp%10;
551 3 break;
552 3 case 5:
553 3 temp=Read1302(DS1302_DAY); //读取日数
554 3 temp=((temp&0x70)>>4)*10 + (temp&0x0F);
555 3 temp=temp+1; //日数加1
556 3 up_flag=1;
557 3 if(temp>31)
558 3 temp=1;
559 3 temp=temp/10*16+temp%10;
560 3 break;
561 3 case 6:
562 3 temp=Read1302(DS1302_MONTH); //读取月数
563 3 temp=((temp&0x70)>>4)*10 + (temp&0x0F);
564 3 temp=temp+1; //月数加1
565 3 up_flag=1;
566 3 if(temp>12)
567 3 temp=1;
568 3 temp=temp/10*16+temp%10;
569 3 break;
570 3 case 7:
571 3 temp=Read1302(DS1302_YEAR); //读取年数
572 3 temp=((temp&0xf0)>>4)*10 + (temp&0x0F);
573 3 temp=temp+1; //年数加1
574 3 up_flag=1;
575 3 if(temp>99)
576 3 temp=0;
577 3 temp=temp/10*16+temp%10;
578 3 break;
579 3 default:break;
580 3 }
581 2
582 2 // while(Up==0);
583 2 }
584 1 }
585
586 //////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
587 //************************
588 //降序按键
589 //************************
590 void Downkey()
591 {
592 1 Down=1;
593 1 if(Down==0)
594 1 {
595 2 mdelay(5);
596 2 switch(count)
597 2 {case 1:
598 3 temp=Read1302(DS1302_SECOND); //读取秒数
599 3 temp=((temp&0x70)>>4)*10 + (temp&0x0F);
600 3 temp=temp-1; //秒数减1
601 3 down_flag=1; //数据调整后更新标志
602 3 if(temp==-1) //小于0秒,返回59秒
603 3 temp=59;
604 3 temp=temp/10*16+temp%10;
605 3 break;
606 3 case 2:
607 3 temp=Read1302(DS1302_MINUTE); //读取分数
608 3 temp=((temp&0x70)>>4)*10 + (temp&0x0F);
609 3 temp=temp-1; //分数减1
C51 COMPILER V6.12 DS1302 09/30/2007 20:22:51 PAGE 11
610 3 down_flag=1;
611 3 if(temp==-1)
612 3 temp=59; //小于0秒,返回59秒
613 3 temp=temp/10*16+temp%10;
614 3 break;
615 3 case 3:
616 3 temp=Read1302(DS1302_HOUR); //读取小时数
617 3 temp=((temp&0x70)>>4)*10 + (temp&0x0F);
618 3 temp=temp-1; //小时数减1
619 3 down_flag=1;
620 3 if(temp==-1)
621 3 temp=23;
622 3 temp=temp/10*16+temp%10;
623 3 break;
624 3 case 4:
625 3 temp=Read1302(DS1302_WEEK); //读取星期数;
626 3 temp=((temp&0x70)>>4)*10 + (temp&0x0F);
627 3 temp=temp-1; //星期数减1
628 3 down_flag=1;
629 3 if(temp==0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -