【蓝桥杯单片机】超声波笔记

一、实现步骤

1-产生8个40KHz的超声波信号,通过TX引脚发射出去。

2-启动定时器,计算计数脉冲。

3-等待超声波信号返回,如果接收到反射回来的信号,RX引脚变为低电平。

4-停止定时器,读取脉冲个数,即获得时间T。

5-根据公式,L = V * T /2m,进行距离的计算。

二、代码实现

unsigned int distance = 0;

//超声波延时12us
void Delay12us()		//@12.000MHz
{
	unsigned char i;

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

void Send_Wave() //一个循环12+12近似40KHz的超声波信号
{
	unsigned char i;
	for(i = 0; i < 8; i++)
	{
		TX = 1;
		Delay12us();
		TX = 0;
		Delay12us();
	}
}

void Measure_Distance()
{
	unsigned int time = 0;
	
	TMOD &= 0x0f; //定时器116位自动重装
	TL1 = 0x00;
	TH1 = 0x00;
	Send_Wave();
	TR1 = 1;
	while((RX == 1) && (TF1 == 0)) //等到接收到信号(变低电平)或者计时溢出
	{
		if(distance == 999)
		{
			DisplaySMG_Ability();
		}
	}
	TR1 = 0;
	
	if(TF1 == 0) //有效范围
	{
		time = TH1;
		time = (time << 8) | TL1;
		distance = ((time/10)*17)/100-2; 
//1MHz,time是微秒单位,(time/1000000)是时间,340是速度,/2是路程是来回,*100是换成厘米单位,总共就是time*17/1000,-2是修正
	}
	else
	{
		TF1 = 0;
		distance = 999;
	}
}

三、示例

#include "stc15f2k60s2.h"
#include "intrins.h"

sbit TX = P1^0;
sbit RX = P1^1;
code unsigned char Seg_Table[] = 
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e //F
};
unsigned int distance = 0;

void HC573_C(unsigned char channel, unsigned char value)
{
	P2 = (P2 & 0x1f) | 0x00;
	P0 = value;
	switch(channel)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
			break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
			break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
			break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
			break;
	}
	P2 = (P2 & 0x1f) | 0x00;
}

void DelaySMG(unsigned int t)
{
	while(t--);
}

void DisplaySMG_All(unsigned char value)
{
	HC573_C(6,0xff);
	HC573_C(7,value);
}

void DisplaySMG_bit(unsigned char pos, unsigned char value)
{
	HC573_C(6,0x01 << pos);
	HC573_C(7,value);
	DelaySMG(500);
	HC573_C(6,0x01 << pos);
	HC573_C(7,0xff);
}

void DisplaySMG_Function()
{
	DisplaySMG_bit(7,Seg_Table[distance % 10]);
	DisplaySMG_bit(6,Seg_Table[distance /10 % 10]);
	DisplaySMG_bit(5,Seg_Table[distance /100 % 10]);
}

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

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


void Send_Wave()
{
	unsigned char i;
	for(i = 0;i<8;i++)
	{
		TX = 1;
		Delay13us();
		TX = 0;
		Delay13us();
	}
}

void Measure_distance()
{
	unsigned int time = 0;
	
	TMOD &= 0x0f; //定时器1用作超声波
	TH1 = 0x00;
	TL1 = 0x00;
	Send_Wave();
	TR1 = 1;
	while((RX == 1) && (TF1 == 0))
	{
		if(distance == 999)
		{
			DisplaySMG_Function();
		}
	}
	TR1 = 0;
	if(TF1 == 0)
	{
		time = TH1;
		time = (time << 8) | TL1;
		distance = ((time/10)*17)/ 100 - 1;
	}
	else
	{
		TF1 = 0;
		distance = 999;
	}
}

void Init_sys()
{
	HC573_C(4,0xff);
	HC573_C(5,0x00);
	DisplaySMG_All(0xff);
}

void main()
{
	Init_sys();
	while(1)
	{
		Measure_distance();
		DisplaySMG_Function();
	}
}

注:本笔记借鉴小蜜蜂,仅作个人学习使用。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值