蓝桥杯单片机超声波(距离稳定增长)

Posted 你是我的盛夏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯单片机超声波(距离稳定增长)相关的知识,希望对你有一定的参考价值。

进行了代码的修改,可以测距2m,并且测试过程中,很少出现距离显示乱跳的现象了!!!

标准模板代码参考:标准模板参考
数码管显示驱动代码参考:数码管
超声波

R5为200kΩ,这决定了超声波发送探头的驱动方波为40KHz(百度查到的)

超声波接线
接线

  1. 驱动超声波发送
    在P1^0发射引脚产生8个40KHz的电信号,探头内的传感器电信号转换为相同频率的声波信号,通过TX引脚发射出去
  2. 计算脉冲
    启动定时器1,开始计数
  3. 等待接收引脚RX变低电平(接收到发送回来的超声波信号)或定时器1中断标志位TF置1(超时,没有收到发送回来的超声波信号)
  4. 判断TF是否为1
    若是,则代表距离过远,无法测量到,显示屏显示9999
    若不是,则停止定时器1,开始计算脉冲次数
  5. 读取脉冲次数,计算距离
    t = TH1;t <<= 8;t |= TL1;
    超声波距离公式
    默认声速:340m/s
    计数频率为1MHz=1000000Hz
    d i s t a n c e = 340 t 2 1 1000000 100 = 0.017 t distance = \\frac{340t}{2}\\frac{1}{1000000}100=0.017t distance=2340t10000001100=0.017t

跳线:连接1和3,2和4
定时器0:用来刷新显示和超声波测距距离更新
定时器1:用来计算超声波发送和接受的间隔时间
P1^0:发射引脚
P1^1:接收引脚

csb.c

#include "csb.h"

#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();\\
                 _nop_();_nop_();_nop_();_nop_(); _nop_();}

//TX引脚发送40KHz方波信号驱动超声波发送探头
void send_wave(void)
{
	uchar i = 8;  //发送8个脉冲频率
	
	do
	{
		TX = 1;
		Delay13us();
		TX = 0;
		Delay13us();		
	}
	while(i--);

csb.h

#ifndef _CSB_H_
#define _CSB_H_

#include "common.h"

void send_wave(void);

#endif

main.c

#include "main.h"

uchar timer_flag=0;
uint distance=0;
uchar s_flag=0;
uint csb_cnt=0;
uint t=0;

void main()
{
	cls_buzz();
	InitTimer0();
	while(1)
	{
		if(timer_flag==1)
		{
			if(s_flag)
			{
				s_flag = 0;
				send_wave();  //驱动超声波发送探头
				TR1 = 1;  //打开定时器1,开始计时
				while((RX == 1) && (TF1 == 0));  //等待收到脉冲
				TR1 = 0;  //关闭定时器1
				if(TF1 == 1)//定时器1发生溢出,代表超声波发送和接受的时间超出定时器最大计数次数
				{
					TF1 = 0;
					distance = 9999;  //距离太远
				}
				else
				{
					t = TH1;
					t <<= 8;
					t |= TL1;
					distance = (unsigned int)(t*0.017);  //距离计算公式,记住就行			
				}
				TH1 = 0;
				TL1 = 0;
			}
			chuli(10,10,10,10,distance/1000,(distance%1000)/100,(distance%100)/10,distance%10);//显示测量的距离
			timer_flag=0;
		}
	}
}

main.h

#ifndef _MAIN_H_
#define _MAIN_H_

#include "common.h"
#include "ds.h"
#include "smg.h"
#include "csb.h"

#endif

ds.c

#include "ds.h"

extern uchar timer_flag;
extern uchar s_flag;
extern uint csb_cnt;

void InitTimer0()
{
	AUXR&=0x7f;//定时器时钟为12T
	TMOD=0x11;//记住就行,设置了定时器0和定时器1
	
	TH1=0;
	TL1=0;
	
	TH0=(65535-2000)/256;//每200ms进入一次服务程序
	TL0=(65535-2000)%256;
	
	ET0=1;
	TR0=1;
	EA=1;
}

void ServiceTimer0() interrupt 1
{
	TH0=(65535-2000)/256;
	TL0=(65535-2000)%256;
	
	display();
	
	if(++csb_cnt == 200)
	{
		s_flag = 1;
		csb_cnt = 0;
	}
	
	timer_flag=1;
}

ds.h

#ifndef _DS_H_
#define _DS_H_

#include "common.h"
#include "smg.h"

void InitTimer0(void);

#endif

smg.c(老朋友了)

#include "smg.h"

uchar wei[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar duan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar zhi[8]={0};


void chuli(uchar d0,d1,d2,d3,d4,d5,d6,d7)
{
	zhi[0]=d0;
	zhi[1]=d1;
	zhi[2]=d2;
	zhi[3]=d3;
	zhi[4]=d4;
	zhi[5]=d5;
	zhi[6]=d6;
	zhi[7]=d7;
}

void display()
{
	static uchar i=0;
	
	Y7;P0=0xff;
	Y6;P0=wei[i];
	Y0;P0=0xff;
	Y7;P0=duan[zhi[i]];
	
	i++;
	if(i==8)i=0;
}

smg.h

#ifndef _SMG_H_
#define _SMG_H_

#include "common.h"

void chuli(uchar d0,d1,d2,d3,d4,d5,d6,d7);
void display(void);

#endif

common.c

#include "common.h"

void cls_buzz()
{
	Y4;P0=0xff;
	Y5;P0=0xaf&(P0|0x50);
}

void Delay13us()		//@11.0592MHz
{
	unsigned char i;

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

common.h

#ifndef _COMMON_H_
#define _COMMON_H_

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

sbit TX = P1^0;  //定义发射引脚
sbit RX = P1^1;  //定义接受引脚

#define uchar unsigned char
#define uint unsigned int
	
#define Y4 P2=0x9f&(P2|0xe0);
#define Y5 P2=0xbf&(P2|0xe0);
#define Y6 P2=0xdf&(P2|0xe0);
#define Y7 P2=0xff&(P2|0xe0);
#define Y0 P2=0x1f&(P2|0xe0);

void cls_buzz(void);
void Delay13us(void);


#endif

超声波就到这里啦!

我是根据官方例程修改的,官方例程是拿MM模式写的,太绝望了!强烈建议官方出一个IO模式的教程

我的这个工程文件稍后会上传,可以下载~~

以上是关于蓝桥杯单片机超声波(距离稳定增长)的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯单片机超声波(距离稳定增长)

蓝桥杯板子 超声波模块使用

蓝桥杯单片机第八届国赛题目-超声波测距机的功能设计与实现

蓝桥杯单片机第八届国赛题目-超声波测距机的功能设计与实现

蓝桥杯单片机国赛模块儿总结

蓝桥杯单片机国赛模块儿总结