打印
[51单片机]

求助,51超声波测距不能正确显示故障

[复制链接]
1483|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
long2022|  楼主 | 2014-1-5 22:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我按照网上的方法写的超声波程序,按照程序:如果大天于400cm或是有中断溢出,应该显示---,但现实情况是,我拔掉超声波模块的vcc/ecoh/trig三个线中的一个的话,屏上会显示拔掉前测到的距离,拔掉gnd线会显示一个10多的数字,求高手给看看程序那里错了
#include<reg52.h>
#define uint8        unsigned char
[color=[/img]Blue]#define uint16  unsigned int
long s;
sbit RS = P2^1;   //定义端口
sbit RW = P1^5;
sbit EN = P1^6;
sbit echo = P3^2 ;
sbit trig = P3^4;
uint8 table[3];          //距离接收缓存

bit flag;

void DelayMS(uint16 dly)                //ms延时
{
        uint16 x,y;
        for(x=dly;x>0;x--)
                for(y=124;y>0;y--);
}                                                  

bit BUSY(void)                                        //最高位为忙信号位
{
        bit Bit;
        RS = 0;
        RW = 1;
        EN = 1;
        DelayMS(1);
        Bit = (bit)(P0 & 0x80);       
        EN = 0;
        return Bit;                               
}
void Write_cmd(uint8 cmd)                // 写命令
{
        while(BUSY());                        //测忙
        RS = 0;
        RW = 0;
        EN = 0;       
        P0 = cmd;
        EN = 1;
        DelayMS(1);
        EN = 0;                       
}

void Write_dat(uint8 dat)                //写数据
{
        while(BUSY());                        //测忙
        RS = 1;
        RW = 0;
        EN = 0;       
        P0 = dat;
        EN = 1;
        DelayMS(1);
        EN = 0;                       
}
void LCD_Init(void)                                //初始化液晶
{
        Write_cmd(0x38);                        //功能设置
        DelayMS(1);
        Write_cmd(0x0c);                        //显示开关控制
        DelayMS(1);
        Write_cmd(0x06);                        //输入方式设置
        DelayMS(1);
        Write_cmd(0x01);                        //清除LCD的显示内容
        DelayMS(1);
}
void juli()                                           //距离计算
{               
                uint8 timeout;                //测超时        用
                TH0=0;
                TL0=0;
                trig =1;
                DelayMS(1/10);
                trig =0;
                flag=0;
                while((echo==0)&&(++timeout<50000)); //timeout 超时退出
               
                TR0=1;
                while((echo==1)&&(++timeout<50000)); //timeout 超时退出
                TR0=0;
                s=(TH0*256+TL0)/58;
                table[0]= s/100;
                table[1]=s%100/10;
                table[2]= s%100%10;
               

}

void main ()
{  
        trig =0;
        LCD_Init()  ;
        TMOD=0x01;
    TL0=0;                              //设置定时器0初值低8位
    TH0=0;                              //设置定时器0初值高8位
    TR0=0;                         //停止定时器0
    ET0=1;                         //Timer0中断允许
        EA=1;
        while(1)
        {        uint8 i;
            juli() ;
               
           Write_cmd(0x80+0x45);
           if(s>400||flag==1)                                        //大于400cm
                   {
                        for(i=0;i<=2;i++)
                {       
                        Write_dat(  '_');                 
                }
               
                }
                else if(s<5)                                         //小于5cm
                {
                        for(i=0;i<=2;i++)               
                        {       
                        Write_dat(  '^');                 
                        }
                }
            else
                {
                    for(i=0;i<=2;i++)
                        {       
                                Write_dat(  table+'0');                 
                        }
                        Write_dat(  'C');
                        Write_dat( 'M');
                        DelayMS(200) ;
          
                }

        }
       
               
}
void timer0(void) interrupt 1
{
        flag=1;

}

相关帖子

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

本版积分规则

8

主题

14

帖子

1

粉丝