超声波测距程序

利用51单片机实现超声波测距,也是大二做得,当时没有照相机,无法提供照片,比较遗憾,这个程序,有很多问题,但是还是实现了测距,误差两厘米,范围从20cm~500cm

#include <REG52.H>   
#define uchar unsigned char   
#define uint unsigned int   
#define v 1.88      //声波在空气中的传播速度   
  
sbit out=P3^0;
 
bit flag=0;
  uchar p;  
  uchar  display[10]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,
                        0x7a,0x20,0x60};   //数码管显示码   
  
     uint s;       //距离长度   
     uchar sm=0;      //数码管段位   
     uint fir,sec,thi,four,m;   //显示值   
       
  void scan( );  
  void delay( uint i) ;      //延时函数   
  void delay1(uchar n);

  void main (void)  
  {    
      delay(500);       //延时500微妙
      TMOD=0x11;           //工作方式为1
    TH1=(65536-100)/256;
      TL1=(65536-100)%256;    
      EA=1;        //开总中断
      ET0=1;         //开定时器0中断
    ET1=1;
         //开定时器1中断
      IT0=1;
                             
  
  
   p=20;
 
     while(1)  
      {
      while(p--)
     {
              scan();
        }
      

        if(flag==0)
     { 
          
            EA=1;
         m=0;
       out=1;
     TR1=1;
         delay1(5);
       out=0;
      delay1(30);
    
       EX0=1;
    
       
    }
       
    
  
        if(flag==1)
       {
       flag=0;
     EX0=0; 
       TR1=0;
     
         }
    
  
      scan(); 
   }  
   }
     void scan(  )    //显示函数   
     {  
        
  
   switch(sm++)  
          {
            case 1: P0=display[fir];  
                   P2=0xfe; delay(20);   break;  
            case 2: P0=display[sec];  
                   P2=0xfd;  delay(20);  break;  
            case 3: P0=display[thi];  
                   P2=0xfb;  delay(20);  break;  
            case 4: P0=display[four];  
                   P2=0xf7;  delay(20);  break;   
             default: {  }               break;  
           }  
            if(sm>4)  sm=0;    
    }  
    void outer1()  interrupt 0
     {         
              EA=0;
            TR1=0;
      EX0=0;
          
              s=m*v;
           if(s<10)
      {
       EA=0;
            TR1=0;
      EX0=0;
           flag=0;
        
     }
     else
     {
                 flag=1;
                 fir=s/1000;  
                 sec=(s-1000*fir)/100;  
                 thi=(s-fir*1000-sec*100)/10;  
                 four=s%10;

                 scan();
    }       
            
   
       
            
  
   
         
       }         
     
    void time1() interrupt 3
   { 
      TH1=(65536-100)/256;
        TL1=(65536-100)%256;    
        m++;
      if(m>=500)
    { m=0;
      EA=0;
      TR1=0;
    EX0=0;
    flag=0;}
   }
    
   
            
    void delay( uint i)  
       {    
          for(i;i>0;i--);  
       } 
               
   void time0() interrupt 1 
     {
    TH0=(65536-50)/256;
    TL0=(65536-50)%256;
  }
 
   
void delay1(uchar n)  //延时50*N微妙
  {
   
  TH0=(65536-50)/256;
  TL0=(65536-50)%256;
 
  TR0=1;
  while(TF0)
   {
   TF0=0;
   --n;
   }
  if(n==0)
   TR0=0;
 }


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值