蓝桥杯单片机超声波测距

原理:根据S=V*t;

要想测出距离,我们得知道V=340m/s,也就是声速,转换单位就是34000cm/s,时间通过定时器来获取,超声波发出一个声波后,遇到障碍物返回所需要的时间我们除以2就是所要的时间。

我们采用定时器0,1T的工作模式:

void Timer0Init(void) //100微秒@11.0592MHz

{

AUXR |= 0x80; //定时器时钟1T模式

TMOD &= 0xF0; //设置定时器模式

TL0 = 0xAE; //设置定时初值

TH0 = 0xFB; //设置定时初值

TF0 = 0; //清除TF0标志

TR0 = 1; //定时器0开始计时

}

 

这个就是超声波的原理图,左边是发送,右边是接收。

我们需要一个发送超声波的函数:

void send_Wave()

{

TX=1;

somenop();

TX=0;

somenop();

TX=1;

somenop();

TX=0;

somenop();

}

在发送之前,定时器高低两位要置0,发送方波后,定时器开始计时,如果接收不到或者定时器一直加加满了就退出来。

计满了也没有收到回波那就规定S=999.然后把标志位清零。

如果接受到了就关闭定时器,将时间存入自己定义的变量t之中。

t=TH0;

t=t<<8;

t=t|TL0;

这样,我们就计算出来t的值,那么只需要求s的距离就可以了。

我们知道 ,单片机频率为11.0592,频率的倒数就是周期,我们✖次数,再乘以34000后➗ 2.

那么最后得出

S=t*0.00154。

下面是完整代码:

#include "reg52.h"
#include "intrins.h"
#define somenop() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
unsigned char code SMDD_duanma[18]={0xc0,0xf9,0xa4,0xb0,
                               0x99,0x92,0x82,0xf8,
	                             0x80,0x90,0x88,0x80,
                               0xc6,0xc0,0x86,0x8e,
                               0xbf,0x7f};
sbit TX=P1^0;
sbit RX=P1^1;
sfr AUXR=0x8e;·
unsigned int s=0;
unsigned int t=0;
void Timer0Init(void)	
{
	AUXR |= 0x80;
	TMOD &= 0xF0;
}
void delay(unsigned char t)
{
	while(t--);
	while(t--);
}
void displaySMG(unsigned char i,unsigned char j)
{
	P0=0x01<<i;
	P2=P2&0x1f|0xc0;
	P2=P2&0x1f;
	P0=SMDD_duanma[j];
	P2=P2&0x1f|0xe0;
	P2=P2&0x1f;	
}
void send_Wave()
{
	TX=1;
	somenop();
	TX=0;
	somenop();
	
	TX=1;
	somenop();
	TX=0;
	somenop();
}	 
void init()
{
	P0=0xff;
	P2=P2&0x1f|0x80;
	P2=P2&0x1f;
	P0=0;
	P2=P2&0x1f|0xa0;
	P2=P2&0x1f;
}
void main()
{
	init();
	Timer0Init();
	while(1)
	{
	TL0 = 0x0;	
	TH0 = 0x0;	
	TF0 = 0;
	send_Wave();
	TR0=1;
	while((RX==1)&&(TF0==0));
	TR0=0;
	if(TF0==1)
	{
		s=999;
		TF0=0;
	}
	else
	{
		t = TH0;
		t=t<<8;
		t|=TL0;
		s=t*0.001543;
	}
	displaySMG(0,s/100);
	delay(100);
	displaySMG(1,s%100/10);
	delay(100);
	displaySMG(2,s%10);
	delay(100);
	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值