//芯片为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;//停止
}
}
}
} |