uli123 发表于 2012-11-6 18:56:14

求大神帮忙解决个超声波检测距离的问题啊

本帖最后由 uli123 于 2012-11-7 18:13 编辑

程序的目标是:超声波发出信号遇到障碍物后在数码管上显示障碍与接收端的距离,所用的超声波模块是HC-SR04,P0端口用来传输数码管数据,P2.6,P2.7控制段位,我经过分段检测后,发现问题就在主函数部分,其他delay,over,nixie,smg等自定义函数都没有问题,主函数部分实在是没办法了,出现的现象是:没遇到障碍时,数码管数字不断闪烁并变化;如果遇到障碍,就会显示一个完全不符的“距离”(此时不闪烁),并且在障碍持续存在的情况下,改变与障碍物的距离,数码管上数字不变(此时不闪烁),还望大神帮忙
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit trig=P1^0;//超声波信号输入端,TRIG
sbit echo=P1^1;//超声波信号反馈端,ECHO
sbit duan=P2^6;//控制数码管的段
sbit wei=P2^7;//控制位
uint h=1,ge,shi,bai,i,flag=0;
uint dat1,dat2,datchange,m,n;
float w;
uint q;
uchar code atm[]={
                          0xc0,0xf9,0xa4,0xb0,
                                    0x99,0x92,0x82,0xf8,
                                    0x80,0x90
                        };                                //共阳数码管数字显示
void delay(uint a)                //a毫秒(ms)延时函数(大约)
{
uint i,j;
for(i=a;i>0;i--)
   for(j=110;j>0;j--)
          ;
}
void over()//over,把定时器中的数据进行处理得到一个以厘米为单位的距离q
{
dat1=m;
dat2=n;
datchange=dat1<<8;//将dat1变成真正的高8位
datchange=datchange|dat2;//将高低8位相加
w=0.018748*datchange;//求出距离
q=(uint)w;//转化为整数
}
void smg(uint ge,uint shi,uint bai)//数码管显示,over
{
duan=1;
P0=atm;
duan=0;
P0=0xff;
wei=1;
P0=0x80;
wei=0;
delay(2);

duan=1;
P0=atm;
duan=0;
P0=0xff;
wei=1;
P0=0x40;
wei=0;
delay(2);

duan=1;
P0=atm;
duan=0;
P0=0xff;
wei=1;
P0=0x20;
wei=0;
delay(2);   
}
void nixie(uint w)//over,将三位数的q进行分解
{
if(w>99)
{
   ge=w%10;
   shi=w%100/10;
   bai=w/100;
}
if(9<w&&w<100)
   {
    ge=w%10;
    shi=w/10;
    bai=0;
   }
if(w<10)
   {
    ge=w;
    shi=0;
    bai=0;
   }
smg(ge,shi,bai);
}
void main()
{
P1=0x00;
TMOD=0x11;//对定时器初始化
TH0=0;
TL0=0;
EA=1;
ET0=1;
while(1)//在这个while里不断检测是否有障碍物
{
   
   trig=1;//对发射段给一个高电平
   delay(1);//延时10ms,改变他现象会改变???
   trig=0;
   if(echo==1)
   TR0=1,h=1;
   //h=1用来退出当前的检测,进行下一次检测
   while(h)
       {
          if(echo==0)
           {
                  TR0=0;
                  m=TH0; //dat1传递高8位的数
      n=TL0;//dat2传递低8位的数
                  TH0=0;
                  TL0=0;
                  h=0;
          }
       }
          
        over();//处理定时器中的数据
   nixie(q);//分解w,并数码管显示
   
}
}
void T0_time() interrupt 1
{
   TH0=0;
   TL0=0;
}
页: [1]
查看完整版本: 求大神帮忙解决个超声波检测距离的问题啊