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

📄 main.lst

📁 一个程控锁相环PLL程序,可以设定频率,步进
💻 LST
字号:
C51 COMPILER V7.06   MAIN                                                                  06/10/2007 21:20:07 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN C:\WAVE6000\BIN\WWY_BYSJ\MAIN.OBJ
COMPILER INVOKED BY: C:\C51\BIN\C51.EXE C:\WAVE6000\BIN\WWY_BYSJ\MAIN.C DB SB OE

stmt level    source

   1           #include<reg52.h>
   2          
   3          unsigned code ledmod[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
   4                              0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x00,0x00}; //显示段代码
   5          unsigned code   ledsel[4]={0xfe,0xfd,0xfb,0xf7}; //显示位选代码
   6          unsigned char data led[4];//显示缓冲,用于主程序和定时中断显示数据传递
   7          
   8           sbit key_set = P3^4;//设定键
   9           sbit key_clr = P3^5;//清除键(退出键)
  10           sbit key_add = P3^6;//加数键
  11           sbit key_mov = P3^7;//移位键
  12          
  13          /****************************************************************************
  14          *    函数原型: void function wait_5ms(void);
  15          *    功    能: 提供5ms延时(时钟频率为12MHz)。
  16          ****************************************************************************/
  17          void  wait_5ms( void ) {
  18   1              register int i ;
  19   1              for ( i=0 ; i<2000 ; i++ )
  20   1                      ;
  21   1      
  22   1       }
  23          /***********************************************************************/
  24           void  delay( unsigned int ki )
  25            {for(;ki>0;ki--)
  26   1            {wait_5ms();}
  27   1        }
  28          
  29          /***************************************************/
  30          //键盘扫描程序,
  31          //返回键值,无键按下返回0
  32          //******************************************************/
  33           char key(void)
  34             {
  35   1          //*********扫描set键****************************
  36   1           key_set=1;wait_5ms();//把按键口线置高设为输入,延时等待稳定
  37   1           if(key_set==0)//初判断
  38   1            {
  39   2              key_set=1;wait_5ms();
  40   2              if(key_set==0);//再次确定按下
  41   2               {
  42   3                 while(key_set==0)key_set=1;//等待按键释放
  43   3               }
  44   2               return 1; //返回键值
  45   2             }
  46   1          //*********扫描clr键****************************
  47   1           key_clr=1;wait_5ms();//把按键口线置高设为输入,延时等待稳定
  48   1           if(key_clr==0)//初判断
  49   1            {
  50   2              key_clr=1;wait_5ms();
  51   2              if(key_clr==0);//再次确定按下
  52   2               {
  53   3                 while(key_clr==0)key_clr=1;//等待按键释放
  54   3               }
  55   2               return 2;//返回键值
C51 COMPILER V7.06   MAIN                                                                  06/10/2007 21:20:07 PAGE 2   

  56   2             } 
  57   1            //*********扫描add键**********************
  58   1           key_add=1;wait_5ms();//把按键口线置高设为输入,延时等待稳定
  59   1           if(key_clr==0)//初判断
  60   1            {
  61   2              key_add=1;wait_5ms();
  62   2              if(key_add==0);//再次确定按下
  63   2               {
  64   3                 while(key_add==0)key_add=1;//等待按键释放
  65   3               }
  66   2               return 3; //返回键值
  67   2             }
  68   1              //*********扫描clr键******************************
  69   1           key_mov=1;wait_5ms();//把按键口线置高设为输入,延时等待稳定
  70   1           if(key_mov==0)//初判断
  71   1            {
  72   2              key_mov=1;wait_5ms();
  73   2              if(key_mov==0); //再次确定按下
  74   2               {
  75   3                 while(key_mov==0)key_mov=1;//等待按键释放
  76   3               }
  77   2               return 4;//返回键值
  78   2             }   
  79   1      
  80   1        return 0;//无键按下返回0
  81   1        
  82   1         }
  83          
  84          // ******************************
  85          //把dat拆成BCD码送显示缓冲
  86          void set_disp(unsigned int dat)
  87           { 
  88   1         if(dat<9999)
  89   1          {
  90   2           led[3]=dat/1000;dat=dat%1000;
  91   2           led[2]=dat/100;dat=dat%100;
  92   2           led[1]=dat/10;led[0]=dat%10;
  93   2          }
  94   1       }
  95           //*****************************
  96           //设定琐相环输出频率
  97           void setF(unsigned int dat)
  98            {
  99   1        //使用 MOV @R0,A使PLL的分频器的分频系数高低8位数据同时输出
 100   1        //最大限度降低频率设定切换过程中的影响
 101   1        //参数传递时,dat的高8位在R6,低8位在R7
 102   1         #pragma ASM
*** ERROR C272 IN LINE 102 OF C:\WAVE6000\BIN\WWY_BYSJ\MAIN.C: 'asm/endasm' requires src-control to be active
 103   1             MOV A,R7
 104   1             MOV R0,A
 105   1             MOV A,R6
 106   1             MOV @R0,A 
 107   1         #pragma endasm   
*** ERROR C272 IN LINE 107 OF C:\WAVE6000\BIN\WWY_BYSJ\MAIN.C: 'asm/endasm' requires src-control to be active
 108   1        }
 109          
 110          /*================================== */
 111          
 112          
 113          void main(void)
 114          {
 115   1        unsigned char  i=0,counter,set_S=255;
C51 COMPILER V7.06   MAIN                                                                  06/10/2007 21:20:07 PAGE 3   

 116   1        unsigned int temp,tempf=500;
 117   1        unsigned char data ledbuf[4];//显示缓冲备份
 118   1        //counter为主程序循环次数计数器,
 119   1        //set_S为当前的设定操作状态,为255时为非设定状态,为0、1、2、3时分别表示当前设定的位
 120   1        //tempf为当前的频率值,
 121   1        //i和temp是在程序运行时的辅助变量 
 122   1         TMOD=0x01;TH0=0xfe;TL0=0x18; TR0=1;ET0=1;EA=1; 
 123   1             //初始定时器,16位定时模式
 124   1          setF(tempf);//设置PLL产生的频率
 125   1          set_disp(tempf);//刷新显示
 126   1         loop:                 
 127   1             for(;;)
 128   1                {
 129   2                  i=key();//扫描键盘
 130   2                  
 131   2                  switch(i)
 132   2                   {
 133   3                      case 1 : //设定键按下
 134   3                             if (set_S==255)//如果原来为非设定状态
 135   3                                  {
 136   4                                   set_S=0;//进入设定状态
 137   4                                    ledbuf[3]=led[3];//备份显示值,用于设定
 138   4                                    ledbuf[2]=led[2];
 139   4                                    ledbuf[1]=led[1];
 140   4                                    ledbuf[0]=led[0];
 141   4                                   }
 142   3                                else //如果原来为设定状态
 143   3                                 { 
 144   4                                  temp=ledbuf[3]*1000+ledbuf[2]*100+ledbuf[1]*10+ledbuf[0]; //转换设定值
 145   4                                   if((temp>=500)&&(temp<=1000))//判断设定值是否合法
 146   4                                    {
 147   5                                      tempf=temp;//记录新的频率值
 148   5                                      setF(temp);//设置PLL产生新的频率
 149   5                                      set_disp(temp);//刷新显示
 150   5                                    }
 151   4                                    set_S=255;//退出设定状态
 152   4                                  }
 153   3                              break;    
 154   3                        case 2 ://退出键按下
 155   3                               set_S=255;//退出设定状态
 156   3                               set_disp(tempf);//显示回原来的频率值
 157   3                               break; 
 158   3                        case 3 ://加值键按下
 159   3                               if(++ledbuf[set_S]>9)//设定值加1并判断是否大于9,
*** ERROR C187 IN LINE 159 OF C:\WAVE6000\BIN\WWY_BYSJ\MAIN.C: not an lvalue
 160   3                                {
 161   4                                 ledbuf[set_S]=0;//大于9,变为0
 162   4                                 }
 163   3                                 break;      
 164   3                        case 4: //移位键按下
 165   3                             if(++set_S>3)//指向下一位,如果超过最后一位,指回第一位
 166   3                                {
 167   4                                 set_S=0;
 168   4                                 }
 169   3                               break;                   
 170   3                   }
 171   2      
 172   2                 wait_5ms();
 173   2                 
 174   2                 if(set_S<4)//如果处于设定状态,控制当前显示位闪烁
 175   2                  {
 176   3                   if(++counter==100)//主程序运行了一百遍,约为100个wait_5ms()的时间
C51 COMPILER V7.06   MAIN                                                                  06/10/2007 21:20:07 PAGE 4   

 177   3                     {
 178   4                       led[set_S]=16;//不显示
 179   4                      }
 180   3                   if(++counter==200)//主程序运行了2百遍,约为200个wait_5ms()的时间
 181   3                     {
 182   4                       counter=0;//重新计数
 183   4                       led[set_S]=ledbuf[set_S];//显示
 184   4                     }     
 185   3                   }
 186   2                   
 187   2                }
 188   1         goto loop;//避免程受干扰,跳出主循环
 189   1         goto loop;
 190   1         goto loop;
 191   1         goto loop;       
 192   1      }
 193          
 194          /*================TIME0显示=====================*/
 195          void timer0 (void) interrupt 1 using 1
 196                   {static unsigned char   k;//显示的位
 197   1                  TH0=0xfc;TL0=0x18;//重装定时值
 198   1                  P3=P3|0x0f; //灭显
 199   1                  if(k==2)//是否应该显示小数点
 200   1                    {                        
 201   2                      P1=ledmod[led[k]]|0x80;//送段代码并点亮小数点 (|0x80点亮小数点)
 202   2                    }
 203   1                   else
 204   1                    {
 205   2                       P1=ledmod[led[k]];//送段代码
 206   2                    }
 207   1                   P3=P3&ledsel[k];//送位选信号 
 208   1                   k=(++k)&3;// 限制
 209   1               }
 210          
 211          

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

⌨️ 快捷键说明

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