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

📄 car.c

📁 自己写的关于小车的程序,拼点积分,呵呵,哈哈哈
💻 C
字号:
  /*用PWM控制电机脉冲频率应控制在25HZ~35HZ之间*/
  /*定时1ms,1个周期30ms,脉冲频率为33HZ		   */
#include   <reg52.h>
#define MOV_F 0x01	 //车子向前运动模式
#define MOV_L 0x02	 //车子向左运动模式
#define MOV_R 0x03	 //车子向右运动模式
#define MOV_B 0x04	 //车子向后运动模式
#define M_STOP 0x05	 //车子停止运动模式

#define SPEED 2
	 //车子向后运动模式

sbit INT_1=P1^0;
sbit INT_2=P1^1;
sbit INT_3=P1^3;
sbit INT_4=P1^4;
sbit EN1=P1^2;
sbit EN2=P1^5;
sbit st_led0=P2^0; //红外管0
sbit st_led1=P2^1; //红外管1
sbit st_led2=P2^2; //红外管2
sbit st_led3=P2^3; //红外管3
sbit st_led4=P2^4; //红外管4
unsigned char time=0;
unsigned char period=30;
unsigned char high_left;	  //左电机脉宽
unsigned char high_right;  //右电机脉宽

unsigned char mode;//车子运动模式

bit en_motor;
void dealy(unsigned int num);
void stop_motor(bit motor0,bit motor1);
void forward(bit motor0,bit motor1);
void reverse(bit motor0,bit motor1);

void dealy(unsigned int num)
{
        unsigned int i;
        for(i=0;i<125*num;i++);
}

void stop_motor(bit motor0,bit motor1)
{
	if(motor0)
	{
		EN1=~motor0;
		INT_1=0;
		INT_2=0;
	}
	if(motor1)
	{
		EN2=~motor1;
		INT_3=0;
		INT_4=0;
	 }
}

void forward(bit motor0,bit motor1)
{
	if(motor0)
	{
		EN1=motor0;
		INT_1=1;
		INT_2=0;
	}
	if(motor1)
	{
		EN2=motor1;
		INT_3=0;
		INT_4=1;
	 }

}

/*
void left(unsigned char step_left,unsigned char step_right)
{
	high_right=high_right+step_right;
	high_left=high_left-step_left;
}


void right(  unsigned char step_left,unsigned char step_right)
{
	high_right=high_right-step_right;
	high_left=high_left+step_left;
}  */



void reverse(bit motor0,bit motor1)
{
	if(motor0)
	{
		EN1=motor0;
		INT_1=0;
		INT_2=1;
	}
	if(motor1)
	{
		EN2=motor1;
		INT_3=1;
		INT_4=0;
	 }
}
void   timer0()   interrupt   1   using   1
{
	TH0=0xfc;     //定时器初值重装载64536
	TL0=0x18;
	time++;
	switch(mode)
	{
		case MOV_F:
		{
			if(time==high_left)
			{
				stop_motor(1,0);
			}
			if(time==high_right)
			{
				stop_motor(0,1);
			}
				if(time==period)
			{
				time=0;
				forward(1,1);
			}
			break;
		}
		case MOV_B:
		{
			if(time==high_left)
			{
				stop_motor(1,0);
			}
			if(time==high_right)
			{
				stop_motor(0,1);
			}
				if(time==period)
			{
				time=0;
				reverse(1,1);
			}
			break;
		}
		case MOV_L:
		{
			if(time==high_left)
			{
				stop_motor(1,0);
			}
			if(time==high_right)
			{
				stop_motor(0,1);
			}
				if(time==period)
			{
				time=0;
				forward(1,1);
			}
			break;
		}
		case MOV_R:
		{
			if(time==high_left)
			{
				stop_motor(1,0);
			}
			if(time==high_right)
			{
				stop_motor(0,1);
			}
				if(time==period)
			{
				time=0;
				forward(1,1);
			}
			break;
		}
		case M_STOP:
		{
			stop_motor(1,1);
			break;
		}
		default:  break;


   }

}


main()
{
	TMOD=0x01;   //定时器0方式1
	TH0=0xfc;     //定时器装载初值,设置脉冲信号的占空比为1/5
	TL0=0x18;

	ET0=1;   //开定时器0中断
	TR0=1;    //启动定时器0
        EA=4;
	mode=MOV_F;   //初始为向前运动模式
	high_left=SPEED;	  //左电机脉宽
	high_right=SPEED;  //右电机脉宽
	while(1)
	{
			if(st_led0==0)
			{
			 	  high_left=SPEED;
				  high_right=SPEED;
			}
			if(st_led1==0)
			{
				  high_left=high_left+1;
				  high_right=high_right;
			}
			if(st_led2==0)
			{
				  high_left=high_left+2;
				  high_right=high_right;
			}if(st_led3==0)
			{
				  high_left=high_left;
				  high_right=high_right+1;
			}
			if(st_led4==0)
			{
				  high_left=high_left;
				  high_right=high_right+2;
			}

	} 
}

⌨️ 快捷键说明

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