51做的超声波测距仪 5m以上 附程序 附电路 附资料

2020-01-21 21:35发布

来论坛也挺长时间了 学到了不少东西 总觉得该为坛子做的点什么 但限于本人水平有限 弄不出什么有水平的东东 这个得有待于以后的提升了 原来也做过点东西 就想把曾经做过的东东发上来给新手们练练手也是好的吧 今天发个超声波测距的 大二上的时候参加院的电子设计竞赛竞赛做的 其实这个东东做过的人很多了吧 现在也有好多成熟的模块 但是自己锻炼一下对新手的能力提升还是有帮助的吧 其中发送端用的是反相器推挽输出 加大发射功率 接收端用的CX20106A这个红外芯片接收40KHZ的方波 都是很经典的模式 按照这个电路应该挺容易成功的吧 废话不多说了 上图吧  补充一下测量误差的问题 1m内应为mm级 2m内1cm左右 5m的时候3cm左右


外观 (原文件名:QQ截图20111204113625.jpg)


外观 (原文件名:QQ截图20111204113648.jpg)


外观 (原文件名:QQ截图20111204113659.jpg)


下面的程序也挺简单的,用的定时器和外部中断 接收到回波的时候触发外部中断,在中断服务程序中进行处理 不用加注释应该能看懂吧 水平有限 程序肯定还有很多不足 给初学者用用应该也可以吧。   

#include <reg52.h>
#define unit unsigned int
#define uchar unsigned char
sbit fs=P3^0; //发送端;
sbit h=P2^0;
sbit l=P2^1;
sbit m=P2^2;//数码管位选端;
sbit jieshou=P3^2;
uchar tab[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8e};
uchar u[3]; //显示数组;
unit count,b,outcomeH,outcomeL,textover;
void delay(unit a) //延时;
{
unit m;
for(m=0;m<a;m++);
}
void delayms(uchar z)
{
        uchar x,y;
        for(x=0;x<z;x++)
                for(y=110;y>0;y--);
}
void tx() //从P3.0发出40KHz的脉冲
{
        uchar n,p;
        for(n=0;n<40;n++)
        {
        fs=1;
        for(p=0;p<3;p++);
        fs=0;
        for(p=0;p<2;p++);
        fs=0;
        }
}
void display(void) //显示;
{
        for(b=0;b<3000;b++)
        {
                l=1;m=1;h=1;
                P1=tab[u[0]];
                m=0;
                delay(10);
                m=1;
                P1=tab[u[1]];
                l=0;
                delay(10);
                l=1;
                P1=tab[u[2]];
                h=0;
                delay(10);
                h=1;
        }
}
void rx() interrupt 0 //外部中断0,接收信号
{
TR0=0;
outcomeH=TH0;
outcomeL=TL0;
count=outcomeH;
count<<=8;
count=count|outcomeL;
count/=59;

if(count>=10)
{
        u[0]=count%10;
        u[1]=(count/10)%10;
        u[2]=(count/100)%10;
        display();
}
        TH0=0;
        TL0=0;
        //textover=1;
}
void over()interrupt 1 //T0溢出为无效测量显示FFF;
{
u[0]=10;
u[1]=10;
u[2]=10;
display();
TR0=0;
}
void main()
{
        fs=0;
        delay(8600);
        TH0=0;
        TL0=0;
        TMOD=0x01;
        EA=1;
        ET0=1;
        PT0=1;
        IT0=1;
        IE=0x83;
while(1)
{
        delayms(50);
        fs=0;
        jieshou=1;
        tx();
        TR0=1;
}
}


(原文件名:发送.png)


(原文件名:接收.png)


(原文件名:显示.png)

剩下的是点资料 包括答辩时候的论文了 有用的朋友可以拿去

点击此处下载 ourdev_701393U9N14U.doc(文件大小:454K) (原文件名:最终提交-创兴杯答辩论文 超声波测距系统.doc)
点击此处下载 ourdev_701394FS3WOV.pdf(文件大小:59K) (原文件名:超声波测距电路图.pdf)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
97条回答
OyutianO
2020-01-29 17:56
Key_huang 发表于 2012-4-14 17:40
楼主你好!按照你的做法我也做了一个,奈何没能成功,想请教你两个问题:
1、我时按照你贴出来的原理图做的 ...

你好 才看见  回复你下 电路图不是完全一样的 首先电源我用的是四节五号电池 不是原理图中的稳压模块  还有CX20106A这个接受芯片由于我当时没有和电路图上完全一致的原件 参数会有微笑的变动 应该是某个电容值  我也忘记了 不过你可以百度一下CX20106A的文档 里面会有介绍 应该不会有影响  至于你说的关闭中断的问题 程序中始终没有关闭外部中断啊 只是关闭和打开计数器 TR0=0/TR0=1  还有我主程序中用了       delay(8600);  这个延时 就是为了满足在这个期间内能够完成一次数据的处理  保证数据的正确性     我做的时候也遇到你的问题了 就是跳动很大 数据不准 大多是延时时间的问题(也有可能是CX20106A的问题)发射端用的非门肯定是没问题的  你花点时间调试一下延时那里问题 试一下  应该会OK的

一周热门 更多>