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

📄 car.lst

📁 完整的小车控制程序
💻 LST
字号:
C51 COMPILER V7.20   CAR                                                                   04/16/2006 22:44:43 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE CAR
OBJECT MODULE PLACED IN car.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\c51.exe car.c DB OE

line level    source

   1          //P0.7, P1.0为PWM脉宽输出 对电机PWM控制而言,为了得到平稳电流,PWM频率宜在1kHz以上,采用8位PWM输出
   2          //设置T2为系统时基  500Hz,周期为2ms.
   3          
   4          #include <c8051F330.h>
   5          typedef unsigned char uchar;
   6          typedef unsigned int uint;
   7          
   8          sfr16 ADC0VAL=0xbd;              //ADC0转换值=ADC0L+ADC0H
   9          sfr16 PCA0CP0=0xfb;              //CEX0捕捉比较寄存器=PCA0CPL0+PCA0CPH0 
  10          sfr16 PCA0CP1=0xe9;
  11          sfr16 PCA0CP2=0xeb;
  12          sfr16 TMR2=0xcc;                 //定时器2计数器寄存器
  13          sfr16 TMR2RL=0xca;                //定时器2重载寄存器
  14          
  15          #define SYSCLK  12250000              //采用内部晶振,12.25M
  16          #define T2_Freq = 500             //T2系统时基500Hz
  17          #define  car_mode_front   0x0a    //1010 小车前进
  18          #define  car_mode_back    0x06     //0101  小车后退
  19          #define  car_mode_stop    0x0f     //1111   小车急停
  20          #define  car_mode_resolve 0x09    //1001  小车原地旋转
  21          //-----------------------------------------------------------------------------
  22          //                           函数声明
  23          //-----------------------------------------------------------------------------
  24          
  25          void Timer2_ISR ();    
  26          
  27          //-----------------------------------------------------------------------------
  28          //                           全局变量
  29          //-----------------------------------------------------------------------------
  30          
  31          uchar count_led=0;            //LED延时控制变量
  32          uchar count_pwm=0;            //PWM占空比进行数据刷新控制变量
  33          sbit P15_LED=P1^5;
  34          sbit P10=P1^0;
  35          sbit P11=P1^1;
  36          sbit P12=P1^2;
  37          sbit P13=P1^3;
  38          uchar pwm1;
  39          uchar pwm2; 
  40          char Car_mode=2;
  41          bit Car_mode_temp=1;
  42          
  43          
  44          //-----------------------------------------------------------------------------
  45          //                           T0初始化
  46          //-----------------------------------------------------------------------------
  47          /*void  Timer0_Init()
  48          {
  49          
  50            
  51          }*/
  52          
  53          void Timer2_Init (uint val)             //2ms
  54          {   
  55   1         TMR2CN  = 0x00;                        // 选择定时器2外部时钟为(SYSCLK/12),16 位自动重装载方式
C51 COMPILER V7.20   CAR                                                                   04/16/2006 22:44:43 PAGE 2   

  56   1         CKCON  &= 0xdf;                       // Timer2 clocked based on T2XCLK;
  57   1         TMR2RL  = ~val+1;                     // Init reload values
  58   1         TMR2    = 0xffff;                      // set to reload immediately
  59   1         ET2     = 1;                           // enable Timer2 interrupts
  60   1         TR2     = 1;                           // 启动定时器2
  61   1      }
  62            
  63          
  64          
  65          //-----------------------------------------------------------------------------
  66          //                    PWM初始化,PWM频率为12.5M/256=93.8KHz
  67          //-----------------------------------------------------------------------------
  68          
  69          void Pca_Init()
  70          {
  71   1       PCA0MD|=0x00;        //PCA采用系统时钟24M,PCA溢出中断禁止 
  72   1       PCA0CN=0x40;         //启动PCA计数器
  73   1       PCA0CPM0=0x42;       //CEX0为8位PWM输出模式                           
  74   1       PCA0CPM1=0x42;       //CEX1为8位PWM输出模式
  75   1      }
  76          
  77          //-----------------------------------------------------------------------------
  78          //                    小车运行方式设置
  79          //-----------------------------------------------------------------------------
  80            void Car_mode_set(uchar mode) //pwm1,pwm2的范围在0-255内
  81          {
  82   1          switch (mode)
  83   1             {
  84   2               case 1:  P10=0;P11=1;P12=0;P13=1;                                break;
  85   2               case 2:  P10=1;P11=0;P12=1;P13=0;                                break;
  86   2               case 3:  P10=1;P11=1;P12=1;P13=1;                                break;
  87   2               case 4:  P10=1;P11=0;P12=0;P13=1;                                break;
  88   2               default :                                                        break;
  89   2             }   
  90   1      }
  91          
  92          //-----------------------------------------------------------------------------
  93          //                    PWM占空比设置
  94          //-----------------------------------------------------------------------------
  95          void Pwm_set(uchar pwm1,uchar pwm2)  //pwm1,pwm2的范围在0-255内
  96          {
  97   1       PCA0CPH0=pwm1;
  98   1       PCA0CPH1=pwm2;
  99   1      }
 100          //-----------------------------------------------------------------------------
 101          //                   数据初始化
 102          //-----------------------------------------------------------------------------
 103          void Data_Init()  //pwm1,pwm2的范围在0-255内
 104          {
 105   1       P10=1;P11=0;P12=1;P13=0;
 106   1      }
 107          
 108          //-----------------------------------------------------------------------------
 109          //                           处理器配置
 110          //-----------------------------------------------------------------------------
 111          
 112          void config()
 113           {         
 114   1      //    uint i,j;
 115   1          PCA0MD&=0x9f;     //看门狗定时器被禁止   
 116   1         //用端口输入方式寄存器(PnMDIN)选择所有端口引脚输入方式
 117   1          P0MDIN=0xff;         //    0为模拟输入,1为数字输入
C51 COMPILER V7.20   CAR                                                                   04/16/2006 22:44:43 PAGE 3   

 118   1              P1MDIN=0xff;
 119   1        //  用端口输出方式寄存器(PnMDOUT)选择所有端口引脚的输出方式(漏极开路或推挽)
 120   1          P0MDOUT=0xc0;        //1为推挽输出
 121   1          P1MDOUT=0xff;
 122   1        // 用端口跳过寄存器(PnSKIP)选择应被交叉开关跳过的那些引脚
 123   1          P0SKIP=0x0f;        // 1时对应交叉开关跳过
 124   1          P1SKIP=0xff;
 125   1        //将引脚分配给要使用的外设 ,使能交叉开关(XBARE = ‘1’)
 126   1          XBR0=0x01;          //XBR0.0=1:UART TX0, RX0连到端口引脚P0.4和P0.5。
 127   1          XBR1=0xc2;          //弱上拉禁止;交叉开关使能;:CEX0、CEX1连到端口引脚
 128   1      
 129   1        
 130   1        // 晶振配置,开始采用内部晶振,等稳定后采用外部晶振
 131   1            CLKSEL=0x00;         //选择内部晶振
 132   1            OSCICN=0x82;         //内部H-F振荡器使能, SYSCLK为内部H-F频振荡器2分频  24.5/2=12.25MHz    2>>>0
 133   1           /* OSCXCN=0x67;         //  关闭 01100111 使能外部振荡器,晶体振荡器方式      24MHz
 134   1              for (i=0;i<20;i++)        // 等待至少1ms
 135   1                 {
 136   1                        for(j=0;j<200;j++);
 137   1             }
 138   1          while(!OSCXCN^7);                //查询XTLVLD =>'1'

⌨️ 快捷键说明

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