蓝桥杯 — 超声波测距模块的使用

目录

 

1、测距原理

2、超声波原理图

3、用到的头文件说明

4、实现超声波传感器功能


1、测距原理

超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。

超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2 。这就是所谓的时间差测距法。

这都是忽略了其它因素,如:温度等,在代码中声速给定为340m/s。精确度达到cm级。

2、超声波原理图

发射部分:JS2为发射模块,由NA1控制。

 接收部分:JS1为接收模块,由NB1控制。

Rb3集电器:可以用于调节

其它部分: 

在蓝桥杯单片机的竞赛综合平台CT107D中,超声波模块的TX引脚接到单片机的P1.0端口,RX引脚接到单片机的P1.1端口。在进行蓝桥杯超声波模块测试前,要把跳线帽J2中的1—3,2—4相连接(sonic),这样上述模块就互相连接在一起了,然后在P10接口发射超声波,P11接口接收超声波。如果接收到反射回来的信号,P11(RX)引脚变为低电平。

3、用到的头文件说明

#include "intrins.h"

intrins.h,函数,应用于程序设计,一般出现在C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用。

内部函数:

_crol_ 字符循环左移

_cror_ 字符循环右移

_irol_ 整数循环左移

_iror_ 整数循环右移

_lrol_ 长整数循环左移

_lror_ 长整数循环右移

_nop_ 空操作 (相当于8051 NOP 指令)

_testbit_ 测试并清零位 (相当于8051 JBC 指令)

4、实现超声波传感器功能

下面是实现超声波功能的代码,最大测量距离为99cm。

#include<STC15F2K60S2.H>
#include "intrins.h"

#define uchar unsigned char 
#define uint unsigned int	

#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();}	//空指令操作
sbit TX = P1^0;  //	发射引脚
sbit RX = P1^1;  //接受引脚

uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};//0-9,-,全灭
uchar yi,er,san,si,wu,liu,qi,ba;

unsigned int intr = 0;
bit s_flag;
unsigned int t = 0;

void send_wave(void);
void Timer0Init(void);
void Timer1Init(void);

void delayms(int ms);
void allinit();
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);

void main()
{
	unsigned int distance;
	
	Timer0Init();
    Timer1Init();

	EA = 1;
	ET0 = 1;  //打开定时器0中断
	
	allinit();
	yi=11;er=11;san=11;si=11;wu=11;liu=0;qi=0;ba=0;
	
	while(1)
	{
		if(s_flag) // 200毫秒更新一次数据 
		{
			s_flag = 0;
			send_wave();  //发送方波信号
			TR1 = 1;  //启动计时
			while((RX == 1) && (TF1 == 0));  //等待接受到脉冲
			TR1 = 0;  //关闭计时		
			
			if(TF1 == 1)//发生溢出
			{
				TF1 = 0;
				distance = 9999;  //无返回
			}
			else
			{		
				t = TH1;// 计算时间 
				t <<= 8;
				t |= TL1;
				distance = (unsigned int)(t*0.017);  //计算距离
				distance = distance/12;
			}
			TH1 = 0;
			TL1 = 0;
		}
		  						 
		liu = distance/100;
		qi = distance%100/10;
		ba = distance%10; 
		
		display1(yi,er);
		display2(san,si);
		display3(wu,liu);
		display4(qi,ba);
	}
}

void Timer0Init(void)		//2ms @11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设计定时器模式  	TMOD=0X01;
	TL0 =(65536-2000)%256;		//设置定时器初值
	TH0 =(65536-2000)/256;		//设置定时器初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

void Timer1Init(void)		//2ms @11.0592MHz
{
	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设计定时器模式  	TMOD=0X02;
}

//定时器0中断服务函数
void isr_timer_0(void)  interrupt 1  //默认定时器中断1
{
    TL0 =(65536-2000)%256;		//设置定时器初值
	TH0 =(65536-2000)/256;		//设置定时器初值

	if(++intr == 100)
	{
		s_flag = 1;
		intr = 0;
  }
}

//TX引脚发送40kHZ方波信号驱动超声波发送探头
void send_wave(void)
{
	unsigned char i = 8;  //发送8个脉冲
	
	do
	{
		TX = 1;
		somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;		
		TX = 0;
		somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;		
	}
	while(i--);
}


void delayms(int ms)
{
	int i,j;
	for(i=ms;i>0;i--)
		for(j=400;j>0;j--);
}

void allinit()
{
	P2=0XA0;
	P0=0X00;//关闭蜂鸣器、继电器
	
	P2=0X80;
	P0=0XFF;//关闭LED灯
	
	P2=0XC0;
	P0=0XFF;//选择所有的数码管
	P2=0XFF;
	P0=0XFF;//关闭所有数码管
}

void display1(uchar yi,uchar er)
{
		P2=0XC0;//打开位选573   U8
		P0=0X01;//选择第一个数码管
		P2=0XFF;//打开断选573   U7
		P0=tab[yi];
		delayms(1);
		
		P2=0XC0;//打开位选573   U8
		P0=0X02;//选择第二个数码管
		P2=0XFF;//打开断选573   U7
		P0=tab[er];
		delayms(1);
}	

void display2(uchar san,uchar si)
{
		P2=0XC0;
		P0=0X04;//选择第三个数码管
		P2=0XFF;
		P0=tab[san];
		delayms(1);
		
		P2=0XC0;
		P0=0X08;//选择第四个数码管
		P2=0XFF;
		P0=tab[si];
		delayms(1);
}

void display3(uchar wu,uchar liu)
{
		P2=0XC0;
		P0=0X10;//选择第五个数码管
		P2=0XFF;
		P0=tab[wu];
		delayms(1);
		
		P2=0XC0;
		P0=0X20;//选择第六个数码管
		P2=0XFF;
		P0=tab[liu];
		delayms(1);
}

void display4(uchar qi,uchar ba)
{
		P2=0XC0;
		P0=0X40;//选择第七个数码管
		P2=0XFF;
		P0=tab[qi];
		delayms(1);
		
		P2=0XC0;
		P0=0X80;//选择第8个数码管
		P2=0XFF;
		P0=tab[ba];
		delayms(1);
}

上述代码可以加以修改如下:

#include<stc15f2k60s2.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}

sbit TX=P1^0;
sbit RX=P1^1;

uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar f1,f2,f3,f4,f5,f6,f7,f8;
unsigned int count;
bit num;
unsigned int t=0;

void Time0_Init();
void Timer1_Init();
void delay();
void all_Init();
void send_wave();
void display12(uchar f1,uchar f2);
void display34(uchar f3,uchar f4);
void display56(uchar f5,uchar f6);
void display78(uchar f7,uchar f8);

void main(){
unsigned int distance;
Time0_Init();
Timer1_Init();
EA=1;
ET0=1;
all_Init();
f1=11,f2=11,f3=11,f4=11,f5=11,f6=0,f7=0,f8=0;
while(1){
if(num==1)
  {
    num=0;
	send_wave();
	TR1=1;
	while ((RX==1)&&(TF1==0));
	TR1=0;
	if(TF1==1)
	{
	  TF1=0;
	  distance=9999;
	}
	else
	{
	t=TH1;
	t <<= 8;
	t|=TL1;
	distance=(unsigned int)(t*0.017);
	distance=distance/12;
	}
	TH1=0;
	TL1=0;
	}
f6=distance/100;
f7=distance%100/10;
f8=distance%100%10;

display12(f1,f2);
display34(f3,f4);
display56(f5,f6);
display78(f7,f8);
}
}

void Time0_Init()
{
AUXR|=0X80;
TMOD&=0XF0;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
TF0=0;
TR0=1;
}

void service_Time0() interrupt 1
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
count++;
if(count==100)
{	 
     num=1;
	 count=0;
}
}
 
void Timer1_Init(){
AUXR|=0X40;
TMOD&=0X0F;
}

void delay(){
int j,k;
for(j=0;j<1;j++)
for(k=0;k<400;k++);
}

void all_Init(){
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
P2=0XC0;P0=0XFF;P2=0XFF;P0=0XFF;
}

void send_wave(){
uchar i=8;
do
{
  TX=1;
  somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
  TX=0;
  somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
}
while(i--);
}

void display12(uchar f1,uchar f2)
{
P2=0XC0;P0=0X01;P2=0XFF;P0=tab[f1];
delay();
P2=0XC0;P0=0X02;P2=0XFF;P0=tab[f2];
delay();
}

void display34(uchar f3,uchar f4)
{
P2=0XC0;P0=0X04;P2=0XFF;P0=tab[f3];
delay();
P2=0XC0;P0=0X08;P2=0XFF;P0=tab[f4];
delay();
}

void display56(uchar f5,uchar f6)
{
P2=0XC0;P0=0X10;P2=0XFF;P0=tab[f5];
delay();
P2=0XC0;P0=0X20;P2=0XFF;P0=tab[f6];
delay();
}


void display78(uchar f7,uchar f8)
{
P2=0XC0;P0=0X40;P2=0XFF;P0=tab[f7];
delay();
P2=0XC0;P0=0X80;P2=0XFF;P0=tab[f8];
delay();
}


        
 

 超声波实现的代码,要做到知道每一步的操作过程,具体代码有何用处,多加练习,最后应该不会有太大问题。

发布了64 篇原创文章 · 获赞 70 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/fanjufei123456/article/details/104569821
今日推荐