51智能小车(双轮)

前几天接了个小单子,是一个基于51单品机的作品,发现自己对小车的认识还是不太🆗

可能是因为在调PWM的时候容易出现问题,现在再进行整理一次以便于加深印象不多说了,下面是代码块:

#include <REGX52.H>//头文件
 
sbit IN1   = P1^0; //产生PWM波来调速
sbit IN2   = P1^1;//产生PWM波来调速
sbit IN3   = P1^2; //产生PWM波来调速
sbit IN4   = P1^3;//产生PWM波来调速
 
sbit ENA   = P1^4;//左边两个电机的使能
sbit ENB   = P1^6;//右边两个电机的使能
 
sbit k1=P2^0;    //寻迹模块k1位
sbit k2=P2^1;    //寻迹模块k2位
sbit B1=P2^2;    //避障1
sbit B2=P2^3;    //避障2
 
typedef unsigned char u8;
unsigned char PMW_A = 0;//定义了一下左边两个轮的占空比
unsigned char PMW_B = 0;//定义了一下右边两个轮的占空比

int t = 0;
 
void Timer_Init()//定时器初始化
{		
	TMOD |= 0x01;//配置工作模式
	TH0 = (65536 - 200) / 256;
	TL0 = (65536 - 200) % 256;
	ET0 = 1;
	TR0 = 1;//打开定时器
	EA = 1;//打开总中断
}
 
void Timer()interrupt 1  //中断
{
	TH0 = (65536-200)/256;
	TL0 = (65536-200)%256;		
	t++;
	if(t==100)
	{
		t=0;
	}			
	if(t<PMW_A)   
	{
		ENA = 1;
	}
	else
	{
		ENA = 0;
	}		
	if(t<PMW_B)
	{
		ENB = 1;
	}
	else			
	{
		ENB = 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) //前进函数
{ 
	PMW_A = 36;
	PMW_B = 36;
	IN1   = 1;
	IN2   = 0;
	IN3   = 0;
	IN4   = 1;
}
 
void Back()
{
	PMW_A = 30;
	PMW_B = 30;
	IN1   = 0;
	IN2   = 1;
	IN3   = 1;
	IN4   = 0;
}

void Stop(void)   //全部输出低电平
{   
	PMW_A = 0;
	PMW_B = 0;
	IN1  = 0;
	IN2  = 0;
	IN3  = 0;
	IN4  = 0;
}
 
void Left()//左转函数
{
	PMW_A=20;
	PMW_B=25;
	IN1  = 0;
	IN2  = 1;
	IN3  = 0;
	IN4  = 1;
}
 
void Right()//右转函数
{
	PMW_A=25;//当前速度为15(可调)
	PMW_B=20;
	IN1=1;//右轮正传,左轮反转
	IN2=0;
	IN3=1;//左轮反转  形成一个速度差就可以转向
	IN4=0;
}
 
void Right1()//左转函数
{
	PMW_A=40;//当前速度为15(可调)
	PMW_B=35;
	IN1=1;//右轮正传,左轮反转
	IN2=0;
	IN3=1;//左轮反转  形成一个速度差就可以转向
	IN4=0;
	}

void xunji()
{
	u8 m;
	
/*********************
检测到黑线是11
没有黑线是00
把黑线加宽确保循迹模块能一直在黑线里面
**************************/
	
	if(k1==1&&k2==1)//检测黑线  1输出高电平  0是低电平
	{m=0;}    //缓慢前进
	if(k1==1&&k2==0)//左边检测到黑线
	{m=1;}   //如果左出界微调回到黑线上
	if(k1==0&&k2==1)//左边检测到黑线
	{m=2;} //如果右出界微调回到黑线上
	if(k1==0&&k2==0)
	{m=5;}  //全部出线  一直右转直到找到黑线
/**********
避障  这里定义是遇到障碍物停车
***********/
	if(B1==0)
	{m=3;}
	if(B2==0)
	{m=4;}
				
	switch(m)
	{
		case 0:Run();Delay(5);break;
		case 1:Left();Delay(10);break;
		case 2:Right();Delay(10);break;
		case 3:Back();Delay(50);break;
		case 4:Back();Delay(50);break;
		case 5:Right1();Delay(5);break;
		default: Run();Delay(10);break;
	}
}
 
void main(void)//主函数
{
	Timer_Init();//定时器初始化	
	while(1)//一直循环
	{
		xunji();//循迹函数
	}
}
	

也算是完成了任了的;欢迎各位小伙伴来多多交流,大家一起进步

最后有需要单片机课程设计的小伙伴滴滴我哦(有偿)。

企鹅:2397746994

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值