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

📄 直流ok.c

📁 用C8051F330单片机控制直流电机的程序 驱动为L298
💻 C
字号:
#include <c8051f310.h>                 // SFR declarations
#include <INTRINS.H>
#include <stdio.h>

sfr16 TMR2RL   = 0xca;                 // Timer2 reload value
sfr16 TMR2     = 0xcc;                 // Timer2 counter
//----------------------------------------------------------------------------
#define MOTO_BREAK DIR1A=DIR1B
//#define MOTO_BREAK DIR2A=DIR2B
#define MOTO_FORD DIR1A=0;DIR1B=1
#define MOTO_BACK DIR1A=1;DIR1B=0
//#define MOTO_FORD DIR2A=0;DIR2B=1
//#define MOTO_BACK DIR2A=1;DIR2B=0
//------------------------------------------------------------------------------------
sbit  DIR1A=P1^2;//方向控制管脚
sbit  DIR1B=P1^1;
//sbit  DIR2A=P0^6;
//sbit  DIR2B=P0^7;
//------------------------------------------------------------------------------------
void PORT_Init (void);
void PCA_Init (void);
void PCA_ISR (void);
//------------------------------------------------------------------------------------

//配置I/O端口
void PORT_Init (void)
{  P0SKIP =0x01;
  
   XBR1 = 0x41;			/*CEX0-->P0.1*/

  P0MDOUT|=0x02;
  P1MDOUT|=0xff;
}
//配置PCA的CEX0输出8位PWM信号
void PCA_Init (void)
{
    PCA0CN    = 0x40;
    PCA0CPM0  = 0x42;
    PCA0CPL0  = 0x00;
    PCA0CPH0  = 0x00;
	PCA0MD    = 0x01;
}
//-------------------------------
void PCA_ISR (void) interrupt 11
{     unsigned char a ;
      bit	PWM_PAC;
      CF = 0;
      if(PWM_PAC==0)			//占空比由0	>>0xfe
		{
			PCA0CPH0=a;
		 	a++;
		 	if(a==0xfe){PWM_PAC=1;}
		}
		else					//占空比由0xfe	>>0
		{
			PCA0CPH0=a;
		 	a--;
		 	if(a==0){PWM_PAC=0;}
		}
}

void Timer2_Init (int counts)
{
   TMR2CN = 0x00;                      // STOP Timer2; Clear TF2H and TF2L;
                                       // disable low-byte interrupt; disable
                                       // split mode; select internal timebase
   CKCON |= 0x10;                      // Timer2 uses SYSCLK as its timebase

   TMR2RL  = -counts;                  // Init reload values
   TMR2    = TMR2RL;                   // Init Timer2 with reload value
   ET2 = 0;                            // disable Timer2 interrupts
   TR2 = 1;                            // start Timer2
}

//--------------------------------------------------------------------------------

void delay100ms(int time)	//when time=100,the delay is 100ms
{
   unsigned int count;
   TF2H = 0;                           // Clear Timer2 overflow flag
   TR2 = 1;                            // Start Timer2
   
   for (count = time; count != 0; count--) {
      while (!TF2H);                   // wait for overflow
      TF2H = 0;                        // clear overflow indicator
   }

   TR2 = 0;                            // Stop Timer2
}
//--------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
void main (void)
{	
	unsigned long b;
	 
   /*关看门狗*/
   PCA0MD &= ~0x40; // WDTE = 0 (watchdog timer enable bit)
   OSCICN |= 0x03; // Set internal oscillator to highest
                   // setting (24500000)
	
   	PORT_Init ();			/*初始化I/O口*/
   	PCA_Init ();				/*PCA初始化成8位脉宽调置方式*/
    EIE1= 0x10;
	EA=1;
	PCA0CPH0=0x00;
   	while (1)      
	{
        //慢速反向运行2秒
		MOTO_BACK;
		//PWM_PAC=0;
		delay100ms(2000);
		MOTO_BREAK;//急停
		//慢速正向运行2秒
		MOTO_FORD;
		//PWM_PAC=1;
		delay100ms(2000);
		MOTO_BREAK;//急停
		delay100ms(2000);
		//快速反向运行2秒
		MOTO_BACK;
		//PWM_PAC=0;
		delay100ms(2000);
		MOTO_BREAK;//急停
		delay100ms(500);
		//快速正向运行2秒
		MOTO_FORD;
		//PWM_PAC=1;
		delay100ms(2000);
		MOTO_BREAK;//急停
		delay100ms(2000);
		
	
	}
}

⌨️ 快捷键说明

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