基于51单片机实现红外循迹

您所在的位置:网站首页 51单片机红外发射代码 基于51单片机实现红外循迹

基于51单片机实现红外循迹

2024-07-15 16:57| 来源: 网络整理| 查看: 265

红外循迹外观:

 红外循迹原理:

        红外循迹模块原理还是很简单的,和许多光电传感器原理一样,当发射器发射出去的光被接收器接收到后,模块上对应的LED灯点亮,此时相应的输出引脚输出低电平;如果发射器发射的光没有被接收器接收到的话,那么LED灯不点亮,此时相应的输出引脚输出高电平。

 PWM调速:

这里必须要有PWM来控制小车的速度,不然的话太快容易脱离轨道,具体多少速度还是需要看硬件和软件的配合,需要多次实验试错。PWM可以参考我前面写的关于舵机的代码,原理是一样的,只需要加些变量即可使用。

电机驱动模块:

这里就不再多说,一般都是拿L298N驱动模块来做小车,可以一个驱动模块控制四个轮子,也可以两个控制四个,具体还是需要看硬件是否被满足。

 程序设计:

在程序设计过程中,最难的还是走直线的情况下,因为小车如果速度太快的话,会直接脱离轨道,太慢的话,玩的时候感觉又有点不得劲,所以要尽力写出最高效的程序还是有点挑战的。如果循迹模块检测到低电平,就直走,检测到高电平,因为我刚开始是在前面装了两个,但是后来觉得走直线的时候太快,冲出了轨迹,所以后来又加了一个,放在了前一排的后面。

这里注意一下,此代码只是往右旋转的,不支持左转,它会一直右转右转。

代码:

代码有两个,前一个是走椭圆的,后一个是走直角的,有点差别,但差别不大,注意区分。

前一个;:

#include //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit leftA=P2^1; sbit leftB=P2^2; sbit leftC=P2^3; sbit leftD=P2^4; sbit rightA = P1^4; sbit rightB = P1^3; sbit rightC = P1^2; sbit rightD = P1^1; sbit Left_moto_pwmA=P2^0 ; sbit Left_moto_pwmB=P2^5 ; sbit Right_moto_pwmA=P1^0; sbit Right_moto_pwmB=P1^6; bit Left_moto_stop =1; bit Right_moto_stop =1; extern unsigned char pwm_val_left =0; //脉冲变量 unsigned char push_val_left =0; extern unsigned char pwm_val_right =0; //脉冲变量 unsigned char push_val_right=0; //调节速度 unsigned char Left_Speed_Ratio; unsigned char Right_Speed_Ratio; #define Right_1_led P3^2 //四路寻迹模块接口第一路 #define Left_2_led P3^3 //四路寻迹模块接口第二路 void delay(u16 n); void delay(u16 n) //1ms (误差 -0.651041666667us) { u16 i ; unsigned char a,b; for(i=1;i0;b--) for(a=3;a>0;a--); } } void pwm_out_left_moto(void) //左电机调速 { if(pwm_val_left>=10) pwm_val_left=0; if(Left_moto_stop) { if(pwm_val_left=10) pwm_val_right=0; if(Right_moto_stop) { if(pwm_val_right0;a--); } } void pwm_out_left_moto(void) //左电机调速 { if(pwm_val_left>=10) pwm_val_left=0; if(Left_moto_stop) { if(pwm_val_left=10) pwm_val_right=0; if(Right_moto_stop) { if(pwm_val_right


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3