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

📄 clk_deal.lst

📁 单片机程序代码,经过很详细的测试.呵呵,硬件相关.
💻 LST
📖 第 1 页 / 共 3 页
字号:
 416   6                                                      clk_prio = 4;
 417   6                                              }
 418   5                                              else {
 419   6                                                      temp = get_clock_state(clkarray[5]);
 420   6                                                      if (temp >> 4 == 1){
 421   7                                                              set_clock_switch(clkarray[5]);
 422   7                                                              clk_prio = 5;
 423   7                                                      }
 424   6                                                  else {
 425   7                                                              temp = get_clock_state(clkarray[6]);
 426   7                                                              if (temp >> 4 == 1){
 427   8                                                                      set_clock_switch(clkarray[6]);
C51 COMPILER V7.50   CLK_DEAL                                                              03/10/2006 16:35:31 PAGE 8   

 428   8                                                                      clk_prio = 6;
 429   8                                                              }
 430   7                                                              else {
 431   8                                                                      temp = get_clock_state(clkarray[7]);
 432   8                                                                      if (temp >> 4 == 1){
 433   9                                                                              set_clock_switch(clkarray[7]);
 434   9                                                                              clk_prio = 7;
 435   9                                                                      }
 436   8                                                              }
 437   7                                                  }
 438   6                                              }
 439   5                                      }
 440   4                              }
 441   3                      }
 442   2              }
 443   1      }
 444          
 445          void get_clk_prio(unsigned char clksource){                                                     
 446   1      //得出主用源时钟的优先级
 447   1      unsigned char xdata temp;
 448   1              clk_prio = 8;
 449   1              temp = 8;
 450   1              while (temp){
 451   2                      if (clksource == clkarray[temp - 1]){
 452   3                              clk_prio = temp - 1;
 453   3                      }
 454   2                      temp--;
 455   2              }
 456   1      }
 457          
 458          
 459          void check_switch_clk(void){
 460   1      //主用时钟源不是最高优先级时钟,自动倒换函数
 461   1      unsigned char xdata temp;
 462   1      unsigned char xdata clk_pr;
 463   1      unsigned char xdata flg;
 464   1              flg = 8;
 465   1              for (clk_pr = 6; clk_pr >= 1; clk_pr--){
 466   2                      if (clk_prio > clk_pr){                                                 //得到优先级的时钟状态
 467   3                              temp = get_clock_state(clkarray[clk_pr]);
 468   3                              if (temp >> 4){
 469   4                                      clkprio_array[clk_pr] += 1;                             //时钟源有效计数值加1
 470   4                                      if (clkprio_array[clk_pr] > 300){               //计满5分钟
 471   5                                              flg = clk_pr;
 472   5                                              clkprio_array[clk_pr] = 0;
 473   5                                      }
 474   4                              }
 475   3                              else clkprio_array[clk_pr] = 0;                         //时钟源无效清除计数
 476   3                      }
 477   2              }               
 478   1              temp = get_clock_state(clkarray[0]);                            //得到优先级0的时钟状态
 479   1              if (temp >> 4){
 480   2                      clkprio_array[0] += 1;                                                  //时钟源有效计数值加1
 481   2                      if (clkprio_array[0] > 300){                                    //计满5分钟
 482   3                              flg = 0;
 483   3                              clkprio_array[0] = 0;
 484   3                      }
 485   2              }
 486   1              else clkprio_array[0] = 0;                                                      //时钟源无效清除计数
 487   1      
 488   1              if (flg < 8){
 489   2                      set_clock_switch(clkarray[flg]);                                //自动倒换时钟源
C51 COMPILER V7.50   CLK_DEAL                                                              03/10/2006 16:35:31 PAGE 9   

 490   2              }
 491   1      /*      if (clk_prio > 6){                                                                      //得到优先级6的时钟状态
 492   1                      temp = get_clock_state(clkarray[6]);
 493   1                      if (temp >> 4){
 494   1                              clkprio_array[6] += 1;                                          //时钟源有效计数值加1
 495   1                              if (clkprio_array[6] > 300){                            //计满5分钟
 496   1                                      flg = 6;
 497   1                                      clkprio_array[6] = 0;
 498   1                              }
 499   1                      }
 500   1                      else clkprio_array[6] = 0;                                              //时钟源无效清除计数
 501   1              }
 502   1              if (clk_prio > 5){
 503   1                      temp = get_clock_state(clkarray[5]);
 504   1                      if (temp >> 4){
 505   1                              clkprio_array[5] += 1;
 506   1                              if (clkprio_array[5] > 300){
 507   1                                      flg = 5;
 508   1                                      clkprio_array[5] = 0;
 509   1                              }
 510   1                      }
 511   1                      else clkprio_array[5] = 0;
 512   1              }
 513   1              if (clk_prio > 4){
 514   1                      temp = get_clock_state(clkarray[4]);
 515   1                      if (temp >> 4){
 516   1                              clkprio_array[4] += 1;
 517   1                              if (clkprio_array[4] > 300){
 518   1                                      flg = 4;
 519   1                                      clkprio_array[4] = 0;
 520   1                              }
 521   1                      }
 522   1                      else clkprio_array[4] = 0;
 523   1              }
 524   1              if (clk_prio > 3){
 525   1                      temp = get_clock_state(clkarray[3]);
 526   1                      if (temp >> 4){
 527   1                              clkprio_array[3] += 1;
 528   1                              if (clkprio_array[3] > 300){
 529   1                                      flg = 3;
 530   1                                      clkprio_array[3] = 0;
 531   1                              }
 532   1                      }
 533   1                      else clkprio_array[3] = 0;
 534   1              }
 535   1              if (clk_prio > 2){
 536   1                      temp = get_clock_state(clkarray[2]);
 537   1                      if (temp >> 4){
 538   1                              clkprio_array[2] += 1;
 539   1                              if (clkprio_array[2] > 300){
 540   1                                      flg = 2;
 541   1                                      clkprio_array[2] = 0;
 542   1                              }
 543   1                      }
 544   1                      else clkprio_array[2] = 0;
 545   1              }
 546   1              if (clk_prio > 1){
 547   1                      temp = get_clock_state(clkarray[1]);
 548   1                      if (temp >> 4){
 549   1                              clkprio_array[1] += 1;
 550   1                              if (clkprio_array[1] > 300){
 551   1                                      flg = 1;
C51 COMPILER V7.50   CLK_DEAL                                                              03/10/2006 16:35:31 PAGE 10  

 552   1                                      clkprio_array[1] = 0;
 553   1                              }
 554   1                      }
 555   1                      else clkprio_array[1] = 0;
 556   1              }
 557   1              temp = get_clock_state(clkarray[0]);                            //得到优先级0的时钟状态
 558   1              if (temp >> 4){
 559   1                      clkprio_array[0] += 1;                                                  //时钟源有效计数值加1
 560   1                      if (clkprio_array[0] > 300){                                            //计满5分钟
 561   1                              flg = 0;
 562   1                              clkprio_array[0] = 0;
 563   1                      }
 564   1              }
 565   1              else clkprio_array[0] = 0;                                                      //时钟源无效清除计数
 566   1              if (flg < 8){
 567   1                      set_clock_switch(clkarray[flg]);                                //自动倒换时钟源
 568   1              }
 569   1      */
 570   1      }
 571          
 572          
 573          void clk_check_frequence(void){
 574   1      //出现主用时钟源丢失以后,将时钟源改为自由振荡并加频偏,
 575   1      //解决时钟死锁长时间出现误码的现象
 576   1      
 577   1              if (clk_check_flg[0] == 1)                      //光口出现告警标志
 578   1              {
 579   2                      if (clk_check_flg[1] > 0)               //出现告警,重新进行时钟计数
 580   2                      {
 581   3                              clk_check_flg[1] = 1;
 582   3                      }
 583   2                      else if ((S_reg & 0xC0) != 0xC0)        //时钟源不工作在自由振荡状态,更改时钟配置
 584   2                      {
 585   3      //                      clk_frequence_stat = S_reg;
 586   3                              S_reg &= 0xDF;
 587   3                              S_reg |= 0xC0;                                  //先将时钟源配置到自由振荡
 588   3      //                      Frep_reg = 0x80;                                //添加频偏
 589   3                              clk_check_flg[1] = 1;
 590   3                              clk_frequence_stat = clkmode_reg;
 591   3                              clkmode_reg = 1;
 592   3                      }
 593   2                      clk_check_flg[0] = 0;
 594   2              }
 595   1      
 596   1              if (clk_check_flg[1] > 0)                       //开始时钟计数
 597   1              {
 598   2                      if (clk_check_flg[1] > 5)               //计满5秒钟,将时钟配置改回来
 599   2                      {
 600   3                              S_reg &= 0x3F;
 601   3                              S_reg |= 0x80;
 602   3      //                      Frep_reg = 0x40;
 603   3                              clk_check_flg[1] = 0;
 604   3                              clkmode_reg = clk_frequence_stat;
 605   3                      }
 606   2                      else clk_check_flg[1] += 1;
 607   2              }
 608   1      
 609   1      }
 610          


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V7.50   CLK_DEAL                                                              03/10/2006 16:35:31 PAGE 11  

   CODE SIZE        =   1805    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     31       9
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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