//芯片為stc89c52.有三個定時器T0T1T2
T0分給了超聲波測距使用,T1給舵機的pwm調速使用,t2定時器給藍牙使用。
自動避障代碼單獨調試的時候可以正常運行
t2藍牙小車單獨使用的時候也同上
我把兩者合到一塊(將自動避障的主函數改成了一個我自己命名的函數,藍牙小車的哪一塊正常為主函數,將這個我自己命名的函數放在藍牙的stwich函數的case之中)就發生了故障,故障一般有兩種情況,。都不能正常運行,要么就是舵機不能動了,要么就是藍牙沒用了,小車在自己動。
//超聲波自動避障的獨立代碼模塊
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit in1=P1^0;//in1,in2控制左電機
sbit in2=P1^1;
sbit in3=P1^2;//in3,in4控制右電機
sbit in4=P1^3;
sbit Echo=P2^1; //超聲波的ECHO口,發射一個超聲波
sbit Trig=P2^2; //超聲波的TRIG口,接受返回超聲波
sbit duoji=P2^0;//舵機信號口
uint zbjl,qmjl,ybjl;//左邊距離,前面距離,右邊距離
int S,i;//測算距離
uint shijian,time,jishu;
int csbceju()//超聲波測距
{ TH0=0x00;//初始化定時器
TL0=0x00;
S=0; //初始化
Trig=0;
Echo=0;
_nop_();//延遲1us
Trig=1;//給Trig 10us的高電平脈沖信號
for( i=0;i<12;i++)
{
_nop_();
}//12us
Trig=0;//觸發超聲波
while(!Echo); //等待高電平
TR0=1; //開啟計數
while(Echo); //等待低電平
TR0=0; //關閉計數
time=TH0*256+TL0;//通過超聲波往返的時間計算距離 距離=往返時間*1.7
S=(time*1.7)/100;//計算cm
Echo=0;
TH0=0x00;
TL0=0x00;
return S;//返回一個最終結果
}
void yanchi(uchar s)
{
uint i;
for(;s>0;s--)
for(i=500;i>0;i--);
}
void djhs()interrupt 3//舵機的pwm調速,t1中斷
{
TH1=0xff; // 0.1ms
TL1=0x9c; //65536-100
jishu++;
if(jishu<=shijian){ duoji = 1; }
else { duoji = 0; }
if (jishu>= 200){jishu = 0; }
}
void main()//自動避障模塊
{TMOD=0x11; //設T0為方式1,T1方式為1
TH0=0x00;//t0初始化
TL0=0x00;
TH1=0xff;
TL1=0x9c;
ET0=1;
ET1=1;
TR0=1; //允許T0中斷
EA=1;
while(1){
shijian=14;//舵機旋轉至81°
jishu=0;
yanchi(100);
TR1=1;
yanchi(100);
TR1=0;
qmjl=csbceju();//獲得一個正前方的距離
shijian=5;//舵機旋轉至0°
jishu=0;
yanchi(100);
TR1=1;
yanchi(200);
TR1=0;
ybjl=csbceju();//獲得一個右邊的距離
shijian=20;//舵機旋轉至135°
jishu=0;
yanchi(100);
TR1=1;
yanchi(200);
TR1=0;
zbjl=csbceju();//獲得一個左邊的距離
if(qmjl>40&&ybjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;//前進
yanchi(50);//前進一段時間停止
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>40&&zbjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;
yanchi(50);
in1=0;in2=0;in3=0;in4=0;
}
else if(zbjl>40&&ybjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(zbjl>40&&qmjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>40&&ybjl>qmjl)
{
in1=1;in2=0;in3=1;in4=1;//右轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>40&&ybjl>zbjl)
{
in1=1;in2=0;in3=1;in4=1;//右轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>30&&ybjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;//前進
yanchi(50);//前進一段時間停止
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>30&&zbjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;
yanchi(50);
in1=0;in2=0;in3=0;in4=0;
}
else if(zbjl>30&&ybjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(zbjl>30&&qmjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>30&&ybjl>qmjl)
{
in1=1;in2=0;in3=1;in4=1;//右轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>30&&ybjl>zbjl)
{
in1=1;in2=0;in3=1;in4=1;//右轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<30&&ybjl<10&&zbjl<10)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<10&&ybjl<30&&zbjl<10)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<10&&ybjl<10&&zbjl<30)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>20&&ybjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;//前進
yanchi(50);//前進一段時間停止
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>20&&zbjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;
yanchi(50);
in1=0;in2=0;in3=0;in4=0;
}
else if(zbjl>20&&ybjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(zbjl>20&&qmjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>20&&ybjl>qmjl)
{
in1=1;in2=0;in3=1;in4=1;//右轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>20&&ybjl>zbjl)
{
in1=1;in2=0;in3=1;in4=1;//右轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<20&&ybjl<10&&zbjl<10)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<10&&ybjl<20&&zbjl<10)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<10&&ybjl<10&&zbjl<20)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
}
}
//t2定時器藍牙小車
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar tmp;
sfr T2MOD=0xc9;
sbit in1=P1^0;//in1,in2控制左電機
sbit in2=P1^1;
sbit in3=P1^2;//in3,in4控制右電機
sbit in4=P1^3;
void init()
{
ES=0;
T2MOD=0x01;//工作方式1
T2CON=0X30;//接收發送模式
TH2=0xFD;//初值,比特率9600
TL2=0xDC;
RCAP2H=0xFF;
RCAP2L=0xDC;
SCON=0x50;
PCON=0x00;
TR2=1;//開啟T2
ET2=1;
PCON &= 0x7f;
TI=0;
RI=0;
PS=1;//設置藍牙為最高優先級
EA=1;//開總中斷
ES=1;//開串口中斷
}
//藍牙小車
void main()
{
init();
while(1)
{
if(RI==1) // 是否有數據到來
{
RI = 0;
tmp = SBUF; // 暫存接收到的數據
switch(tmp)
{
case '1':in1=1;in2=0;in3=1;in4=0;break; //后退
case '2':in1=0;in2=1;in3=0;in4=1; break;//前進
case '3':in1=1;in2=1;in3=1;in4=0; break;//左轉
case '4':in1=1;in2=0;in3=1;in4=1; break;//右轉
case '0':in1=0;in2=0;in3=0;in4=0;break;//停止
}
}
}
} |