栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

51智能小车超声波测距

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

51智能小车超声波测距

HC-SR04超声波测距模块壳提供2cm-400cm的非接触式距离感测功能,测距精度可高达3mm,模块包括超声波发射器,接受器与控制电路。

基本工作原理

1采用IO口TRIG触发测距给至少10us的高电平信呈

2模块自动发送8个40hz的方波,自动检测是否有信号返回

3有信号返回,通过IO口ECHO输出一个高电平,高电平持续时间就是超声波从发射到返回的时间,测试距离=(高电平时间*声速(340/2))/2

 

 这里运用了数码管,和超声波模块,所以分别对它们进行位定义。

在关于数码管的代码中有数码管段码表0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,0x6F,0x40,0x00,

#include 
#include 
sbit RX= P2^0;
sbit TX= P2^1;
sbit DU=P2^6;//数码管选位
sbit WE=P2^7;//数码管选位
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
bit flag=0;
unsigned char const discode[] ={ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,0x6F,0x40,0x00};
unsigned char const positon[4]={ 0xfe,0xfd,0xfb,0xf7};
unsigned char disbuff[4]	   ={ 0,0,0,0,};

 void Display(void)				 //扫描数码管
	{
	DU = 0;	
	 if(posit==0)
	 {P0=(discode[disbuff[posit]]);}
	 else
	 {P0=discode[disbuff[posit]];}
	 DU = 1;
	 DU = 0;
	 WE = 0;
	  P0=positon[posit];
	  WE=1;
	  WE=0;
	  if(++posit>=4)
	  posit=0;
	}
	
 void Conut(void)
	{
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	
	 S=(float)(time*1.085)*0.17;     //算出来是MM
	 if((S>=7000)||flag==1) //超出测量范围显示“-”
	 {	 
	  flag=0;
	  disbuff[0]=10;	   //“-”
	  disbuff[1]=10;	   //“-”
	  disbuff[2]=10;	   //“-”
	  disbuff[3]=10;	   //“-”
	 }
	 else
	 {
	  disbuff[0]=S/1000;
	  disbuff[1]=S%1000/100;
	  disbuff[2]=S%100/10;
	  disbuff[3]=S%10;
	 }
	}

     void zd0() interrupt 1 		 //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;							 //中断溢出标志
  }

   void  zd3()  interrupt 3 		 //T1中断用来扫描数码管和计800MS启动模块
  {
	 TH1=0xf8;
	 TL1=0x30;
	 Display();
	 timer++;
	 if(timer>=400)
	 {
	  timer=0;
	  TX=1;			                //800MS  启动一次模块
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  TX=0;
	 } 
  }


	void  main(  void  )

  {  
    TMOD=0x11;		   //设T0,T1为方式1定时模式,GATE=1;
	TH0=0;
	TL0=0;          
	TH1=0xf8;		   //2MS定时
	TL1=0x30;
	ET0=1;             //允许T0中断
	ET1=1;			   //允许T1中断
	TR1=1;			   //开启定时器1
	EA=1;			   //开启总中断

	while(1)
	{
	 while(!RX);		//当RX(ECHO信号回响)为零时等待
	 TR0=1;			    //开启计数
	 while(RX);			//当RX为1计数并等待
	 TR0=0;				//关闭计数
     Conut();			//计算
	}

  }

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/312163.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号