⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quan.lst

📁 用单片机做的数字电子钟
💻 LST
📖 第 1 页 / 共 5 页
字号:
 876          /*************************************************************************************************/ 
 877          /////////////////////////////////////////////
 878          ///// 函数名:   读出字节完整子函数    //////
 879          ///// 函数功能: 从DS1302读出一个字节  //////
 880          ///// 调用: InputByte(); OutputByte() //////
 881          ///// 函数参数: 无                    //////
 882          ///// 返回值:   有(读出的字节内容)    //////
 883          /////////////////////////////////////////////
 884          
 885          ReadFrom1302(unsigned char Add)
 886           {
 887   1        unsigned char Date;
 888   1        RST2 = 0;
 889   1        CLK = 0;
 890   1        RST2 = 1;
 891   1        InputByte(Add);         // 先给地址,命令 //
 892   1        Date = OutputByte();      // 再读一字节数据 //
 893   1        CLK = 1;
 894   1        RST2 =0;
 895   1        return(Date);
 896   1       }
 897          /*************************************************************************************************/
 898          /////////////////////////////////////////////////////////////////////////////////
 899          ///// 函数名称: SetTime                                                     /////                         
             -                                        /////
 900          ///// 功能: 设置初始时间                                                    /////
 901          ///// 调用: WriteTo1302()                                                   /////
 902          ///// 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年    ///// 
 903          ///// 返回值: 无                                                            /////
 904          /////////////////////////////////////////////////////////////////////////////////
 905          
 906          void SetTime(unsigned char *pSecDa) 
 907           {
 908   1        unsigned char i;
 909   1        unsigned char Addr = 0x80; 
 910   1        WriteTo1302(0x8e,0x00);         // 控制命令,WP=0,写操作 //
 911   1        for(i =0;i<7;i++)
 912   1         { 
 913   2          WriteTo1302(Addr,*pSecDa);         // 秒 分 时 日 月 星期 年 //
 914   2          pSecDa++;
 915   2          Addr +=2;
 916   2         }
 917   1        WriteTo1302(0x8e,0x80);         // 控制命令,WP=1,写保护 //
 918   1       }                                                                  
 919          /**************************************************************************************************/ 
 920          //////////////////////////////////////////////////////////////////////////////////////
 921          ///// 名称: GetTime                                                              /////
 922          ///// 说明:                                                                      /////
