搜索
bottom↓
回复: 3

超声波测距在数码管显示,只能测40cm左右的距离,求高手指教

[复制链接]

出0入0汤圆

发表于 2013-6-17 19:42:08 | 显示全部楼层 |阅读模式
我看了很多网上的资料,经过更改发现现在无法测量50厘米以上的,求高手指导

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-6-17 19:44:32 | 显示全部楼层
有没有高手指导下

出0入0汤圆

 楼主| 发表于 2013-6-17 19:46:53 | 显示全部楼层
#include<reg51.h>
#include<intrins.h>

sbit Send=P1^0;
sbit Rece=P1^1;
bit Over_flag=0;
#define uchar unsigned char
#define uint  unsigned int
#define u16 unsigned char

uchar code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
                     0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff};
uchar dbuf[]={1,3,2,4};

void Delay_ms(uchar time)
{
        uchar i;
        while(time--)
                for(i=0;i<200;i++);
}
void Disp_Led(void)
{
        uchar i,Bsel;
           Bsel=0x10;
            for(i=0;i<4;i++)
     {
             P0=Bsel;
                 P2=0xdf;
                 P2=0x00;
                P0=segtab[dbuf[i]];                                                               
             P2=0xff;
             Delay_ms(1);
             Bsel=_crol_(Bsel,1);
                P0=0xff;
                 P2=0x00;
           }
}
/*******************************************************************
            程序说明:产生一40Khz频率
            参数说明:无
            返回说明:无
********************************************************************/
void Send_40khz(void)
{
        Send=~Send;
        _nop_();       
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}

/*******************************************************************
          程序说明:分解所测距离送显
          参数说明:无
          返回说明:无
  ********************************************************************/
void Rang_div(u16 value)
{
        dbuf[0]=value/1000;
        dbuf[1]=value/100%10;
        dbuf[2]=value/10%10;
        dbuf[3]=value%10;
}
/*******************************************************************
          程序说明:测量距离溢出
          参数说明:无
          返回说明:无
*******************************************************************/
void Timer0(void)interrupt 1
{
        Over_flag=1;                        //设置溢出标志
}

/*******************************************************************
          程序说明:每隔12.5ms将重新发送一次声波。
          参数说明:无
          返回说明:无
*******************************************************************/
void Timer1(void)interrupt 3
{
        static uchar Count=0;
        uchar i;
        Count++;
        if(Count==50)
        {
                Count=0;
                for(i=0;i<5;i++)        //发送5个40Khz波形
                {
                        Send_40khz();
                }
                TR0=1;                        //启动定时器1来计数距离
                Send=1;
        }
}
/*******************************************************************
          程序说明:超声波测量程序,通过控制定时器,并运用查询方式等待超声
                波回波。读取定时器的值。根据声音在空气中的传播速度计算
                            出被测地的距离
          参数说明:无
          返回说明:返回一无符号整型,所测距离大于一个字符。
*******************************************************************/
uint Get_Rang(void)
{
        uint Over_Time=0;                //定义超时标志
        uint Rangs;                       
        float Time;
        TR1=1;                                //开启定时器1来发送声波
        while(Rece&&(Over_Time<2000))Over_Time++;//在额定时间内等待声波
        EA=0;                                //表示接收到声波或者超时
        TR0=0;                                //关闭定时器
        TR1=0;
        Time=TH0*256+TL0;                //获取计数值
        Rangs=Time*17/1000;        //计算距离         0.034cm/us*time /
                                                //                                                        / 2
        if(Over_Time>1700||Over_flag||Rangs>400)//超时或大于5m或者定时器溢出
        {
                Rangs=0;                        //无距离
        }       
        TH0=TL0=0;                        //清除各标志
        Over_Time=0;
        Over_flag=0;
        return Rangs;
}

void main(void)
{
        uint Rang;
        uchar i;
        TMOD=0x21;                        //定时器1来设置重复发送,定时器2计数时间
        TH0=0;
        TL0=0;
        TH1=-250;
        TL1=-250;
        EA=1;                                //允许定时中断
        ET0=1;
        ET1=1;
        while(1)
        {
                Rang=Get_Rang();        //获取距离
                Rang_div(Rang);        //分解获取距离
                for(i=0;i<200;i++)        //延时一段时间重新测量
                        Disp_Led();
                EA=1;                        //开启定时器再次测量
        }               
}

出0入0汤圆

发表于 2013-6-17 21:28:34 | 显示全部楼层
路过啊     一点不会啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表