我已经试验很多次了但是就是不行,程序也改了很多次,刚开始的时候只能检测30cm左右后来能检测到120cm,现在能检测到170cm,过了170cm之后只能断断续续的收到信号,有时候根本收不到信号,不知道是怎么回事,这个超声波模块应该没问题。下面我个我的程序和原理图,请大家帮我看看,谢谢了
/*************************************
主函数
**************************************/
#include "duan.h"
#include "smg.h"
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
sbit fs=P2^0;
uchar temp[]={0,0,0,0};
uchar s=3;
void delayms(void) //延时子程序
{
unsigned char i,j;
for(i=30;i>0;i--)
for(j=98;j>0;j--);
}
void main()
{
init();
while(1)
{
TR1=1;
while(s--)//发送3次40KHZ超声波
{
fs=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
fs=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
s=3;
delayms(); //延时6毫秒,现在还没开外部中断不知道为什么不管延时多长时间只要有外部中断就执行中断
EX0=1; //我在这里开外部中断
while(bj);
bj=1;
temp[1]=(int)shu/100%10;//显示测得的距离
temp[2]=(int)shu/10%10;
temp[3]=(int)shu%10;
display(temp);
}
}
/********************************************
中断函数
*********************************************/
#include "duan.h"
#include <reg52.h>
#include <intrins.h>
float t;
float shu; //距离只能把t和shu同时定义为float型才行
unsigned char m,bj=1;
void init() //中断初始化
{
TMOD=0X10;
EA=1;
ET1=1;
TH1=0X00;
TL1=0X00;
IT0=0;
}
void int1() interrupt 0 using 1 //外部中断0,用来接收声波
{
bj=0;
EX0=0;
TR1=0;
t=TH1*256+TL1;
shu=(t*17)/1000-3; //计算距离有3cm的误差
TH1=0X00;
TL1=0X00;
}
void int3() interrupt 3 using 3 //定时中断
{ bj=0;
TR1=0;
TH1=0X00;
TL1=0X00;