弄了好些天了,快崩溃了!!所以求救高手。
我是看了别人的博客,稍微修改了他的程序,他的博客地址
http://blog.sina.com.cn/s/blog_624a11f00100gada.html。我将程序烧进去,发现勉强可以测距,但就是不稳定,就好像刚显示30cm,马上又变回20或者10cm,而且最大能探测的距离是60cm左右因为博主没怎么上博客,没有回答我的问题,所以我想请教各位大哥。我用的电路图如下:。
收发.png (234.73 KB, 下载次数: 6)
下载附件
2012-3-30 07:51 上传
我在想是不是程序没处理好,还是电路有问题,抑或是超声波安装的不好。我看到网上一些视频,电路跟我的差不多,但测距还是挺稳定的,所以想问一下各位,怎么使数码管测距比较稳定,不会跳动很大。程序如下:
//晶振12mhz,8个共阳极数码管,74hc573控制位选和段选,P2^7是位选,P2^6是段选
#include <AT89X52.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define nop() _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;
}
//用于距离计算
void jisuan()
{
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[qian];
duan=0;
delay(4);
wei=1;
P0=0x04;
wei=0;
duan=1;
P0=table[bai];
duan=0;
delay(4);
wei=1;
P0=0x02;
wei=0;
duan=1;
P0=table[shi];
duan=0;
delay(4);
wei=1;
P0=0x01;
wei=0;
duan=1;
P0=table[ge];
duan=0;
delay(4);
}
void main()
{
uchar cs; //扫描循环次数变量
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(); //各位分离处理
}
else if(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;
}
一周热门 更多>