这次做了一个用51控制的超声波测距东西,关于超声波收发模块是自己做的,不是买的。但是做出来之后测量一点都不准确,我自己找出的原因应该有两点,一是超声波收发接头在电路板上没有放平整,存在角度,所以误差大。二是程序问题。但是最终还是需要大神判定到底是啥问题,我是菜鸟,希望大神能解答,好人好报。。。附上代码。。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit csb=P3^7 ; //超声波发射端
sbit light=P3^5;
sbit beep=P3^6 ;
uchar t=0; //总时间
uint s=0; //单程距离
uchar flag=0; //接收标志
uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0到9的代码
sbit qian=P2^0;
sbit bai=P2^1;
sbit shi=P2^2;
sbit ge=P2^3;
uint xianshi[4]; //装千位 百位 十位 个位
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void delay(uint j)
{
while(j--);
}
void init_timer0()
{
TMOD=0x11; //方式1 16位
TH0=0;
TL0=0;
ET0=1;
TR0=0; // 先把计时启动关掉
}
void display(uint z)
{
xianshi[3]=z/1000; //千位
xianshi[2]=z/100%10; //百位
xianshi[1]=z/10%10; //十位
xianshi[0]=z%10; //个位
qian=0;
P0=led[xianshi[3]];
delay(100);
qian=1;
delay(100);
bai=0;
P0=led[xianshi[2]];
delay(100);
bai=1;
delay(100);
shi=0;
P0=led[xianshi[1]];
delay(100);
shi=1;
delay(100);
ge=0;
P0=led[xianshi[0]];
delay(100);
ge=1;
delay(100);
}
void int0() interrupt 0 /**外部中断0服务子程序***/
{
EX0=0;
TR0=0;
EA=0;
t=TH0*256+TL0-100; //全程时间
TH0=0;
TL0=0;
flag=1; //成功接收标志
}
void overtime() interrupt 1 /*超时清零。计满65ms,46ms时已达到8超出量程*/
{
EA=0;
TH0=0;
TL0=0;
EX0=0;
TR0=0;
ET0=0;
flag=2; //接收失败 超出量程接收
}
void csb_Tx() /**超声波发送 42khz**/
{
uchar i;
for(i=8;i>0;i--) //发送4个方波
{
csb=!csb;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
csb=1; //关发送
EA=1;
EX0=1;
ET0=1;
}
void main()
{
uchar h;
EA=1;
EX0=1; //开外部中断0
IT0=1; //下降沿触发
init_timer0();
while(1)
{
csb_Tx(); //发送超声波
delay_50us(2); //延时100us 以免回收超声波
TR0=1; //开始计时
while(flag==0); //等待接收
if(flag==1)
{
s=(0.17*t); //计算是厘米
flag=0;
for(h=0;h<50;h++)
{
display(s);
}
}
else if(flag==2)
{
s=0;
for(h=0;h<20;h++)
{
display(s);
}
flag=0;
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>