#include<reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
uchar Duty_2_left,Duty_2_right;
uchar i=0,j=0;
uchar flag; //用于循迹方向的判断
sbit IN1 = P1^4;
sbit IN2 = P1^5;
sbit IN3 = P1^6;
sbit IN4 = P1^7;
sbit IN5 = P0^7;
sbit IN6 = P0^6;
sbit IN7 = P0^5;
sbit IN8 = P0^4;
sbit ENA = P3^3;
sbit ENB = P3^2;
sbit left=P2^0; //左右两个传感器
sbit right=P2^1;
//小车直行速度赋值
void forward_move()
{
Duty_2_left=20;
Duty_2_right=20;
IN1=1;
IN2=1;
IN3=0;
IN4=0;
IN5=1;
IN6=1;
IN7=0;
IN8=0;
}
//小车停止
void stop()
{ Duty_2_left=0;
Duty_2_right=0;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
IN5=0;
IN6=0;
IN7=0;
IN8=0;
}
//小车左转速度赋值(用于左边传感器检测到黑线)
void Left_turning()
{
Duty_2_left=18;
Duty_2_right=20;
IN1=1; //两个电机一个正转一个反转(或者一个正转一个不转)
IN2=1;
IN3=0;
IN4=0;
IN5=0;
IN6=0;
IN7=1;
IN8=1;
}
//小车右转速度赋值(用于右边传感器检测到黑线)
void Right_turning()
{
Duty_2_left=18;
Duty_2_right=20;
IN1=0;
IN2=0;
IN3=1;
IN4=1;
IN5=1;
IN6=1;
IN7=0;
IN8=0;
}
//定时器0中断初始化
void timer0init()
{
TMOD|=0x01;//定时器T0, 工作方式1, 16位
TH0=0xff;//定时 ff9c 0.1ms
TL0=0x9c;
EA=1; //开启总中断
ET0=1;//开启中断允许
TR0=1;//开启定时器中断
}
//定时器中断服务函数
void timer0() interrupt 1
{
TH0=0xff;
TL0=0x9c;
i++;
j++;
if(i<=Duty_2_left)//设置左轮占空比,即左轮速度
ENA=1;
else
ENA=0;
if(j<=Duty_2_right)
ENB=1;
else
ENB=0;
if(i==100) //设置pwm周期=0.1ms*100=10ms,这样开头定义的变量正好表示占空比数值
{
i=0;//加到100后变为0,重新计数
}
if(j==100)
{
j=0;
}
}
//循迹模块
void xunji()
{
if((left==0)&&(right==1))
{
flag = 0;//左边检测到黑线
}
else if((left==1)&&(right==0))
{
flag = 1;//右边检测到黑线
}
else if((left==1)&&(right==1))
{
flag = 3; //两边都没检测到黑线
}
else
{
flag = 4;
}
switch(flag)
{
case 0: Right_turning();break;
case 1: Left_turning();break;
case 3: forward_move();break;
case 4: forward_move();break;
default: forward_move();break;
}
}
void main()
{
timer0init();
//forward_move();
while(1)
{
xunji();
}
}
|