打印

写了一个超声波数码管测距的程序有点问题麻烦大神解答

[复制链接]
1508|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
px123zx|  楼主 | 2014-1-10 19:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={                //共阴数码管0~9 -
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40};
sbit Trig  = P2^5; //产生脉冲引脚
sbit Echo  = P2^4; //回波引脚
sbit DU = P2^6;
sbit WE = P2^7;                                                                          
bit flag=0;
uint time,s,timer;
uchar a,b,c,d;
void delay(uchar n)         //延时1us函数
{
        uchar i;
        for(i=0;i<n;i++)
        {
                _nop_();
        }
}
void delaym(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)                                        
                for(y=110;y>0;y--);
}
void start()           // 触发超声波测距模块
{
//        delaym(800);
        Trig=1;
        delay(60);
        Trig=0;       
}
void conut()                 //计算距离
{
        time=TH0*256+TL0;                                                          
        TH0=0;
        TL0=0;
        s=time/58;
        a=s/1000;
        b=s%1000/100;
        c=s%100/10;
        d=s%10;
}
void display(uchar a,uchar b,uchar c,uchar d)   //显示距离
{
        if(flag==1||s>=700)
        {
                flag=0;
                DU=0;
                P0=table[10];
                DU=1;
                DU=0;

                WE=0;
                P0=0;
                WE=1;
                WE=0;
                delaym(4);
        }
        else
        {
                DU=0;
            P0=table[a];
            DU=1;
            DU=0;
          
            WE=0;
            P0=0xfe;
            WE=1;
            WE=0;
            delaym(4);
          
            P0=table[b];
            DU=1;
            DU=0;
          
            P0=0xfd;
            WE=1;
            WE=0;
            delaym(4);
       
            P0=table[c];
            DU=1;
            DU=0;
          
            P0=0xfb;
            WE=1;
            WE=0;
            delaym(4);
          
            P0=table[d];
            DU=1;
            DU=0;
          
            P0=0xf7;
            WE=1;
            WE=0;
            delaym(4);
                }
}
void main()
{
        TMOD=0x01;//设置定时器0工作方式
        TH0=0;
        TL0=0;
        ET0=1;//允许定时器0中断
        EA=1; //开总中断
        while(1)
        {  
                start();
                 while(!Echo);                  //当RX为零时等待
                 TR0=1;                                  //开启计数                                    
                 while(Echo);                  //当RX为1计数并等待
                 TR0=0;                                  //关闭计数
                conut();                          //计算
                display(a,b,c,d);                       
        }
}
void time0 () interrupt 1
{
        flag=1;
}

距离近没问题距离过远就会出现一点问题

相关帖子

沙发
dirtwillfly| | 2014-1-10 20:16 | 只看该作者
距离远了会有啥问题?

使用特权

评论回复
板凳
cyz12063456| | 2014-3-28 21:20 | 只看该作者
是不是距离远了会出现计数程序运算时间过长导致的问题。

使用特权

评论回复
地板
jimmychen| | 2014-3-29 23:12 | 只看该作者
为什么不适用51单片的gate 这个位呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

13

帖子

0

粉丝