/***********************************************************************/
void UartInit() //9600bps@11.0592MHz
{
SCON=0x50; //設置為工作方式1
TMOD=0x11; //設置計數器工作方式2
PCON=0x00; //SMOD=1,波特率不加倍
TH1=0; //計數器設置初值
TL1=0;
TH0=0xfe;
TL0=0x33; //11.0592MZ晶振,0.5ms
/*IE=0x9A; */
ES=1;
ET1=1;
ET0=1;
EA=1;
TR0=1; //定時器開始
}
/************************************************************************************/
void UartInit2() //9600bps@11.0592MHz
{
SCON=0x50; //設置為工作方式1
TMOD=0x20; //設置計數器工作方式2
PCON=0x00; //SMOD=1,波特率不加倍
TH1=0xfd; //計數器設置初值
TL1=0xfd;
ES=1;
EA=1;
TR1=1;
}
/***********************************************************************/
void Time0_Int() interrupt 1 //T0中斷程序
{
TH0=0xfe; //重新賦值
TL0=0x33;
if(count< jd) //判斷0.5ms次數是否小于角度標識
pwm=1; //確實小于,PWM輸出高電平
else
pwm=0; //大于則輸出低電平
count=(count+1); //0.5ms次數加1
count=count%40; //次數始終保持為40 即保持周期為20ms
}
/*********************************************************************/
void timer0() interrupt 3 //T1中斷
{
}
/***********************************************************************/
void Count1() //計算左側超聲波距離的函數
{
while(!RX1); //當RX1為零時等待
TR1=1; //開啟計數
while(RX1); //當RX1為1計數并等待
TR1=0; //關閉計數
time=TH1*256+TL1;
TH1=0;
TL1=0;
s1=(time*1.7)/100; //算出來是CM
}
/***********************************************************************/
void delay(int i)//延時
{
int j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
/***********************************************************************/
/*void keyscan() //按鍵掃描
{
if(jia==0) //角度增加按鍵是否按下
{
delay(10); //按下延時,消抖
if(jia==0) //確實按下
{
jd=jd+2; //角度標識加1
count=0; //按鍵按下 則20ms周期從新開始
if(jd==7)
jd=5; //已經是180度,則保持
while(jia==0); //等待按鍵放開
}
}
if(jian==0) //角度減小按鍵是否按下
{
delay(10);
if(jian==0)
{
jd=jd-2; //角度標識減1
count=0;
if(jd==-1)
jd=1; //已經是0度,則保持
while(jian==0);
}
}
} */
/************************************************************************/
void cej()
{
TX1=1; /*開啟超聲波1探測*/
delay(1);
TX1=0;
Count1(); //測距
}
void main()
{
jd=3;
count=0;
delay(10);
while(1)
{
if(P27==0)
{
delay(10);
if(P27==0)
{
UartInit();
delay(10000);
while(1)
{
cej();
if(s1<=16)
{
tingz();
delay(10);
jd=5;
delay(10000);
cej();
s2=s1;
jd=1;
delay(10000);
cej();
s3=s1;
if(s2>=s3)
{
zuoz();
}
if(s2<s3) youz();
delay(50000);
jd=3;
delay(10000);
}
if(s1>10)
{
qianj();//前進
}
if(P26==0)
{
delay(10);
if(P26==0) break;
}
}
}
}
if(P26==0)
{
delay(10);
if(P26==0)
{
UartInit2();
delay(1000);
while(1)
{
if(a==zhuanhuan)
{
if(P33==0&&P34==1) zuoz();
else if(P33==1&&P34==0) youz();
else if(P33==0||P34==0) qianj();
}
if(a==Go) qianj();//前進
if(a==Back) hout();//后退
if(a==Left) zuoz();//左轉
if(a==Right) youz();//右轉
if(a==Stop) tingz();//停止
if(P27==0)
{
delay(10);
if(P27==0) break;
}
jd=3;
}
}
}
}
}
|