#include <reg52.h> //包含52系统头文件
#define uint unsigned int
#define uchar unsigned char
#define Leftmotogo {IN1=0,IN2=1;} //左电机向前zou
#define LeftmotoStop {EN1=0;IN1=0,IN2=0;} //左边电机停转
#define Rightmotogo {IN3=1,IN4=0;} //右边电机向前走
#define RightmotoStop {EN2=0;IN3=0,IN4=0;} //右边电机停转
sbit IN1=P1^2; //
sbit IN2=P1^3; //
sbit IN3=P1^6; //
sbit IN4=P1^7; //
sbit EN1=P1^4; //使能
sbit EN2=P1^5; //使能
sbit key4=P3^7;
sbit beep=P2^3;
sbit Leftled=P3^3; //左循迹红外传感器
sbit Rightled=P3^2; //右循迹红外传感器
sbit Left_2_led=P3^4; //左避障红外传感器
sbit Right_2_led=P3^5;
uchar pwmleft =0;//变量定义
uchar pwmright =0;
uchar pushleft =6;// 左电机占空比N/20 //速度调节变量 0-20。。。0最小,20最大
uchar pushright=6;// 右电机占空比N/20
// 大家可以根据循迹效果修改以上两个数值
bit RightPWMON=1; //右电机PWM开关
bit LeftPWMON =1; //左电机PWM开关
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void run()
{
pushleft=6; //速度调节变量 0-20。。。0最小,20最大
pushright=6;
Leftmotogo ; //左电机往前走
Rightmotogo ; //右电机往前走
}
void leftrun()
{
pushleft=5;
pushright=5;
Rightmotogo ; //右电机往前走
LeftmotoStop ; //左电机停止
}
void rightrun()
{
pushleft=5;
pushright=5;
Leftmotogo; //左电机往前走
RightmotoStop; //右电机往前走
}
void stop()
{
LeftmotoStop;
RightmotoStop;
}
// PWM调制电机转速 左电机调速
/*调节push_val_left的值改变电机转速,占空比*/
void pwmoutleftmoto()
{
if(LeftPWMON)
{
if(pwmleft<=pushleft)
{
EN1=1;
}
else EN1=0;
if(pwmleft>=20)
pwmleft=0;
}
else EN1=0; //若未开启PWM则EN1=0 左电机 停止
}
/* 右电机调速 */
void pwmoutrightmoto()
{
if(RightPWMON)
{
if(pwmright<=pushright) //20ms内电平信号 111 111 0000 0000 0000 00
{
EN2=1; //占空比6:20
}
else EN2=0;
if(pwmright>=20)
pwmright=0;
}
else EN2=0; //若未开启PWM则EN2=0 右电机 停止
}
void timer0() interrupt 1 //TIMER0中断服务子函数产生PWM信号
{
TH0=0XFC; //1Ms定时
TL0=0X66;
pwmleft++;
pwmright++;
pwmoutleftmoto();
pwmoutrightmoto();
}
void keyscan() //按键扫描函数
{
A: if(key4==0) //判断是否有按下信号
{
delayms(10); //延时10ms
if(key4==0) //再次判断是否按下
{
beep=0; //蜂鸣器响
while(!key4); //判断是否松开按键
beep=1; //蜂鸣器停止
}
else goto A; //跳转到A重新检测
}
else goto A; //跳转到A重新检测
}
void main()
{
P1=0X00; //关电机
keyscan(); //按键启动检测
delayms(1000);//1s后启动
TMOD=0X01;
TH0= 0XFC; //1ms定时
TL0= 0X66;
TR0= 1;
ET0= 1;
EA = 1;
while(1) //无限循环
{
if(Left_2_led==0||Right_2_led==0) {stop();}
if(Leftled==0&&Rightled==0) run(); //调用前进函数
else if(Leftled==1&&Rightled==0)/*左边检测到黑线*/ leftrun(); //调用小车左转函数
else if(Rightled==1&&Leftled==0)/*右边检测到黑线*/rightrun();//调用小车右转函数
else stop();
}
}
|