51单片机自动循迹小车
#include<reg52.h>
sbit IN1=P1^2; //左电机正转
sbit IN2=P1^3; //左电机反转
sbit IN3=P1^6; //右电机正转
sbit IN4=P1^7; //右电机反转
sbit SE1=P3^4; //左边红外传感器接口
sbit SE2=P3^5; //右边红外传感器接口
//使用跳线帽将使能端与VCC接到一起,使能端一直处于高电平状态,无需另外设置
#define uint unsigned int
#define uchar unsigned char
uchar pwm_left_val=0; //设置占空比
uchar pwm_right_val=0;
uchar pwm_t=0; //周期
uchar flag=1;
void forward();
void stops();
void turn_left();
void turn_right();
void init();
void delay(uchar z);
void XJ();
void main()
{
init();
while(1)
{
XJ();
while(flag); //flag保证pwm一个周期完整运行(存疑)
flag=1;
}
}
void timer0() interrupt 1 //定时器0中断
{
pwm_t++;
if(pwm_t==255)
{
pwm_t=0;
flag=0;
}
if(pwm_left_val<=pwm_t)
IN1=IN2=0;
if(pwm_right_val<=pwm_t)
IN3=IN4=0;
}
void init()
{
TMOD=0x02;//8位自动重装模块 10模式
TH0=220;
TL0=220; //设置输出频率为100hz
TR0=1; //定时器0控制运行位
ET0=1; //定时器0中断
EA=1; //总中断
}
void forward() //小车前进
{
pwm_left_val=100;
pwm_right_val=100;
IN1=1 ;
IN2=0 ;
IN3=1;
IN4=0 ;
}
void turn_left() //小车左转
{
pwm_left_val=0;
pwm_right_val=100;
IN1=0 ;
IN2=0 ;
IN3=1;
IN4=0 ;
}
void turn_right() //小车右转
{
pwm_left_val=100;
pwm_right_val=0;
IN1=1;
IN2=0;
IN3=0;
IN4=0;
}
void stops() //小车停止
{
pwm_left_val=0;
pwm_right_val=0;
IN1=0 ;
IN2=0 ;
IN3=0;
IN4=0 ;
}
void XJ()
{
if(SE1==1&&SE2==1)
{
stops();
}
else if(SE1==0&&SE2==1)
{
turn_right();
}
else if(SE1==1&&SE2==0)
{
turn_left();
}
else
{
forward();
}
}