51单片机避障小车
给大家分享一下我在大一是时制作的51单片机避障小车
**小提示:**避障模块也可以当做寻迹模块使用
核心原理:
利用红外对管检测黑线与障碍物,并以STC89C52单片机为控制芯片控制电动小汽车的速度及转向,从而实现自动循迹避障的功能。其中小车驱动由L298N驱动电路完成,速度由单片机输出的PWM波控制。
运动机理:
(1)无障碍物当前方都没有障碍物,左右两个轮子都向前正转,则机器人向“前方”直线前进。(2)左前方有障碍物当左前方有障碍物,在左边触须碰到障碍物时,控制右边的轮子反转,则机器人向“左后方”倒退并转弯,即方向转向了障碍物的右边,从而避开了左边的障碍物。向后倒退转弯会持续一会,在完成转弯之后,左边触须不再碰到障碍物,则两个轮子都正转,机器人继续向新的没有障碍物的“前方”直线前进。(3)右前方有障碍物当右前方有障碍物,在右边触须碰到障碍物时,控制左边的轮子反转,则机器人向“右后方”倒退并转弯,即方向转向了障碍物的左边,从而避开了右边的障碍物。向后倒退转弯会持续一会,在完成转弯之后,右边触须不再碰到障碍物,则两个轮子都正转,机器人继续向新的没有障碍物的“前方”直线前进。
所需材料:单片机最小系统
杜邦线 万向轮,小车底板, TT电机,
避障模块
L298n
接下来只需要将小车组装好,用K4或者K5将程序烧入芯片即可。
//注意程序只做参考之用,要达到最理想的效果,还需要同学们细心调试。 //包含51单片机头文件,内部有各种寄存器定义#include<HJ-4WD_PWM.H> //包含HL-1蓝牙智能小车驱动IO口定义等函数#include <REGX52.H> sbit BUZZ=P1^5; //主函数 void main(void){ unsigned int n=0;// unsigned char i;// P1=0X00; //关电车电机 本实验学习的按键启动知识 //B: for(i=0;i<50;i++) //判断K4是否按下// {// delay(1); //1ms内判断50次,如果其中有一次被判断到K4没按下,便重新检测// if(P3^3!=0)//当K4按下时,启动小车前进,如有不明,请看慧净51单片机视频教程// goto B; //跳转到标号B,重新检测 // } 本实验学习的知识蜂鸣器,注意要在HJ-4WD头文件里定义IO口 BUZZ=~BUZZ;// delay(500);// BUZZ=0;//响50ms后关闭蜂鸣器 TMOD=0X01; TH0= 0XFc; //1ms定时 TL0= 0X18; TR0= 1; ET0= 1; EA = 1; //开总中断 while(1) //无限循环 { if(Left_1_led==1&&Right_1_led==1) run(); //调用前进函数 else { if(Left_1_led==1&&Right_1_led==0) //右边检测到红外信号 { leftrun(); //调用小车左转函数 } if(Right_1_led==1&&Left_1_led==0) //左边检测到红外信号 { rightrun(); //调用小车右转函数 } B: if(Right_1_led==0&&Left_1_led==0) //两边传感器同时检测到红外 { backrun(); //调用电机后退函数 delay(80);// n++;// if(n%2==0)// {// leftrun();// }// else if((Right_1_led==0&&Left_1_led==0)&&(n%2==1))// {// rightrun();// }// else// {// rightrun();// } goto B; //后退50毫秒 //rightrun(); //调用电机右转函数 //delay(30); } } }}
#ifndef _LED_H_#define _LED_H_#include <REGX52.H> //定义小车驱动模块输入IO口 sbit ENA = P2^2; //右点机使能sbit IN1 = P2^3; //为0右轮反转sbit IN2 = P2^4; //为0右轮正转sbit IN3 = P2^5; //为0左轮正转sbit IN4 = P2^6; //为0左轮反转sbit ENB = P2^7; //左电机使能 /***蜂鸣器接线定义*****/ #define Left_1_led P3_5 //左传感器 #define Right_1_led P3_4 //右传感器 #define Left_moto_pwm P2_2 //PWM信号端 #define Right_moto_pwm P2_7 //PWM信号端 #define Left_moto_go {P2_3=1,P2_4=0;} //you电机向前走 #define Left_moto_back {P2_3=0,P2_4=1;} //you边电机向后转 #define Left_moto_Stop {P2_7=0;} //you边电机停转 #define Right_moto_go {P2_5=1,P2_6=0;} //zuo边电机向前走 #define Right_moto_back {P2_5=0,P2_6=1;} //zuo边电机向后走 #define Right_moto_Stop {P2_2=0;} //zuo边电机停转 unsigned char pwm_val_left =0;//变量定义 unsigned char push_val_left =0;// 左电机占空比N/20 unsigned char pwm_val_right =0; unsigned char push_val_right=0;// 右电机占空比N/20 bit Right_moto_stop=1; bit Left_moto_stop =1; unsigned int time=0; /************************************************************************/ //延时函数 void delay(unsigned int k){ unsigned int x,y; for(x=0;x<k;x++) for(y=0;y<2000;y++);}/************************************************************************///前速前进 void run(void){ push_val_left=4; //速度调节变量 0-20。。。0最小,20最大 push_val_right=4; Left_moto_go ; //左电机往前走 Right_moto_go ; //右电机往前走}//后退函数 如果看不明白,请看慧净电子51智能小车视频教程 void backrun(void){ push_val_left=10; //速度调节变量 0-20。。。0最小,20最大 push_val_right=3; Left_moto_back; //左电机往前走 Right_moto_back; //右电机往前走}//左转 void leftrun(void){ // push_val_left=6; push_val_right=12; Right_moto_go ; //右电机往前走 Left_moto_Stop ; //左电机停止}//右转 void rightrun(void){ push_val_left=12; // push_val_right=6; Left_moto_go ; //左电机往前走 Right_moto_Stop ; //右电机 }/************************************************************************//* PWM调制电机转速 *//************************************************************************//* 左电机调速 *//*调节push_val_left的值改变电机转速,占空比 */ void pwm_out_left_moto(void){ if(Left_moto_stop) { if(pwm_val_left<=push_val_left) { Left_moto_pwm=1; // Left_moto_pwm1=1; } else { Left_moto_pwm=0;// Left_moto_pwm1=0; } if(pwm_val_left>=20) pwm_val_left=0; } else { Left_moto_pwm=0;// Left_moto_pwm1=0; }}/******************************************************************//* 右电机调速 */ void pwm_out_right_moto(void){ if(Right_moto_stop) { if(pwm_val_right<=push_val_right) { Right_moto_pwm=1; // Right_moto_pwm1=1; } else { Right_moto_pwm=0;// Right_moto_pwm1=0; } if(pwm_val_right>=20) pwm_val_right=0; } else { Right_moto_pwm=0;// Right_moto_pwm1=0; }} /****************************************************TIMER0中断服务子函数产生PWM信号*/ void timer0()interrupt 1 using 2{ TH0=0XFc; //1Ms定时 TL0=0X18; time++; pwm_val_left++; pwm_val_right++; pwm_out_left_moto(); pwm_out_right_moto(); } /*********************************************************************/ #endif
在制作小车的过程中有什么问题可以联系我一起交流讨论共同进步