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

2020-02-02 09:31发布

本帖最后由 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[bai];
  duan=0;
  P0=0xff;
  wei=1;
  P0=0x80;
  wei=0;
  delay(2);
  
  duan=1;
  P0=atm[shi];
  duan=0;
  P0=0xff;
  wei=1;
  P0=0x40;
  wei=0;
  delay(2);

  duan=1;
  P0=atm[ge];
  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;
}
0条回答

一周热门 更多>