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

📄 car.#3

📁 完整的小车控制程序
💻 #3
字号:
//P0.7, P1.0为PWM脉宽输出 对电机PWM控制而言,为了得到平稳电流,PWM频率宜在1kHz以上,采用8位PWM输出
//设置T2为系统时基  500Hz,周期为2ms.

#include <c8051F330.h>
typedef unsigned char uchar;
typedef unsigned int uint;

sfr16 ADC0VAL=0xbd;              //ADC0转换值=ADC0L+ADC0H
sfr16 PCA0CP0=0xfb;              //CEX0捕捉比较寄存器=PCA0CPL0+PCA0CPH0 
sfr16 PCA0CP1=0xe9;
sfr16 PCA0CP2=0xeb;
sfr16 TMR2=0xcc;                 //定时器2计数器寄存器
sfr16 TMR2RL=0xca;                //定时器2重载寄存器

#define	SYSCLK	12250000	      //采用内部晶振,12.25M
#define T2_Freq = 500             //T2系统时基500Hz
#define  car_mode_front   0x0a    //1010 小车前进
#define  car_mode_back    0x06     //0101  小车后退
#define  car_mode_stop    0x0f     //1111   小车急停
#define  car_mode_resolve 0x09    //1001  小车原地旋转
//-----------------------------------------------------------------------------
//                           函数声明
//-----------------------------------------------------------------------------

void Timer2_ISR ();    

//-----------------------------------------------------------------------------
//                           全局变量
//-----------------------------------------------------------------------------

uchar count_led=0;            //LED延时控制变量
uchar count_pwm=0;            //PWM占空比进行数据刷新控制变量
sbit P15_LED=P1^5;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
uchar pwm1;
uchar pwm2; 
char Car_mode=2;
bit Car_mode_temp=1;


//-----------------------------------------------------------------------------
//                           T0初始化
//-----------------------------------------------------------------------------
/*void	Timer0_Init()
{

  
}*/

void Timer2_Init (uint val)             //2ms
{   
   TMR2CN  = 0x00;                        // 选择定时器2外部时钟为(SYSCLK/12),16 位自动重装载方式
   CKCON  &= 0xdf;                       // Timer2 clocked based on T2XCLK;
   TMR2RL  = ~val+1;                     // Init reload values
   TMR2    = 0xffff;                      // set to reload immediately
   ET2     = 1;                           // enable Timer2 interrupts
   TR2     = 1;                           // 启动定时器2
}
  


//-----------------------------------------------------------------------------
//                    PWM初始化,PWM频率为12.5M/256=93.8KHz
//-----------------------------------------------------------------------------

void Pca_Init()
{
 PCA0MD|=0x00;        //PCA采用系统时钟24M,PCA溢出中断禁止 
 PCA0CN=0x40;         //启动PCA计数器
 PCA0CPM0=0x42;       //CEX0为8位PWM输出模式                           
 PCA0CPM1=0x42;       //CEX1为8位PWM输出模式
}

//-----------------------------------------------------------------------------
//                    小车运行方式设置
//-----------------------------------------------------------------------------
  void Car_mode_set(uchar mode) //pwm1,pwm2的范围在0-255内
{
    switch (mode)
       {
         case 1:  P10=0;P11=1;P12=0;P13=1;                                break;
         case 2:  P10=1;P11=0;P12=1;P13=0;                                break;
         case 3:  P10=1;P11=1;P12=1;P13=1;                                break;
         case 4:  P10=1;P11=0;P12=0;P13=1;                                break;
         default :                                                        break;
       }   
}

//-----------------------------------------------------------------------------
//                    PWM占空比设置
//-----------------------------------------------------------------------------
void Pwm_set(uchar pwm1,uchar pwm2)  //pwm1,pwm2的范围在0-255内
{
 PCA0CPH0=pwm1;
 PCA0CPH1=pwm2;
}
//-----------------------------------------------------------------------------
//                   数据初始化
//-----------------------------------------------------------------------------
void Data_Init()  //pwm1,pwm2的范围在0-255内
{
 P10=1;P11=0;P12=1;P13=0;
}

//-----------------------------------------------------------------------------
//                           处理器配置
//-----------------------------------------------------------------------------

void config()
 {         
//    uint i,j;
    PCA0MD&=0x9f;     //看门狗定时器被禁止   
   //用端口输入方式寄存器(PnMDIN)选择所有端口引脚输入方式
    P0MDIN=0xff;         //    0为模拟输入,1为数字输入
	P1MDIN=0xff;
  //  用端口输出方式寄存器(PnMDOUT)选择所有端口引脚的输出方式(漏极开路或推挽)
    P0MDOUT=0xc0;        //1为推挽输出
    P1MDOUT=0xff;
  // 用端口跳过寄存器(PnSKIP)选择应被交叉开关跳过的那些引脚
    P0SKIP=0x0f;        // 1时对应交叉开关跳过
    P1SKIP=0xff;
  //将引脚分配给要使用的外设 ,使能交叉开关(XBARE = ‘1’)
    XBR0=0x01;          //XBR0.0=1:UART TX0, RX0连到端口引脚P0.4和P0.5。
    XBR1=0xc2;          //弱上拉禁止;交叉开关使能;:CEX0、CEX1连到端口引脚

  
  // 晶振配置,开始采用内部晶振,等稳定后采用外部晶振
      CLKSEL=0x00;         //选择内部晶振
      OSCICN=0x82;         //内部H-F振荡器使能, SYSCLK为内部H-F频振荡器2分频  24.5/2=12.25MHz    2>>>0
     /* OSCXCN=0x67;         //  关闭 01100111 使能外部振荡器,晶体振荡器方式      24MHz
	for (i=0;i<20;i++)        // 等待至少1ms
	   {
		  for(j=0;j<200;j++);
       }
    while(!OSCXCN^7);                //查询XTLVLD =>'1'

⌨️ 快捷键说明

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