跪求超声波测距的程序
请高手指教,以下电路图能不能实现超声波测距?我想要一个超声波测距并在数码管上稳定显示的程序,在我的51开发板上测试。数码管的位选是P2^7,段选是P2^6,6个共阴极数码管。 汗,还跪求。我发的帖子里面就有51的程序,电路也是基本一样,搜索下吧 问问题前 先搜索下 这个电路没问题的。 lisingch 发表于 2012-3-29 23:14 static/image/common/back.gif这个电路没问题的。
但是还有个问题,就是为什么数码管显示的距离不断的跳变,是两个探头相互干扰了吗?还是其他原因? 两个探头的距离尽量远一些 比如8cm xsh2005105326 发表于 2012-3-29 13:20 static/image/common/back.gif
汗,还跪求。我发的帖子里面就有51的程序,电路也是基本一样,搜索下吧
弄了好些天了,快崩溃了!!所以求救高手。
我是看了别人的博客,稍微修改了他的程序,我将程序烧进去,发现勉强可以测距,但就是不稳定,就好像刚显示30cm,马上又变回20或者10cm,而且最大能探测的距离是60cm左右,,所以我想请教各位大哥。
我在想是不是程序没处理好,还是电路有问题,抑或是超声波安装的不好。我看到网上一些视频,电路跟我的差不多,但测距还是挺稳定的,所以想问一下各位,怎么使数码管测距比较稳定,不会跳动很大。程序如下:
//晶振12mhz,8个共阳极数码管,74hc573控制位选和段选,P2^7是位选,P2^6是段选
#include <AT89X52.H>
#include<intrins.h>
#defineuchar unsigned char
#defineuintunsigned int
#defineulong unsigned long
#definenop() _nop_()
ulong time; //总时间
uchar qian,bai,shi,ge; //千、百、十、个位
uchar flat; //标志位
sbit wei=P2^7;//位选
sbit duan=P2^6;段选
//sbit fashe=P1^4;
//sbit jieshou=P3^2;
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
};//共阳极
void delay(uchar us) //us*100 us 延时
{
uint i,j;
for(i=us;i>0;i--)
for(j=11;j>0;j--);
}
void fasong(uchar gs)
{
while(gs--)
{
P1_4 = 1;
nop();nop();nop();nop();
nop();nop();nop();nop();
P1_4 = 0;
nop();nop();nop();
nop();nop();nop();nop();
}
P1_4=0;
}
//用于距离计算
voidjisuan()
{
time = TH0;
time = (time<<8)|TL0;
time = time-300; //减去延时300 Us
time = time*170;
time = time/1000; //单位 mm
}
//分离千位、百位、十位、个位
void zhuanhuan()
{
qian= time/1000;
bai = time%1000/100;
shi = time%100/10;
ge= time%10;
}
void xianshi()
{
wei=1;
P0=0x08;
wei=0;
duan=1;
P0=table;
duan=0;
delay(4);
wei=1;
P0=0x04;
wei=0;
duan=1;
P0=table;
duan=0;
delay(4);
wei=1;
P0=0x02;
wei=0;
duan=1;
P0=table;
duan=0;
delay(4);
wei=1;
P0=0x01;
wei=0;
duan=1;
P0=table;
duan=0;
delay(4);
}
void main()
{
ucharcs; //扫描循环次数变量
TMOD = 0x11; //T0工作在16位计时状态,最高计时65ms
TH0 = 0x00;
TL0 = 0x00;
TR0 = 0; //先关闭T0
ET0 = 1; //开T0中断
EX0 = 0; //循环程序中再打开
PX0 = 1; //INT0中断高优先级
EA = 1;
while(1)
{
while(!P3_2){} //P3.2为低则等待,不发送
delay(5);
while(!P3_2){} //如果P3.2仍为低,等待,直到为高,在发
EX0 = 0; //开始发送前保证INT0是关闭状态
ET0 = 0; //先关闭T0中断
TH0 = 0x00;
TL0 = 0x00; //保证发射前初值为0
flat= 0;
ET0 = 1; //重新打开
//delay(1); //稍作延时100us
while(!P3_2){}
TR0 = 1; //T0 计时开始
fasong(3); //发送2个40khz脉冲
delay(3); //300us延时,防止直波干扰
EX0 = 1; //开始接收信号
while(!flat){} //如果flat=0,等待
if(flat == 1) //INT0中断完成后进入
{
flat = 0; //重新清0
TR0 = 0;
EX0 = 0;
ET0 = 0;
jisuan();//计算总时间和来回距离
zhuanhuan(); //各位分离处理
}
elseif(flat == 2) //如果超时,进入,
{
flat = 0;
qian = 10;
bai= 10;
shi= 10;
ge = 10; //显示----
}
for(cs=0;cs<180;cs++)
{
xianshi();
}
}
}
void Int0(void) interrupt 0
{
TR0= 0; //停止计时
ET0= 0;
flat = 1; //标志位置1
EX0= 0; //关闭外中端
while(!P3_2){} //等待P3.2变高再退出中断
}
void Time0(void) interrupt 1
{
TR0= 0;
EX0= 0;
ET0= 0;
flat = 2;
}
不稳定先看看硬件有无问题。接收端灵敏度过高容易出现干扰。 汗!网上程序一堆一堆的。你的这个原理图,没问题。好多人都在用这个图。
页:
[1]