前几天接了个小单子,是一个基于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