搜档网
当前位置:搜档网 › 循迹小车三路的程序

循迹小车三路的程序

#include<reg52.h>
//*********************第一部分 Start***************************************
sbit IN1=P2^2;//以下是点击驱动芯片L298 管脚位声明
sbit PWM1=P2^0;
sbit IN2=P2^3;
sbit IN3=P2^4;
sbit PWM2=P2^1;
sbit IN4=P2^5;
sbit ZUO=P1^0;
sbit ZHONG=P1^1//此处是传感器YOU20 管脚位声明
sbit YOU=P1^2;
int count1=0;//用于定时计数的两个全局变量位声明
int count2=0;
//*********************第一部分 End***************************************
//*********************第二部分 子函数定义 Start****************************
void forward_turn1()//电机1 前进
{
IN1=0;
IN2=1;
}
void reverse_return1()//电机1 后退
{
IN1=1;
IN2=0;
}
void forward_turn2()//电机2 前进
{
IN3=0;
IN4=1;
}
void reverse_return2()//电机2 后退
{
IN1=1;
IN2=0;
}
void speed1(int ct,int sd)//电机1 速度控制函数,其中参数sd 为生成PWM 波形的比较基准
{
if(ct<=sd)
PWM1=1;
else
PWM1=0;
}
void speed2(int ct,int sd)//电机2 速度控制函数,其中参数sd 为生成PWM 波形的比较基准
{
if(ct<=sd)
PWM2=1;
else
PWM2=0;
}
//*********************第二部分 子函数定义 End*********************
//**********第三部分 小车直线前进,左转,右转函数定义 Start********
void advance(int ct1,int sd1,int ct2,int sd2)//小车直线前进函数
{
forward_turn1();
forward_turn2();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
//*************以下是方案1, 通过使两轮一快一慢来实现转向******************************
void left_turn1(int ct1,int sd1,int ct2,int sd2)//小车左转
{
forward_turn1();
forward_turn2();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
void right_turn1(int ct1,int sd1,int ct2,int sd2)//小车右转
{
forward_turn1();
forward_turn2();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
//*************以下是方案2, 通过使两轮一正传,一反转来实现转向************************
void left_turn2(int ct1,int sd1,int ct2,int sd2)//小车左转
{
forward_turn1();
reverse_return2();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
void right_turn2(int ct1,int sd1,int ct2,int sd2)//小车右转
{
forward_turn2();
reverse_return1();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
//**********第三部分 小车直线前进,左转,右转函数定义 End********
//**********第4 部分 主函数 Start********************************
main()
{
TMOD=0x11;//中断模式设置
TH0=(65536-1000)/256;//定时器1 初始化
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
TH1=(65536-1000)/256;//定时器2 初始化
TL1=(65536-1000)%256;
EA=1;
ET1=1;
TR1=1;
while(1)
{
if(ZUO==0&&YOU==0&&ZHONG==0)//未检测到黑线,小车继续前进
{
advance(count1,500,count2,500);
}
if(ZUO==0&&YOU==0&&ZHONG==1)//未检测到黑线,小车继续前进
{
advance(count1,500,count2,500);
}
if(ZUO==1&&YOU==0&&ZHONG==0)

//仅左轮检测到黑线,小车向左转弯
{
left_turn1(count1,200,count2,500);
}
if(ZUO==0&&YOU==1&&ZH
ONG==1)//仅左轮检测到黑线,小车向左转弯
{
left_turn1(count1,200,count2,500);
}
if(ZUO==0&&YOU==1&&ZHONG==0)//仅右轮检测到黑线,小车向右转弯
{
right_turn1(count1,500,count2,200);
}
if(ZUO==1&&YOU==1&&ZHONG==0)//仅右轮检测到黑线,小车向右转弯
{
right_turn1(count1,500,count2,200);
}
if(ZUO==1&&YOU==1)/*左右轮均检测黑线,小车继续前进*/
/*(此处用来处理"8"字型路线交叉处小车如何前进的问题)*/
{
advance(count1,500,count2,500);
}
}
}
//**********第4 部分 主函数 End********************************
//**********第五部分 中断服务程序 Start********************************
void time0()interrupt 1
{
TH0=(65536-1000)/256;//定时1ms
TL0=(65536-1000)%256;
count1++;
if(count1>=1000)//周期是1s
count1=0;
}
void time1()interrupt 3
{
TH0=(65536-1000)/256;//定时1ms
TL0=(65536-1000)%256;
count2++;
if(count2>=1000)//周期是1s
count2=0;
}//**********第五部分 中断服务程序 End********************************




相关主题