#include<reg52.h>
sbit r1=P2^7;
sbit r2=P2^6;
sbit l1=P2^4;
sbit l2=P2^3;
sbit z=P1^4;//定义单片机连接循迹板右边光电管的引脚
sbit y=P1^1;//定义单片机连接循迹板左边光电管的引脚
sbit q1=P1^3;
sbit q2=P1^2;
void delay(int z)//pwm中使用的延时函数
{
int i,j;
for(i=2;i>0;i--)
for(j=z;j>0;j--);
}
void qian()//左右轮协同前进子函数
{
r1=0;
r2=1;
l1=1;
l2=0;
delay(8);//pwm调速 此为pwm有效值,前进时速度为全速的90%
r1=1;
r2=1;
l1=1;
l2=1;
delay(10-8);
}
void turnright()//左右轮协同 右转子函数
{
r1=1;
r2=0;
l1=1;
l2=0;
delay(7);//pwm调速 此为pwm有效值,前进时速度为全速的80%
r1=1;
r2=1;
l1=1;
l2=1;
delay(10-7);
}
void turnleft()//左右轮协同 左转子函数
{
r1=0;
r2=1;
l1=0;
l2=1;
delay(7);//pwm调速 此为pwm有效值,前进时速度为全速的80%
r1=1;
r2=1;
l1=1;
l2=1;
delay(10-7);
}
void ting()//左右轮都停止转动
{
r1=1;
r2=1;
l1=1;
l2=1;
delay(50000);
}
void main()//主函数
{
z=1;
y=1;
q1=1;
q2=1;
while(1)//单片机不间断监测 (是个死循环)
{
qian();//调用前进子函数,使小车光电管不满足以下几个条件时都处于前进状态
while((q1==1)&&(q2==0))//判断当左边光电管遇到黑线时
{
turnleft();//调用左转子函数
}
while((q1==0)&&(q2==1))//判断当右边光电管遇到黑线时
{
turnright();//调用右转子函数
}
while((z==1)&&(y==1)&&(q1==1)&&(q2==1))//判断当左、前、右光电管均遇到黑线时
{
qian(); //即遇到十字路口时 继续前进
}
while((z==1)&&(y==1)&&(q1==0)&&(q2==0))//判断当左、右光电管均遇到黑线,前光电管时
{
ting(); //即遇到T字路口时 停止
}
以上代码51hei打包下载:
循迹小车16种.zip
(932 Bytes, 下载次数: 58)
|