超声波模块

来源:互联网 发布:网络彩票最新消息新闻 编辑:程序博客网 时间:2024/04/26 17:03

#include   <AT89X51.H>
#include   <intrins.h>

#define  ECH0  P1_0
#define  TRIG  P1_1
#define  fengmingqi  P0_3
unsigned char timer_counter=0;//
float Distance_value=0;//

/********************************************************/
void delayms(unsigned int ms)
{
 unsigned char i=100,j;
 for(;ms;ms--)
 {
  while(--i)
  {
   j=10;
   while(--j);
  }
 }
}

/********************************************************/
   void  StartModule()            //10US以上的高电平
  {
   TRIG=1;                  // 启动一次模块
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   TRIG=0;
  }

   /********************************************************/
    void Conut(void)
 {
    Distance_value=timer_counter*100/1000;//ms?  
 Distance_value=(Distance_value*340/10)/2;     //算出来是CM
 if(Distance_value<=1)
        {
        Distance_value=0;
  fengmingqi=0;
        delayms(10);
  }
 }
 
    


 ////////////////////
void timer0_init(void)
{
 TMOD=0X01;//Mode 1: 16-bit timer/counter
 TH0=0Xff;//100us
 TL0=0Xa4;
 ET0=1;
}
//////////////////
void main()
{
 P0_3=1;
 EA=1;
 timer0_init();


 while(1)
   {
     fengmingqi=1;
     timer_counter=0;
     StartModule();
  while(!ECH0);  //当ECH0为零时等待
  TR0=1;       //开启计数
  while(ECH0);   //当ECH0为1计数并等待
  TR0=0;    //关闭计数
     Conut();   //计算
  timer_counter=0;
  fengmingqi=1;
  //delayms(100);  //100MS
   };
}

timer0() interrupt 1
{
  TR0=0;
 timer_counter++;
 TH0=0Xff;//100us
 TL0=0Xa4;
 TR0=1;
}

 

参考资料:http://www.tazhao.com/search?q=%B3%AC%C9%F9%B2%A8