#include<reg52.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
uchar Buffer[7] = {0}; //从串口接收的数据
uint i,j;
uint lan,xun;
sbit y1=P1^0;//定义单片机连接循迹板右1光电管的引脚
sbit y2=P1^1;//定义单片机连接循迹板右2光电管的引脚
sbit z1=P1^2;//定义单片机连接循迹板左1光电管的引脚
sbit z2=P1^3;//定义单片机连接循迹板左2光电管的引脚
sbit zuo1=P2^2;
sbit zuo2=P2^3;
sbit you1=P2^1;
sbit you2=P2^0;
void Delay_1ms(uint i)//1ms延时
{
uchar m,n;
for(n=0;n<i;n++)
for(m=0;m<=148;m++);
}
void delay(int z)//pwm中使用的延时函数
{
int i,j;
for(i=2;i>0;i--)
for(j=z;j>0;j--);
}
void Com_Int(void) interrupt 4
{
EA = 0;
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
if(SBUF==51) //这里减去48是因为从电脑中发送过来的数据是ASCII码。 Buffer[0] = SBUF - 48;
{
Buffer[0] = 3; // A
}
if(SBUF==52)
{
Buffer[0] = 4; // D
}
if(SBUF==50)
{
Buffer[0] = 2; // S
}
if(SBUF==49)
{
Buffer[0] = 1; // W
}
if(SBUF==53)
{
Buffer[0] = 5; // E 2
}
if(SBUF==54)
{
Buffer[0] = 6;
lan=1;
xun=0;
}
if(SBUF==55)
{
Buffer[0] = 7;
lan=0;
xun=1;
}
if(SBUF==56)
{
Buffer[0] = 8;
}
if(SBUF==57)
{
Buffer[0] = 9;
}
RI = 0;
}
EA = 1;
}
void Com_Init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
}
void qianjin()
{
you1=0;
you2=1;
zuo1=0;
zuo2=1;
}
void houtui()
{
you1=1;
you2=0;
zuo1=1;
zuo2=0;
}
void zuozhuan()
{
you1=0;
you2=1;
zuo1=1;
zuo2=0;
}
void youzhuan()
{
you1=1;
you2=0;
zuo1=0;
zuo2=1;
}
void tingche()
{
you1=0;
you2=0;
zuo1=0;
zuo2=0;
}
void qian()//左右轮协同前进子函数
{
you1=0;
you2=1;
zuo1=0;
zuo2=1;
delay(5);//pwm调速 此为pwm有效值,前进时速度为全速的90%
you1=1;
you2=1;
zuo1=1;
zuo2=1;
delay(10-5);
}
void you()//左右轮协同 右转子函数
{
you1=0;
you2=1;
zuo1=1;
zuo2=0;
delay(5);//pwm调速 此为pwm有效值,前进时速度为全速的80%
you1=1;
you2=1;
zuo1=1;
zuo2=1;
delay(10-5);
}
void zuo()//左右轮协同 左转子函数
{
you1=1;
you2=0;
zuo1=0;
zuo2=1;
delay(5);//pwm调速 此为pwm有效值,前进时速度为全速的80%
you1=1;
you2=1;
zuo1=1;
zuo2=1;
delay(10-5);
}
void ting()//左右轮都停止转动
{
you1=1;
you2=1;
zuo1=1;
zuo2=1;
delay(50000);
}
void main()
{
while(1)
{
if(xun==0)
{Delay_1ms(100);
Com_Init();//串口初始化
switch(Buffer[0])
{
case 5: tingche(); break;
case 1: qianjin(); break;
case 2: houtui(); break;
case 3: zuozhuan(); break;
case 4: youzhuan(); break;
default:break;
}
}
while(lan==0)
{
Com_Init();
y1=1;
y2=1;
z1=1;
z2=1;
qian();//调用前进子函数,使小车光电管不满足以下几个条件时都处于前进状态
while(((z1==1)&&(z2==1)&&(y1==0)&&(y2==0))||((z1==1)&&(z2==0)&&(y1==0)&&(y2==0))||((z1==0)&&(z2==1)&&(y2==0)&&(y2==0)))//判断当左边光电管遇到黑线时
{
zuo();//调用左转子函数
}
while(((z1==0)&&(z2==0)&&(y1==1)&&(y2==1))||((z1==0)&&(z2==0)&&(y1==0)&&(y2==1))||((z1==0)&&(z2==0)&&(y1==1)&&(y2==0)))//判断当右边光电管遇到黑线时
{
you();//调用右转子函数
}
while((z1==1)&&(z2==1)&&(y1==1)&&(y2==1))//判断当左、右光电管均遇到黑线,前光电管时
{
ting(); //即遇到T字路口时 停止
}
}
}
}
|