51智能小车前进后退左右旋
首先了解电机驱动模块,为双H桥驱动;p1^2,p1^3,p1^4控制小车左电机p1^5,p1^6,P1^7控制小车右电机;将单片机上的P1^2~P1^6和PCB板上的P1^2~P1^6用杜邦线分别对应连接好,然后进行对电机驱动IO口定义;用宏定义对小车电机的使能,^正转,反转进行定义,方便以后写main函数,下面为QXA51.h函数
#ifndef __QXA51_H__
#define __QXA51_H__
/*电机驱动IO定义*/
sbit IN1=P1^2; //为1 左电机反转
sbit IN2=P1^3; //为1 左电机正转
sbit IN3=P1^6; //为1 右电机正转
sbit IN4=P1^7; //为1 右电机反转
sbit EN1=P1^4; //为1 左电机使能
sbit EN2=P1^5; //为1 右电机使能
#define left_motor_en EN1=1 //左电机使能
#define left_motor_stops EN1=0 //左电机停止
#define right_motor_en EN2=1 //右电机使能
#define right_motor_stops EN2=0 //右电机停止
#define left_motor_go IN1=0,IN2=1 //左电机正转
#define left_motor_back IN1=1,IN2=0 //左电机反转
#define right_motor_go IN3=1,IN4=0 //右电机正转
#define right_motor_back IN3=0,IN4=1 //右电机反转
#endif
以下为控制小车运动的main函数,用delay函数将小车的运动区分开,如果小车想右转则左轮正转,如果小车想左转则右轮正转
#include <REGX52.H>
#include <QXA51.H>
void delay(unsigned int z)//毫秒级延时
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
/*小车前进*/
void forward()
{
left_motor_en;//左电机使能
right_motor_en;//右电机使能
left_motor_go;//左电机正转
right_motor_go;//右电机正转
}
/*小车后退*/
void backward()
{
left_motor_en;//左电机使能
right_motor_en;//右电机使能
left_motor_back;//左电机反转
right_motor_back;//右电机反转
}
/*小车左转*/
void left()
{
left_motor_stops;//左电机停止
right_motor_en;//右电机使能
right_motor_go;//右电机正转
}
/*小车右转*/
void right()
{
right_motor_stops;//右电机停止
left_motor_en;//左电机使能
left_motor_go;//左电机正转
}
/*小车停止*/
void stop()
{
left_motor_stops;//左电机停止
right_motor_stops;//右电机停止
}
/*小车左旋转*/
void left_rapidly()
{
left_motor_en;//左电机使能
right_motor_en;//右电机使能
right_motor_go;//右电机正转
left_motor_back;//左电机反转
}
/*小车右旋转*/
void right_rapidly()
{
left_motor_en;//左电机使能
right_motor_en;//右电机使能
left_motor_go;//左电机正转
right_motor_back;//右电机反转
}
void main()
{
forward();//小车前进
delay(3000);//毫秒级延迟
stop();//小车停止
delay(3000);//毫秒级延迟
backward();//小车后退
delay(3000);//毫秒级延迟
left();//小车左转
delay(3000);//毫秒级延迟
stop();//小车停止
delay(3000);//毫秒级延迟
right();//小车右转
delay(3000);//毫秒级延迟
left_rapidly();//小车左旋转
delay(3000);//毫秒级延迟
right_rapidly();//小车右旋转
delay(3000);//毫秒级延迟
stop();//小车停止
while(1);
}