📄 生日提醒.lst
字号:
442 1 { //公历日在春节后或就是春节当日使用下面代码进行运算
443 2 tenp4-=tenp3;
444 2 yue=0x1;
445 2 yue_p=0x1; //yue_p为月份指向,公历日在春节前或就是春节当日yue_p指向首月
446 2 flag2=get_moon_ri(yue_p,table_addr);
447 2 //检查该农历月为大小还是小月,大月返回1,小月返回0
448 2 flag_y=0;
449 2 if(flag2==0)tenp1=0x1d; //小月29天
450 2 else tenp1=0x1e; //大小30天
451 2 tenp2=nian_code[table_addr]&0xf0;
452 2 tenp2=_cror_(tenp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月
453 2 while(tenp4>=tenp1)
454 2 {
455 3 tenp4-=tenp1;
456 3 yue_p+=1;
457 3 if(yue==tenp2)
458 3 {
459 4 flag_y=~flag_y;
460 4 if(flag_y==0)
461 4 yue+=1;
462 4 }
463 3 else yue+=1;
464 3 flag2=get_moon_ri(yue_p,table_addr);
465 3 if(flag2==0)tenp1=0x1d;
466 3 else tenp1=0x1e;
467 3 }
468 2 ri=tenp4+1;
469 2 }
470 1 else
471 1 { //公历日在春节前使用下面代码进行运算
472 2 tenp3-=tenp4;
473 2 if (nian==0x0)
474 2 {
475 3 nian=0x63;c=1;
476 3 }
477 2 else nian-=1;
478 2 table_addr-=0x3;
479 2 yue=0xc;
480 2 tenp2=nian_code[table_addr]&0xf0;
481 2 tenp2=_cror_(tenp2,4);
482 2 if (tenp2==0)
483 2 yue_p=0xc;
484 2 else
485 2 yue_p=0xd; //
C51 COMPILER V8.08 蒧日提醒 10/25/2011 08:42:07 PAGE 9
486 2 /*yue_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12*/
487 2 flag_y=0;
488 2 flag2=get_moon_ri(yue_p,table_addr);
489 2 if(flag2==0)tenp1=0x1d;
490 2 else tenp1=0x1e;
491 2 while(tenp3>tenp1)
492 2 {
493 3 tenp3-=tenp1;
494 3 yue_p-=1;
495 3 if(flag_y==0)yue-=1;
496 3 if(yue==tenp2)flag_y=~flag_y;
497 3 flag2=get_moon_ri(yue_p,table_addr);
498 3 if(flag2==0)tenp1=0x1d;
499 3 else tenp1=0x1e;
500 3 }
501 2 ri=tenp1-tenp3+1;
502 2 }
503 1 c_moon=c; //HEX->BCD ,运算结束后,把数据转换为BCD数据
504 1 tenp1=nian/10;
505 1 tenp1=_crol_(tenp1,4);
506 1 tenp2=nian%10;
507 1 nian_moon=tenp1|tenp2;
508 1 tenp1=yue/10;
509 1 tenp1=_crol_(tenp1,4);
510 1 tenp2=yue%10;
511 1 yue_moon=tenp1|tenp2;
512 1 tenp1=ri/10;
513 1 tenp1=_crol_(tenp1,4);
514 1 tenp2=ri%10;
515 1 ri_moon=tenp1|tenp2;
516 1 }
517 /*函数功能:输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年)
518 调用函数示例:Conver_xingqi(c_sun,nian_sun,yue_sun,ri_sun)
519 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
520 c_sun,nian_sun,yue_sun,ri_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
521 纪,c_sun=1为19世纪
522 调用函数后,原有数据不变,读xingqi得出阴历BCD数据
523 */
524
525 /*
526 算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期但如果是在
527 闰年又不到3 月份上述之和要减一天再除7
528 星期数为0
529 */
530 void Conver_xingqi(bit c,uchar nian,uchar yue,uchar ri)
531 {//c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
532 1 uchar tenp1,tenp2;
533 1 tenp1=nian/16; //BCD->hex 先把数据转换为十六进制
534 1 tenp2=nian%16;
535 1 nian=tenp1*10+tenp2;
536 1 tenp1=yue/16;
537 1 tenp2=yue%16;
538 1 yue=tenp1*10+tenp2;
539 1 tenp1=ri/16;
540 1 tenp2=ri%16;
541 1 ri=tenp1*10+tenp2;
542 1 if (c==0){nian+=0x64;} //如果为21世纪,年份数加100
543 1 tenp1=nian/0x4; //所过闰年数只算1900年之后的
544 1 tenp2=nian+tenp1;
545 1 tenp2=tenp2%0x7; //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据
546 1 tenp2=tenp2+ri+table_xingqi[yue-1];
547 1 if (nian%0x4==0&&yue<3)tenp2-=1;
C51 COMPILER V8.08 蒧日提醒 10/25/2011 08:42:07 PAGE 10
548 1 xingqi=tenp2%0x7;
549 1 }
550 /***************************************************************/
551 void Delay_10us(void)
552 {
553 1 U8 i;
554 1
555 1 for(i=15;i>0;i--);
556 1
557 1 }
558
559 void COM(void)
560 {
561 1
562 1 U8 i;
563 1 for(i=0;i<8;i++)
564 1 {
565 2
566 2 U8FLAG=2;
567 2 //----------------------
568 2 P37=0 ; //T
569 2 P37=1 ; //T
570 2 //----------------------
571 2
572 2 while((!P36)&&U8FLAG++);
573 2 Delay_10us();
574 2 Delay_10us();
575 2 Delay_10us();
576 2 U8temp=0;
577 2 if(P36)
578 2 U8temp=1;
579 2 U8FLAG=2;
580 2 while((P36)&&U8FLAG++);
581 2
582 2 //----------------------
583 2 P37=0 ; //T
584 2 P37=1 ; //T
585 2 //----------------------
586 2 //超时则跳出for循环
587 2 if(U8FLAG==1)break;
588 2 //判断数据位是0还是1
589 2
590 2 // 如果高电平高过预定0高电平值则数据位为 1
591 2
592 2 U8comdata<<=1;
593 2 U8comdata|=U8temp; //0
594 2 }//rof
595 1
596 1 }
597
598 //--------------------------------
599 //-----湿度读取子程序 ------------
600 //--------------------------------
601 //----以下变量均为全局变量--------
602 //----温度高8位== U8T_data_H------
603 //----温度低8位== U8T_data_L------
604 //----湿度高8位== U8RH_data_H-----
605 //----湿度低8位== U8RH_data_L-----
606 //----校验 8位 == U8checkdata-----
607 //----调用相关子程序如下----------
608 //---- Delay();, Delay_10us();,COM();
609 //--------------------------------
C51 COMPILER V8.08 蒧日提醒 10/25/2011 08:42:07 PAGE 11
610
611 void RH(void)
612 {
613 1 if(rr==1)
614 1 {rr=0;
615 2 //主机拉低18ms
616 2 P36=0;
617 2 TR2=1; }
618 1 // Delay2(180);
619 1 else if(zz==1)
620 1 {
621 2 RCAP2H = 0x7D;
622 2 RCAP2L = 0x0CB;
623 2 rr=1;///////
624 2 P36=1;
625 2 //总线由上拉电阻拉高 主机延时20us
626 2 Delay_10us();
627 2 Delay_10us();
628 2 Delay_10us();
629 2 // Delay_10us();
630 2 //主机设为输入 判断从机响应信号
631 2 P36=1;
632 2 //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
633 2 if(!P36) //T !
634 2 {
635 3 U8FLAG=2;
636 3 //判断从机是否发出 80us 的低电平响应信号是否结束
637 3 while((!P36)&&U8FLAG++);
638 3 U8FLAG=2;
639 3 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
640 3 while((P36)&&U8FLAG++);
641 3 //数据接收状态
642 3 COM();
643 3 U8RH_data_H_temp=U8comdata;
644 3 COM();
645 3 U8RH_data_L_temp=U8comdata;
646 3 COM();
647 3 U8T_data_H_temp=U8comdata;
648 3 COM();
649 3 U8T_data_L_temp=U8comdata;
650 3 COM();
651 3 U8checkdata_temp=U8comdata;
652 3 P36=1;
653 3
654 3 temp_data[0] = U8RH_data_L_temp ; //湿度低8位
655 3 temp_data[1] = U8RH_data_H_temp ; //湿度高8位
656 3 //数据校验
657 3
658 3 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
659 3 if(U8temp==U8checkdata_temp)
660 3 {
661 4 U8RH_data_H=U8RH_data_H_temp;
662 4 U8RH_data_L=U8RH_data_L_temp;
663 4 U8T_data_H=U8T_data_H_temp;
664 4 U8T_data_L=U8T_data_L_temp;
665 4 U8checkdata=U8checkdata_temp;
666 4 nn=0;
667 4 mm=0;
668 4 }
669 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -