蓝桥杯51单片机设计

发布于:2025-07-12 ⋅ 阅读:(16) ⋅ 点赞:(0)

#超声波原理#

①超声波测距原理:声波反射原理

声波分类:

超声波测距原理

超声波频率越高,波长越短,反身性越强,衍射性越弱

②超声波模块原理

发射原理

跳线帽

接收原理

问题:

.超声波发射模块需要一直发射吗?

不需要,否则很难确定接收的回波对应哪一个发射波

所以我们一般发射较短时间

.发射持续时间多久?

一般是5~8个周期,这个就大致取一个即可

若为5个周期,t=12us*10


程序设计:

一般用定时器0

①产生一个24us周期,占空比50%方波,持续时间五个周期

(高/低电平12us)

②发送完毕后开始计时,当检测到P11引脚为低电平时停止计时(已接收到回波)

③开始计算距离

④若在测量范围内无障碍物,则较长的时间未收到回波,则停止计时

将距离设为255cm,一般测距范围是2m

s=0.017cm/us *t

超声波wave.c代码编写

#include "main.h"
sbit TX=P1^0;//发射
sbit RX=P1^1;//接收
uchar distance;

//定时器2不可以。使用定时器0
void Timer2_Init(void)		//12微秒@12.000MHz
{
	T2MOD = 0;				//初始化模式寄存器
	T2CON = 0;				//初始化控制寄存器
	TL2 = 0xF4;				//设置定时初始值
	TH2 = 0xFF;				//设置定时初始值
	RCAP2L = 0xF4;			//设置定时重载值
	RCAP2H = 0xFF;			//设置定时重载值
	TR2 = 0;				//先不 计时 定时器2开始计时
	ET2 = 1;				//使能定时器2中断
	TF2=0;//清除TF标志
}

uchar distance_read()
{
	uchar distance;
	uchar num=10;//5个周期
//不发射超声波,并设定初始时间
	TX=0;
	TL2 = 0xF4;				//设置定时初始值
	TH2 = 0xFF;				//设置定时初始值
	//开始计时
	TR2=1;
	while(num--)
	{
		while(!TF2);//结束发射超声波,TF2=1
		TX= ~TX;
		TF2=0;
	}
	//发射五个超声波完成,停止计时,并且初始化定时初始值,开始计时,接收到的时间
	TR2=0;
	TL2 = 0x00;				//设置定时初始值
	TH2 = 0x00;				//设置定时初始值
  TR2=1;
	while(RX &&!TF2);//等待收到的脉冲(RX为低电平)和长时间未接受到脉冲
	//判断溢出现象
	if(TF2)
	{
		TF2=0;
		distance=255;
	}
	else
	{
		distance=((TH2<<8)|TL2)*0.017;//340/2=170m/s
	}
	return distance;
}

void display()
{
	distance=distance_read();
	
}

void main()
{
	Timer2_Init();//12微秒@12.000MHz
  EA=1;
	
	while(1)
	{
		display();
	}
}

wave.h代码编写

#ifndef __MAIN_H_
#define __MAIN_H_
#include "intrins.h"
#include <STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int
uchar distance_read();
void Timer2_Init(void);		//12微秒@12.000MHz

#endif

根据原理进行代码编写

最好知道原理代码编写,便于熟悉各个引脚的作用


根据定时器12us计时→发射器开始发射→5个周期→发射器停止发射进行代码编写

wave.c(方便但误差较大版)

#include "wave.h"
sbit TX=P1^0;
sbit RX=P1^1;

//5个周期12us
void Delay12us(void)	//@12.000MHz
{
	unsigned char data i;

	_nop_();
	_nop_();
	i = 33;
	while (--i);
}

void wave()
{
	uchar i;
	for(i=0;i<5;i++)
	{
		TX=1;
		Delay12us();
		TX=0;
		Delay12us();
	}
}

uchar read_distance()
{
	uchar distance;
	CMOD=0;
	CH=CL=0;
	wave();
	CR=1;
	while(RX &&!CF);
	CR=0;
	if(CF)
	{
		CF=0;
		distance=255;
	}
	else
	{
		distance=((CH<<8)|CL)*0.017;
	}
	return distance;
}


网站公告

今日签到

点亮在社区的每一天
去签到