两个8051做主控的小车,各自循迹行驶,交汇时指示灯点亮,交汇结束熄灭
1、项目简介
2、实现逻辑
#逻辑比较简单,在简介里面基本描述清楚了
#资料挺多的,卖家给的,小白可以顺便学一下51单片机
3、应用场景
4、核心代码梳理
#include <reg52.h>//51头文件
#include <QX_A11.h>//QX_A11智能小车配置文件
unsigned char pwm_val_left,pwm_val_right; //中间变量,用户请勿修改。
unsigned char pwm_left,pwm_right; //定义PWM输出高电平的时间的变量。用户操作PWM的变量。
#define PWM_DUTY 200 //定义PWM的周期,数值为定时器0溢出周期,假如定时器溢出时间为100us,则PWM周期为20ms。
#define PWM_HIGH_MIN 70 //限制PWM输出的最小占空比。用户请勿修改。
#define PWM_HIGH_MAX PWM_DUTY //限制PWM输出的最大占空比。用户请勿修改。
void Timer0_Init(void); //定时器0初始化
void LoadPWM(void);//装入PWM输出值
void forward(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小车前进
void left_run(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小车左转
void right_run(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小车右转
void stop(void);//QX_A11智能小车停车
void Tracking()
{
//为0 没有识别到黑线 为1识别到黑线
char data1,data2 = left_led1,data3 = right_led1;
data1 = data2*10+data3;
if(data1 == 11)//在黑线上,前进
{
forward(120,120);//前进
}
else
{
if(data1 == 10)//小幅偏右,左转
{
left_run(80,160);//左转
}
if(data1 == 1)//小幅偏左,右转
{
right_run(160,80);//右转
}
if(data1 == 0)//大幅偏左或偏右,已脱离轨道
{
stop();
}
}
}
/*主函数*/
void main(void)
{
char fir = fir_pin;
int num = 0;
Timer0_Init();//定时0初始化
while(1)
{
Tracking();
fir = fir_pin;
if(!fir) //low no
{
if(num > 0)
num--;
}
else
{
num = 3000;
}
if(!num) //low no
{
beep = 1;
led1_pin = 1;
led2_pin = 0;
}
else
{
beep = 0; //yes
led1_pin = 0;
led2_pin = 1;
}
}
}
/*********************************************
QX_A11智能小车前进
入口参数:LeftSpeed,RightSpeed
出口参数: 无
说明:LeftSpeed,RightSpeed分别设置左右车轮转速
**********************************************/
void forward(unsigned char LeftSpeed,unsigned char RightSpeed)
{
pwm_left = LeftSpeed,pwm_right = RightSpeed;//设置速度
left_motor_go; //左电机前进
right_motor_go; //右电机前进
}
/*小车左转*/
/*********************************************
QX_A11智能小车左转
入口参数:LeftSpeed,RightSpeed
出口参数: 无
说明:LeftSpeed,RightSpeed分别设置左右车轮转速
**********************************************/
void left_run(unsigned char LeftSpeed,unsigned char RightSpeed)
{
pwm_left = LeftSpeed,pwm_right = RightSpeed;//设置速度
left_motor_back; //左电机后退
right_motor_go; //右电机前进
}
/*********************************************
QX_A11智能小车右转
入口参数:LeftSpeed,RightSpeed
出口参数: 无
说明:LeftSpeed,RightSpeed分别设置左右车轮转速
**********************************************/
void right_run(unsigned char LeftSpeed,unsigned char RightSpeed)
{
pwm_left = LeftSpeed,pwm_right = RightSpeed;//设置速度
right_motor_back;//右电机后退
left_motor_go; //左电机前进
}
/*********************************************
QX_A11智能小车停车
入口参数:无
出口参数: 无
说明:QX_A11智能小车停车
**********************************************/
void stop(void)
{
left_motor_stops;
right_motor_stops;
}
/*********************************************
QX_A11智能小车PWM输出
入口参数:无
出口参数: 无
说明:装载PWM输出,如果设置全局变量pwm_left,pwm_right分别配置左右输出高电平时间
**********************************************/
void LoadPWM(void)
{
if(pwm_left > PWM_HIGH_MAX) pwm_left = PWM_HIGH_MAX; //如果左输出写入大于最大占空比数据,则强制为最大占空比。
if(pwm_left < PWM_HIGH_MIN) pwm_left = PWM_HIGH_MIN; //如果左输出写入小于最小占空比数据,则强制为最小占空比。
if(pwm_right > PWM_HIGH_MAX) pwm_right = PWM_HIGH_MAX; //如果右输出写入大于最大占空比数据,则强制为最大占空比。
if(pwm_right < PWM_HIGH_MIN) pwm_right = PWM_HIGH_MIN; //如果右输出写入小于最小占空比数据,则强制为最小占空比。
if(pwm_val_left<=pwm_left) Left_moto_pwm = 1; //装载左PWM输出高电平时间
else Left_moto_pwm = 0; //装载左PWM输出低电平时间
if(pwm_val_left>=PWM_DUTY) pwm_val_left = 0; //如果左对比值大于等于最大占空比数据,则为零
if(pwm_val_right<=pwm_right) Right_moto_pwm = 1; //装载右PWM输出高电平时间
else Right_moto_pwm = 0; //装载右PWM输出低电平时间
if(pwm_val_right>=PWM_DUTY) pwm_val_right = 0; //如果右对比值大于等于最大占空比数据,则为零
}
/********************* Timer0初始化************************/
void Timer0_Init(void)
{
TMOD |= 0x02;//定时器0,8位自动重装模块
TH0 = 164;
TL0 = 164;//11.0592M晶振,12T溢出时间约等于100微秒
TR0 = 1;//启动定时器0
ET0 = 1;//允许定时器0中断
EA = 1;//总中断允许
}
/********************* Timer0中断函数************************/
void timer0_int (void) interrupt 1
{
pwm_val_left++;
pwm_val_right++;
LoadPWM();//装载PWM输出
}
5、部分参考资料
6、注意事项
#买的两个线程红外循迹小车,改造的交汇
#用黑色绝缘胶带搞的循迹,胶带最好3cm宽,否则小车摆动比较厉害