51单片机寻迹小车完整程序

本文介绍了一款基于51单片机的小车项目,详细记录了使用PWM波控制电机速度的方法,实现了小车的前进、后退及不同转弯方式,并通过四个红外传感器实现循迹功能。
哈哈哈,今天终于把小车调成功了耶!!!

费了好大劲去调PWM波把速度降下来,然后写转弯,左转大湾,左转小湾,右转大湾,右转小湾,四个红外收发管,所以就写了四个转弯的状态.

P1是用来控制电机的端口,IN~控制前进后退,EN~控制小车能不能走,P0是红外接收的口,为1时表示探测到黑线

zkb为占空比,通过zkb来控制小车的速度,t为相当于总时间,zkb是在t时间内电机工作的时间。

下面是我写的程序:

#include <reg52.h>

sbit IN1 = P1^0; 
sbit IN2 = P1^1;
sbit ENA = P1^2;
sbit IN3 = P1^3;
sbit IN4 = P1^4;
sbit ENB = P1^5;

sbit left1 = P0^0;
sbit left2 = P0^1;
sbit right1 = P0^2;
sbit right2 = P0^3;

unsigned char zkb1 = 0;
unsigned char zkb2 = 0;
unsigned char t = 0;


void init()
{
	EA = 1;
	TMOD |= 0x01;
	TH0 =(65536 - 100) / 256;
	TL0 = (65536 - 100)% 256;	
	ET0 = 1;
	TR0 = 1;
}

void timer0() interrupt 1
{

	TH0 = (65536 - 100) / 256;
	TL0 = (65536 - 100) % 256;
		
	if(t < zkb1)
	{
// 		if(t % 2 == 0)
// 		{
// 		    ENA = 1;
// 	    }
// 		else 
// 		{
// 			ENA = 0;
// 		}
		ENA = 1;
	}
	else 
	{
		ENA = 0;
	}
	if(t < zkb2)
	{
// 		if(t%2 == 0)
// 		{
// 		    ENB = 1;
// 		}
// 		else 
// 		{
// 			ENB = 0;
// 		}
		ENB =1;
	}
	else 
	{
		ENB = 0;
	}
	++t;
	if(t >= 50)
	{
		t = 0;
	}
	
	

}

void turn_left1()
{
	zkb1 = 13;
	zkb2 = 0;

}

void turn_left2()
{

	zkb1 = 13;
	zkb2 = 0;
}

void turn_right1()
{
	zkb1 = 0;
	zkb2 = 13;
}

void turn_right2()
{
	zkb1 = 0;
	zkb2 = 13;
}

void qianjin()
{
	zkb1 = 8;
	zkb2 = 8;
}
void xunji()
{
	unsigned char flag;
	if((right2 == 0)&&(right1 == 0)&&(left1 == 0)&&(left2 == 0))
	{
		flag = 0;
	}
	if((right2 == 0)&&(right1 ==1)&&(left1 == 0)&&(left2 == 0))
	{
		flag = 1;
	}
	if((right2 == 0)&&(right1 == 0)&&(left1 == 1)&&(left2 == 0))
	{
		flag = 2;
	}
	if((right2 == 0)&&(right1 == 0)&&(left1 == 0)&&(left2 == 1))
	{
		flag = 3;
	}
	if((right2 == 1)&&(right1 == 0)&&(left1 == 0)&&(left2 == 0))
	{
		flag = 4;
	}
	switch(flag)
	{
		case 0:qianjin();break;
		
		case 1:turn_right1();break;
		
		case 2:turn_left1();break;
		
		case 3:turn_left2();break;
		
		case 4:turn_right2();break;
		
		default:qianjin();break;
	}
}

void main()
{
	init();
// 	zkb1 = 40;
// 	zkb2 = 30;
	IN1 = 0;
	IN2 = 1;
    IN3 = 0;
    IN4 = 1;
	while(1)
	{
			
			xunji();
		
	}
}

今天下午用掉了四节南孚电池,好贵T_T



循迹小车是一个非常有趣的项目,它可以通过感应地面上的黑线或白线来实现自动行驶。下面是51单片机五路寻迹小车的介绍: 硬件部分: 1. 电源模块:使用锂电池或干电池供电,需要一个稳压模块将电压稳定在5V左右。 2. 控制模块:使用51单片机作为控制核心,需要一个晶振和一个复位电路。 3. 驱动模块:使用L298N电机驱动模块,可以控制两个直流电机的转动方向和速度。 4. 传感器模块:使用五个红外线传感器,可以检测地面上的黑线或白线。 5. 机械结构:使用两个直流电机驱动两个轮子,需要一个底盘和两个驱动轮。 软件部分: 1. 初始化:设置IO口方向和初始状态,初始化定时器和PWM输出。 2. 传感器读取:读取五个红外线传感器的数值,判断当前位置是否在黑线上。 3. 控制算法:根据传感器读取的数值,计算出小车需要转动的方向和速度。 4. 电机控制:根据控制算法的结果,控制L298N电机驱动模块输出PWM信号,控制电机的转动方向和速度。 代码示例: ```c // 初始化IO口和定时器 void init() { P0 = 0xFF; // 设置P0口为输入 P1 = 0x00; // 设置P1口为输出 TMOD = 0x01; // 设置定时器0为模式1 TH0 = 0xFC; // 设置定时器0的初值 TL0 = 0x67; TR0 = 1; // 启动定时器0 } // 读取传感器数值 int read_sensor() { int sensor_value = 0; sensor_value |= P0 & 0x01; // 读取P0.0口的数值 sensor_value |= (P0 & 0x02) >> 1 << 1; // 读取P0.1口的数值 sensor_value |= (P0 & 0x04) >> 2 << 2; // 读取P0.2口的数值 sensor_value |= (P0 & 0x08) >> 3 << 3; // 读取P0.3口的数值 sensor_value |= (P0 & 0x10) >> 4 << 4; // 读取P0.4口的数值 return sensor_value; } // 控制算法 void control(int sensor_value) { int error = sensor_value - 0b00111; // 计算误差值 int speed = 100; // 设置基础速度 int left_speed = speed - error * 10; // 计算左轮速度 int right_speed = speed + error * 10; // 计算右轮速度 P1 = 0x01; // 设置左轮为正转 PWM_left(left_speed); // 控制左轮速度 P1 = 0x02; // 设置右轮为正转 PWM_right(right_speed); // 控制右轮速度 } // 电机控制 void PWM_left(int speed) { TH0 = 256 - speed; // 设置PWM占空比 TL0 = 256 - speed; } void PWM_right(int speed) { TH1 = 256 - speed; TL1 = 256 - speed; } // 主函数 void main() { init(); // 初始化 while (1) { int sensor_value = read_sensor(); // 读取传感器数值 control(sensor_value); // 控制算法 } } ```
评论 39
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值