做了一个走迷宫的小车,计划在小车的左右两边各安装一对超声波传感器,用超声波进行避障。
系统芯片用的是stc89c51,用P1.0口发射40khz的超声波,发射超声波的同时定时器t0和t1开始计数(TMOD=0X11),当左侧超声波传感器接收到回波时,外部中断0产生中断,定时器t0停止计数,当右侧超声波传感器接收到回波时,外部中断1产生中断,定时器t1停止计数。用两个变量time1和time2分别表示左侧和右侧距离障碍物的距离,写的程序如下,调试了一天了,仍然无法实现。请大家看看程序哪里有问题。小弟感激涕零。。。
#include<REG51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
extern void cs_t(void); //extern表示函数在别的文件中
extern void delay(uint);
data uchar testok1;
data uchar testok2;
sbit led1=P2^4;
sbit led2=P2^5;
/*主程序*/
void main(void)
{
data ulong time1;
data ulong time2;
P0=0xff;
P2=0xfb;
TMOD=0x11; /*定时计数器t0和t1均工作于方式1(16位)*/
EA=1; /*开总中断(EA=1)*/
while(1)
{
cs_t(); //发射超声波
delay(1);
testok1=0;
testok2=0;
EX0=1; /*外部中断0的中断允许控制位*/
ET0=1; /*定时计数器t0的中断允许控制位(溢出中断)*/
EX1=1; //外部中断1的中断允许控制位
ET1=1; //定时器t1的中断允许控制位
if(1==testok1)
{
time1=TH0;
time1=(time1<<8) | TL0; //按位或
time1=time1*170/10000; //所测得的距离,单位(cm)
if(time1<50)
led1=0; //使led1灯亮
}
if(1==testok2)
{
time2=TH1;
time2=(time2<<8)|TL1;
time2=time2*170/10000;
if(time2<50)
led2=0; //是led2灯亮
}
}
}
/*超声波接收程序(外中断0)*/
void cs_r0(void) interrupt 0 //外中断0的中断号为0
{
TR0=0; /*停止计数*/
ET0=0;
EX0=0;
testok1=1;
}
/*超声波接受程序(外中断1)*/
void cs_r1(void) interrupt 2 //外部中断1的中断号为2
{
TR1=0; //停止计数
ET1=0;
EX1=0;
testok2=1;
}
/*超时清除程序(内中断0)*/
void overtime1(void) interrupt 1 //定时器t0的中断号为1
{
EX0=0;
TR0=0;
ET0=0;
testok1=2;
}
/*超时清除程序(内中断1)*/
void overtime2(void) interrupt 3 //定时器t1的中断号为3
{
EX1=0;
TR1=0;
ET0=0;
testok2=2;
}
这是超声波发射程序:
CS_T: PUSH ACC
MOV TH0,#00H
MOV TL0,#00H
mov th1,#00h
mov tl1,#00h
MOV A,#6D /*发射脉冲个数*/
SETB TR0 /*t0启动计数*/
SETB TR1 /*T1启动计数*/
CS_T1: CPL P1.0
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ ACC,CS_T1 /*减1不为0跳转*/
POP ACC
RET
END |