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 <REGX52.H>
#include <intrins.h>
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();			//计算
	}

  }

 

 

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的C51单片机智能小车超声波避障程序的框架,您可以根据您的具体需求进行修改和完善。 程序框架如下: ```c #include <reg51.h> /* 宏定义部分 */ #define uint unsigned int #define uchar unsigned char #define FREQ_OSC 11059200UL // 单片机工作频率 #define TRIG P1_0 // 超声波发射引脚 #define ECHO P1_1 // 超声波接收引脚 #define Motor_A P2_0 // 左电机控制引脚 #define Motor_B P2_1 // 右电机控制引脚 #define Motor_A_EN P2_2 // 左电机使能引脚 #define Motor_B_EN P2_3 // 右电机使能引脚 /* 函数声明部分 */ void delay(uint t); // 延时函数 void Motor_A_Run(uchar dir, uchar speed); // 控制左电机运动 void Motor_B_Run(uchar dir, uchar speed); // 控制右电机运动 uint Ultrasonic_Distance(void); // 超声波测距 /* 主函数 */ void main(void) { /* 变量定义部分 */ uint distance; // 超声波距离 uchar motor_speed = 100; // 电机速度 /* 初始化部分 */ TMOD = 0x01; // 定时器0工作在模式1 TH0 = 0; // 定时器0高8位清零 TL0 = 0; // 定时器0低8位清零 TR0 = 1; // 启动定时器0 while(1) { distance = Ultrasonic_Distance(); // 超声波测距 if(distance < 30) // 距离小于30cm { Motor_A_Run(0, motor_speed); // 左电机停止 Motor_B_Run(0, motor_speed); // 右电机停止 delay(500); // 延时500ms Motor_A_Run(1, motor_speed); // 左电机后退 Motor_B_Run(1, motor_speed); // 右电机后退 delay(1000); // 延时1000ms Motor_A_Run(0, motor_speed); // 左电机停止 Motor_B_Run(1, motor_speed); // 右电机前进 delay(500); // 延时500ms } else // 距离大于等于30cm { Motor_A_Run(1, motor_speed); // 左电机前进 Motor_B_Run(1, motor_speed); // 右电机前进 } } } /* 函数定义部分 */ void delay(uint t) { uint i, j; for(i = 0; i < t; i++) { for(j = 0; j < FREQ_OSC / 12 / 1000; j++); } } void Motor_A_Run(uchar dir, uchar speed) { Motor_A_EN = 1; // 使能 if(dir == 0) // 停止 { Motor_A = 0; } else if(dir == 1) // 前进 { Motor_A = 1; } else if(dir == 2) // 后退 { Motor_A = 0; } // 控制速度 // ... } void Motor_B_Run(uchar dir, uchar speed) { Motor_B_EN = 1; // 使能 if(dir == 0) // 停止 { Motor_B = 0; } else if(dir == 1) // 前进 { Motor_B = 1; } else if(dir == 2) // 后退 { Motor_B = 0; } // 控制速度 // ... } uint Ultrasonic_Distance(void) { uint distance, timeout; TRIG = 0; // 超声波发射引脚置0 delay(5); // 延时5us TRIG = 1; // 超声波发射引脚置1 delay(10); // 延时10us TRIG = 0; // 超声波发射引脚置0 while(ECHO == 0); // 等待超声波接收引脚变为1 TH0 = 0; // 定时器0高8位清零 TL0 = 0; // 定时器0低8位清零 while(ECHO == 1) // 等待超声波接收引脚变为0 { timeout++; if(timeout > 60000) { return 0; // 超时返回0 } } distance = TH0 * 256 + TL0; // 计算超声波距离 distance = distance * 17 / 1000; // 转换为厘米 return distance; } ``` 该程序实现的功能为:利用超声波测距模块检测前方障碍物的距离,当距离小于30cm时,小车会停止前进并后退一段时间,然后向右转弯前进,避开障碍物。当距离大于等于30cm时,小车会直行前进。 需要注意的是,该程序只是一个简单的框架,您需要根据您的具体需求进行修改和完善,例如电机控制、超声波测距精度等方面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值