|
#include<reg52.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
uchar Buffer[7] = {0}; //從串口接收的數(shù)據(jù)
uint i,j;
uint lan,xun;
sbit y1=P1^0;//定義單片機(jī)連接循跡板右1光電管的引腳
sbit y2=P1^1;//定義單片機(jī)連接循跡板右2光電管的引腳
sbit z1=P1^2;//定義單片機(jī)連接循跡板左1光電管的引腳
sbit z2=P1^3;//定義單片機(jī)連接循跡板左2光電管的引腳
sbit zuo1=P2^2;
sbit zuo2=P2^3;
sbit you1=P2^1;
sbit you2=P2^0;
void Delay_1ms(uint i)//1ms延時(shí)
{
uchar m,n;
for(n=0;n<i;n++)
for(m=0;m<=148;m++);
}
void delay(int z)//pwm中使用的延時(shí)函數(shù)
{
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) //當(dāng)硬件接收到一個(gè)數(shù)據(jù)時(shí),RI會(huì)置位
{
if(SBUF==51) //這里減去48是因?yàn)閺碾娔X中發(fā)送過(guò)來(lái)的數(shù)據(jù)是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; //設(shè)置波特率 9600
TL1 = 0xFd;
TR1 = 1; //啟動(dòng)定時(shí)器1
ES = 1; //開(kāi)串口中斷
EA = 1; //開(kāi)總中斷
}
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()//左右輪協(xié)同前進(jìn)子函數(shù)
{
you1=0;
you2=1;
zuo1=0;
zuo2=1;
delay(5);//pwm調(diào)速 此為pwm有效值,前進(jìn)時(shí)速度為全速的90%
you1=1;
you2=1;
zuo1=1;
zuo2=1;
delay(10-5);
}
void you()//左右輪協(xié)同 右轉(zhuǎn)子函數(shù)
{
you1=0;
you2=1;
zuo1=1;
zuo2=0;
delay(5);//pwm調(diào)速 此為pwm有效值,前進(jìn)時(shí)速度為全速的80%
you1=1;
you2=1;
zuo1=1;
zuo2=1;
delay(10-5);
}
void zuo()//左右輪協(xié)同 左轉(zhuǎn)子函數(shù)
{
you1=1;
you2=0;
zuo1=0;
zuo2=1;
delay(5);//pwm調(diào)速 此為pwm有效值,前進(jìn)時(shí)速度為全速的80%
you1=1;
you2=1;
zuo1=1;
zuo2=1;
delay(10-5);
}
void ting()//左右輪都停止轉(zhuǎn)動(dòng)
{
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();//調(diào)用前進(jìn)子函數(shù),使小車(chē)光電管不滿足以下幾個(gè)條件時(shí)都處于前進(jìn)狀態(tài)
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)))//判斷當(dāng)左邊光電管遇到黑線時(shí)
{
zuo();//調(diào)用左轉(zhuǎn)子函數(shù)
}
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)))//判斷當(dāng)右邊光電管遇到黑線時(shí)
{
you();//調(diào)用右轉(zhuǎn)子函數(shù)
}
while((z1==1)&&(z2==1)&&(y1==1)&&(y2==1))//判斷當(dāng)左、右光電管均遇到黑線,前光電管時(shí)
{
ting(); //即遇到T字路口時(shí) 停止
}
}
}
}
|
評(píng)分
-
查看全部評(píng)分
|