C51 COMPILER V8.02   QUAN                                                                  07/29/2008 20:35:20 PAGE 16  

 923          ///// 功能: 读取DS1302当前时间                                                   /////
 924          ///// 调用: uc_R1302()                                                           /////
 925          ///// 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年  /////
 926          ///// 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B                                         /////
 927          ///// 返回值: 无                                                                 /////
 928          //////////////////////////////////////////////////////////////////////////////////////
 929          
 930          void GetTime(void) 
 931           {
 932   1        unsigned char i;
 933   1        unsigned char Addr = 0x81;
 934   1        for (i=0;i<7;i++)
 935   1         {
 936   2          Curtime[i] = ReadFrom1302(Addr);        // 格式为: 秒 分 时 日 月 星期 年 //
 937   2          Addr += 2;
 938   2         }
 939   1        sec = Curtime[0];
 940   1        min = Curtime[1];
 941   1        hour = Curtime[2];  
 942   1        date = Curtime[3];
 943   1        month = Curtime[4];
 944   1        day = Curtime[5];
 945   1        year = Curtime[6];
 946   1       }
 947          /**************************************************************************************************/
 948          ////////////////////////////////////////////////////
 949          ///// 函数名:   定时器T0初始化子函数         //////
 950          ///// 函数功能: 初始化T0定时50ms             //////
 951          ///// 调用:     无                           //////
 952          ///// 函数参数: 无                           //////
 953          ///// 返回值:   无                           //////
 954          //////////////////////////////////////////////////// 
 955          
 956          void Init_T0(void)
 957           { 
 958   1        TMOD=0x01;            //定时器T0,工作模式1//
 959   1        TH0=0x3c;             //50ms//
 960   1        TL0=0xb0;
 961   1        EA=1; 
 962   1        ET0=1;
 963   1        TR0=1;
 964   1       }
 965          /**************************************************************************************************/
 966          ////////////////////////////////////////////////////
 967          ///// 函数名:   闪烁信号产生子函数           //////
 968          ///// 函数功能: 用定时中断方式产生闪烁信号   //////
 969          ///// 调用:     无                           //////
 970          ///// 函数参数: 无                           //////
 971          ///// 返回值:   无                           //////
 972          //////////////////////////////////////////////////// 
 973          
 974          void T0_flash(void) interrupt 1          // 中断程序,产生时钟秒信号 //
 975           {
 976   1        TR0=0;          
 977   1        fla_cou++;
 978   1        if(fla_cou==10)             //闪烁间隔为50ms*10次=500ms//
 979   1         {
 980   2          flash=!flash;
 981   2          fla_cou=0;
 982   2         }
 983   1        TH0=0x3c;             //50ms//
 984   1        TL0=0xb0;
C51 COMPILER V8.02   QUAN                                                                  07/29/2008 20:35:20 PAGE 17  

 985   1        TR0=1;
 986   1       }
 987          /**************************************************************************************************/
 988          ////////////////////////////////////////////////////
 989          ///// 函数名:   时间闪烁子函数               //////
 990          ///// 函数功能: 选择确定闪烁位等待调整       //////
 991          ///// 调用:     Add();                       //////
 992          ///// 函数参数: 无                           //////
 993          ///// 返回值:   无                           //////
 994          //////////////////////////////////////////////////// 
 995          
 996          void FlashKey(void)             //闪烁子函数//
 997          {
 998   1       if(P2_5==0)
 999   1        {
1000   2         while(P2_5==0)
1001   2          Refresh();
1002   2         n++;                        
1003   2        }                            
1004   1       if(n==8)  n=0;                         
1005   1       if(n!=1)  K1=1;
1006   1       if(n!=2)  K2=1;
1007   1       if(n!=3)  K3=1;                      
1008   1       if(n!=4)  K4=1;
1009   1       if(n!=5)  K5=1;
1010   1       if(n!=6)  K6=1;                      
1011   1       if(n!=7)  K7=1;
1012   1       switch(n)
1013   1        {
1014   2         case 0:KT=0;break;
1015   2         case 1:K1=flash;hms=year;KT=1;break;        //hms为调时临时变量,需要调整某位时则先把其初始值放到hms中/
             -/
1016   2         case 2:K2=flash;hms=month;KT=1;break;
1017   2         case 3:K3=flash;hms=date;KT=1;break;
1018   2         case 4:K4=flash;hms=hour;KT=1;break;
1019   2         case 5:K5=flash;hms=min;KT=1;break;
1020   2         case 6:K6=flash;hms=sec;KT=1;break;
1021   2         case 7:K7=flash;hms=day;KT=1;break;
1022   2        }
1023   1       tiaoshi();
1024   1      } 
1025          /*********************************************************************************************************
             -/
1026          ////////////////////////////////////////////////////
1027          ///// 函数名:   时间调整子函数               //////
1028          ///// 函数功能: 对闪烁位进行调整(加减一)       //////
1029          ///// 调用:     SetTime();Refresh();         //////
1030          ///// 函数参数: 无                           //////
1031          ///// 返回值:   无                           //////
1032          //////////////////////////////////////////////////// 
1033          
1034          void tiaoshi(void)                        //调时子函数//
1035           {
1036   1        signed char item,max,mini;
1037   1        unsigned char ye;
1038   1        item=(hms/16)*10+hms%16;
1039   1        ye=(year/16)*10+year%16;
1040   1        if(P2_6==0)                           //按P2_6键进行时间加调整//
1041   1         {
1042   2          while(P2_6==0)
1043   2            Refresh();
1044   2          if(KT==1)                           //检验可调标志位KT//
C51 COMPILER V8.02   QUAN                                                                  07/29/2008 20:35:20 PAGE 18  

1045   2              {
1046   3            item++;   
1047   3                if(n==1) {max=99; mini=0;}                //根据n不同,返回给不同的位: n=1  ->  返回给年位//
1048   3                if(n==2) {max=12; mini=1;}                              //                                                    n=2  ->  返回给月位//
1049   3            if((n==3)&(ye%4))  {max=28; mini=1;}        //不闰年2月28天               依次类推                   //
1050   3                if(!(ye%4)&(n==3)) {max=29; mini=1;}      //  闰年2月29天                                             
1051   3                if((n==3)&((month==0x01)|(month==0x03)|(month==0x05)|(month==0x07)|(month==0x08)|(month==0x10)|(month==
             -0x12)))
1052   3                  {max=31; mini=1;}                                 //1,3,5,7,8,10,12月31天
1053   3            if((n==3)&((month==0x04)|(month==0x06)|(month==0x09)|(month==0x11)))
1054   3                  {max=30; mini=1;}                                     //4,6,9,11月满30天
1055   3            if(n==4) {max=23; mini=0;}                // 24小时制 //
1056   3            if(n==5) {max=59; mini=0;}               
1057   3            if(n==6) {max=59; mini=0;} 
1058   3            if(n==7) {max=7;  mini=1;}
1059   3                if(item>max)
1060   3                  item=mini;
1061   3        hms=(item/10)*16+item%10;
1062   3           switch(n)
1063   3           {
1064   4              case 1:year=hms;break;           //根据n不同,返回给不同的位: n=1  ->  返回给年位  //
1065   4              case 2:month=hms;break;          //                                                n=2  ->  返回给月位  //
1066   4              case 3:date=hms;break;           //                            n=3  ->  返回给日位  //
1067   4              case 4:hour=hms;break;           //                            n=4  ->  返回给小时位//
1068   4              case 5:min=hms;break;            //                            依次类推             //
1069   4                      case 6:sec=hms;break;
1070   4                      case 7:day=hms;break;
1071   4                }
1072   3            Curtime[0] = sec;
1073   3            Curtime[1] = min;
1074   3            Curtime[2] = hour;
1075   3                Curtime[3] = date;
1076   3                Curtime[4] = month;
1077   3            Curtime[5] = day;
1078   3                Curtime[6] = year;
1079   3            SetTime(&Curtime[0]);         // 将调整过后的时间值写入DS1302 //
1080   3           }
1081   2              }
1082   1              if(P2_7==0)            //按P2_7键进行时间减调整//
1083   1         {
1084   2          while(P2_7==0)
1085   2            Refresh();
1086   2          if(KT==1)                           //检验可调标志位KT//
1087   2              {
1088   3            item--;   
1089   3                if(n==1) {max=99; mini=0;}                //根据n不同,返回给不同的位: n=1  ->  返回给年位//
1090   3                if(n==2) {max=12; mini=1;}                              //                                                    n=2  ->  返回给月位//
1091   3            if((n==3)&(ye%4))  {max=28; mini=1;}        //不闰年2月28天               依次类推                   //
1092   3                if(!(ye%4)&(n==3)) {max=29; mini=1;}      //  闰年2月2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -