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

📄 test.lst

📁 《增强型8051单片机实用开发技术》例程代码
💻 LST
字号:
C51 COMPILER V8.18   TEST                                                                  11/30/2009 13:34:26 PAGE 1   


C51 COMPILER V8.18, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN Test.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Test.c OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include"stc12c5a.h"                            //包含STC12C5A60S2单片机的寄存器定义头文件
   2          #include"ISD51.h"                                       //包含ISD51调试功能所需头文件
   3          
   4          #define _DEBUG                                          //启用ISD51调试功能
   5          
   6          sbit P37=P3^7;
   7          sbit steerPWM=P4^2;
   8          
   9          unsigned char speed;                            //给定速度--实际为驱动电机PWM的占空比
  10          unsigned int duty=78,duty1;                     //驱动舵机PWM占空比
  11          unsigned char b[7];                                     //路经检测二值化后的值
  12          char locate;                                            //黑线偏差坐标
  13          char locate_hist;                                       //历史黑线偏差坐标
  14          bit black_flag;                                         //检测到黑线的标志变量
  15          
  16          void T0_ISR(void) interrupt 1           //定时器0中断--在IO上产生周期为20ms的PWM波形驱动舵机
  17          {             
  18   1              static unsigned int period=0;
  19   1      
  20   1              period++;
  21   1              if(period<=duty) steerPWM=1;  
  22   1              else steerPWM=0; 
  23   1              if(period>=1000)                                //计数1000次实现定时20ms
  24   1              {
  25   2                      period=0;
  26   2                      duty=duty1;
  27   2              } 
  28   1      }
  29                           
  30          void PWM1_init(void)                            //PWM初始化--驱动电机用
  31          {
  32   1              CMOD=0x80;                              //PCA 在空闲模式下停止 PCA 计数器工作
  33   1                                                      //PCA 时钟模式为fosc/12,禁止 PCA 计数器溢出中断
  34   1              CCON=0x0;                               //禁止PCA计数器工作,清除中断标志、计数器溢出标志
  35   1              CL=0x0;                                 //清0计数器 
  36   1              CH=0x0;
  37   1              CCAPM1=0x02;                            //设置模块1
  38   1              PCA_PWM1=0x00;
  39   1      }
  40          
  41          void TIMER_init(void)                           //定时器初始化
  42          {
  43   1              TMOD=0x22;                                              //定时器01都为工作方式2
  44   1              TL0=0xee;
  45   1              TH0=0xee;                                       //自动装入初值,定时20us,
  46   1              TR0=1;                                                  //启动定时器0
  47   1              ET0=1;                                                  //允许定时器0中断                                                       
  48   1              TH1=0xFD;                                               //产生9600bps的时间常数
  49   1              TL1=0xFD;
  50   1              TR1=1;                                                  //启动定时器1   
  51   1      }
  52                                                            
  53          void AD_init(void)                              //AD初始化
  54          {
  55   1              unsigned int i;
C51 COMPILER V8.18   TEST                                                                  11/30/2009 13:34:26 PAGE 2   

  56   1                                  
  57   1              ADC_CONTR=0x80;                         //开A/D转换电源,第一次使用时要打开内部模拟电源
  58   1              for (i=0;i<10000;i++);                  //适当延时
  59   1              
  60   1              P1ASF=0xff;                                             //P1口 7路AD转换        AD0--AD6
  61   1      }
  62           
  63          char abs(char data1)                            //求绝对值子程序
  64          {
  65   1              data1=(data1<0)?(-data1):data1;
  66   1              return data1;
  67   1      }
  68          
  69          void Get_data(void)                                     //获取路径信息
  70          {
  71   1              unsigned int i;
  72   1              unsigned int res,resl;                  //AD结果暂存
  73   1              unsigned char status=0;                 //AD转换状态
  74   1              unsigned int a[7];                              //路经检测的AD采样值
  75   1              
  76   1              black_flag=0;
  77   1              ADC_CONTR=0x80;                                 //打开AD电源
  78   1              for (i=0;i<10000;i++);                  //适当延时
  79   1              
  80   1              for(i=0;i<7;i++)
  81   1              {
  82   2                      ADC_CONTR=(0x80|i);                     //设定转换通道
  83   2                      ADC_CONTR|=0x08;                        //开始AD转换
  84   2                      status=0;
  85   2                      while(status==0)                        //等待转换完
  86   2                      {
  87   3                              status=ADC_CONTR&0x10;
  88   3                      }
  89   2                      ADC_CONTR&=0xE7;                //清零
  90   2      
  91   2                      res=ADC_RES;                            //读AD转换结果
  92   2                      resl=ADC_RESL;                   
  93   2                      a[i]=res*256+resl;
  94   2      
  95   2                      if(a[i]<0x02ff) b[i]=0;         //二值化
  96   2                      else  
  97   2                      {
  98   3                              b[i]=1;
  99   3                              black_flag=1;
 100   3                      }
 101   2              }
 102   1      }
 103          
 104          void main (void)  
 105          {
 106   1              AUXR1=0x44;                                             //PWM1转到P4.3口,AD高两位存在ADC_RES
 107   1              PCON|=0x80;                                             //波特率加倍
 108   1              SCON=0x50;                                      //8位可变波特率,无校验 
 109   1              //P1M0=0x00;                                            //P1口用作AD口,设为输入
 110   1              //P1M1=0xff;                        
 111   1              P37=1;
 112   1      
 113   1      #ifdef _DEBUG   
 114   1              ISDinit ();                                     //初始化ISD51
 115   1      #endif
 116   1      
 117   1              TIMER_init();   
C51 COMPILER V8.18   TEST                                                                  11/30/2009 13:34:26 PAGE 3   

 118   1              AD_init();
 119   1              PWM1_init();
 120   1              
 121   1              CR=1;                                                   //允许PCA计数
 122   1              EA = 1;                                                 //允许全局中断
 123   1                      
 124   1              while(1)
 125   1              {
 126   2                      Get_data();                                     //获取路径信息
 127   2                      if(black_flag==1)                       //能够检测到黑线时
 128   2                      {
 129   3                              locate=((-12)*b[0]+(-8)*b[1]+(-4)*b[2]+0*b[3]+4*b[4]+8*b[5]+12*b[6])/(b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6
             -]);
 130   3                                                      //计算偏差坐标 -12  0  12
 131   3                              locate_hist=locate;             //保存历史
 132   3                      }
 133   2                      else                                            //检测不到黑线时,偏差用历史值
 134   2                              locate=locate_hist;
 135   2                      
 136   2                      duty1=72+locate*5/4;            //根据偏差计算转角
 137   2                      
 138   2                      if(duty1<62) duty1=58;          //转角限幅
 139   2                      if(duty1>88) duty1=93;
 140   2                      
 141   2                      speed=0x8e-5*abs(locate);       //根据偏差给定速度
 142   2                      CCAP1L=speed;
 143   2                      CCAP1H=speed;   
 144   2              } 
 145   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    523    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16      16
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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