📄 car.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 + -