#include <reg52.h>
sbit IN1 = P1^0;
sbit IN2 = P1^1;
sbit ENA = P1^2;//右轮
sbit IN3 = P1^3;
sbit IN4 = P1^4;
sbit ENB = P1^5;//左轮
//循迹模块
sbit left1 = P0^0;
sbit left2 = P0^1;
sbit right2 = P0^3;
sbit right1 = P0^2;
unsigned char zkb1 = 0;
unsigned char zkb2 = 0;
unsigned char t = 0;
unsigned char flag;
void init()
{
EA = 1;
TMOD |= 0x01;
TH0 =(65536 - 100) / 256;
TL0 = (65536 - 100)% 256;
ET0 = 1;
TR0 = 1;
ENA = 1;
ENB = 1;
}
void turn_left2()//大左转
{
zkb1 =22;
zkb2= 13;
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
void turn_left1() //小左转
{
zkb1 = 20;
zkb2 = 13;
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
void turn_left3()//中左转
{
zkb1 = 22;
zkb2 = 13;
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
void turn_right1()//小右转
{
zkb1 = 10;
zkb2 = 22;
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
void turn_right2() //大右转
{
zkb1 = 13;
zkb2 = 22;
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
void turn_right3()//中右转
{
zkb1 = 10;
zkb2 = 22;
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
void qianjin()
{
zkb1=20;
zkb2=22;
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
void houtui()
{
zkb1=20;
zkb2=22;
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
void xunji()
{
if((left1 == 0)&&(left2 == 1)&&(right2 == 1)&&(right1 == 0))
{
flag = 0;
}
if((left1 == 0)&&(left2 ==0)&&(right2 == 1)&&(right1 == 0))
{
flag = 1;
}
if((left1 == 0)&&(left2 == 1)&&(right2 == 0)&&(right1 == 0))
{
flag = 2;
}
if((left1 == 1)&&(left2 == 0)&&(right2 == 0)&&(right1 == 0))
{
flag = 3;
}
if((left1 == 0)&&(left2 == 0)&&(right2 == 0)&&(right1 == 1))
{
flag = 4;
}
if((left1 == 0)&&(left2 == 0)&&(right2 == 0)&&(right1 == 0))
{
flag = 5;
}
if((left1 == 1)&&(left2 == 0)&&(right2 == 1)&&(right1 == 0))
{
flag = 6;
}
if((left1 == 0)&&(left2 == 1)&&(right2 == 0)&&(right1 == 1))
{
flag = 7;
}
switch(flag)
{
case 0:qianjin();break;
case 1:turn_right1();break;
case 2:turn_left1();break;
case 3:turn_left2();break;
case 4:turn_right2();break;
case 5:houtui();break;
case 6:turn_left3();break;
case 7:turn_right3();break;
default:qianjin();break;
}
}
void timer0() interrupt 1
{
TH0 = (65536 - 100) / 256;
TL0 = (65536 - 100) % 256;
if(t < zkb1 )
{
ENA = 1;
}
else
{
ENA = 0;
}
if(t < zkb2 )
{
ENB = 1;
}
else
{
ENB = 0;
}
++t;
if(t== 50)
{
ENA=~ENA;//没有加这个导致的判断程序错乱
ENB=~ENB;
t = 0;
}
}
void main()
{
init();
//zkb1 = 8;
//zkb2 = 8;
qianjin();
while(1)
{
xunji();
}
}
/*
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num1,num2,a,b,c,d;
uchar count1=0;
uchar count2=0;
sbit PWM1=P1^0;
sbit IN1=P1^1;
sbit IN2=P1^2;
sbit PWM2=P1^3;
sbit IN3=P1^4;
sbit IN4=P1^5;
sbit ZW=P0^0;
sbit ZN=P0^1;
sbit YN=P0^2;
sbit YW=P0^3;
void delayms (uint z)
{
uchar y,x;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void forward_turn1()
{
IN1=0;
IN2=1;
}
void reverse_turn1()//左电机反转 //pwm2
{
IN1=1;
IN2=0;
}
void forward_turn2()//右电机正转 //pwm1
{
IN3=0;
IN4=1;
}
void reverse_turn2()//右电机反转
{
IN3=1;
IN4=0;
}
void advance()//前进
{
forward_turn1();
forward_turn2();
}
void houtui() //后退
{
reverse_turn1();
reverse_turn2();
}
void init()//初始化子函数
{
TMOD=0x11;
TH0=(65536-1000)/256;//中断周期1ms
TL0=(65536-1000)%256;
TH1=(65536-1000)/256;//中断周期1ms
TL1=(65536-1000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1;//开定时器1中断
TR0=1; //启动定时器0
TR1=1; //启动定时器1
}
void depand() //红外对管赋值给pwm
{
while(1)
{
if((ZN==1)&&(YN==1)&&(ZW==0)&&(YW==0))
{
a=10;
b=30;
}
}
}
//pwm1右电机,pwm2左电机
void main ()
{
advance();
init();//初始化子函数
while(1)
{
depand();
}
//等待中断发生
}
void T0_time()interrupt 1//重装初值,服务左电机
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
num1++;
if(num1=1)//一个定时器周期到了,即将进入中断
{
count1++;
num1=0;
if(count1>a&&count1<=b)//左电机前进pwm
{
PWM2=0;
}
if(count1<=a)
{
PWM2=1;
}
if(count1==b)
{
count1=0;//等于7的时候清零
}
}
}
void T1_time()interrupt 3//重装初值,服务右电机
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
num2++;
if(num2=1)//一个定时器周期到了,即将进入中断
{
count2++;
num2=0;
if(count2>10||count2<=30)//左电机前进pwm
{
PWM1=0;
}
if(count2<=10)
{
PWM1=1;
}
if(count2==30)
{
count2=0;//等于7的时候清零
}
}
}
*/
/*if((ZN==1)&&(YN==1)&&(ZW==0)&&(YW==0))//小车直行
{
advance();
delayms(100);
PWM1=1,PWM2=1;
delayms(40);
PWM1=0,PWM2=0;
}
if((ZW==0)&&(ZN==0)&&(YN==1)&&(YW==0))//小右转
{
advance();
delayms(110);
PWM1=1;
delayms(30);
PWM1=0;
delayms(30);
PWM2=1;
delayms(110);
PWM2=0;
}
if((ZW==0)&&(ZN==0)&&(YN==1)&&(YW==1))//中右转
{
advance();
delayms(100);
PWM1=1;
delayms(40);
PWM1=0;
delayms(60);
PWM2=1;
delayms(80);
PWM2=0;
}
if((ZW==0)&&(ZN==0)&&(YN==0)&&(YW==1))//大右转
{
advance();
delayms(110);
PWM1=1;
delayms(30);
PWM1=0;
delayms(50);
PWM2=1;
delayms(90);
PWM2=0;
}
if((ZW==0)&&(ZN==1)&&(YN==0)&&(YW==0))//小左转
{
advance();
delayms(30);
PWM1=1;
delayms(110);
PWM1=0;
delayms(110);
PWM2=1;
delayms(30);
PWM2=0;
}
if((ZW==1)&&(ZN==1)&&(YN==0)&&(YW==0))//中左转
{
advance();
delayms(60);
PWM1=1;
delayms(80);
PWM1=0;
delayms(100);
PWM2=1;
delayms(40);
PWM2=0;
}
if((ZW==1)&&(ZN==0)&&(YN==0)&&(YW==0))//大左转
{
advance();
delayms(50);
PWM1=1;
delayms(90);
PWM1=0;
delayms(110);
PWM2=1;
delayms(30);
PWM2=0;
}
if((ZN==1)&&(YN==1)&&(ZW==1)&&(YW==1))//停止
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
if((ZW==0)&&(ZN==0)&&(YN==0)&&(YW==0))//小车后退
{
houtui();
delayms(100);
PWM1=1,PWM2=1;
delayms(40);
PWM1=0,PWM2=0;
}
}
}*/
|