蓝桥杯单片机开发板上有一个超声波收发的模块,位置就是数码管的最上方。
首先看原理图
接受电路。
发送电路。
连接的跳线帽。
如果想要使用它,首先需要调节旁边跳线帽,将收发电路与我们的单片机IO口连接到一起。
2-4连一起,1-3连一起。
使用方法:
使用发送电路发出一个频率为40KHz的方波,然后通过接受电路的时间来计算距离。
一个周期为40KHz=25us
所以高低电平持续时间为25us/2
使用定时器计算时间,先将定时器设为1T模式,然后计算时间的公式为:
时间=计数值/11059200(s)
计算距离公式:
距离=时间×速度/2
距离=计数值*340/11059200/2
340为声速,除以2是往返距离除以2
距离显示代码如下:
#include<stc15f2k60s2.h>
#include"intrins.h"
sbit TX=P1^0;
sbit RX=P1^1;
#define uchar unsigned char
#define uint unsigned int
void SMG_output(void);
void init(void);
void Delay1ms(void);
void Delay13us(void);
void Send_Sonic(void);
uint get_distance(void);
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar SMG[8]={10,10,10,10,10,10,10,10};//初始显示10,全息数码管
uint distance=0;
void main(void)
{
init();
//设置定时器0为1T模式
AUXR |= 0x80;
while(1)
{
distance=get_distance();
SMG[0]=distance/100;
SMG[1]=distance%100/10;
SMG[2]=distance%10;
SMG_output();
}
}
uint get_distance(void)
{
unsigned long distan;
TL0=TH0=0X00;
Send_Sonic();
TR0=1;
while((RX==1)&&(TF0==0));
TR0=0;
if(TF0==0)
{
distan=TH0*256+TL0;
distan=((distan*170)/110592);
//340*100/11059200/2
}
else
{
TF0=0;
distan=999;
}
return distan;
}
//40KHz 1/40 000=25us/2=13us
void Send_Sonic(void)
{
uchar i;
for(i=0;i<8;i++)
{
TX=0;
Delay13us();
TX=1;
Delay13us();
}
}
void Delay13us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
i = 33;
while (--i);
}
void SMG_output(void)
{
uchar i;
for(i=0;i<8;i++)
{
P2=(P2&0X1F)|0Xc0;
P0=(1<<i);
P2=(P2&0X1F)|0Xe0;
P0=tab[SMG[i]];
Delay1ms();
}
P2=(P2&0X1F)|0Xc0;
P0=0Xff;
P2=(P2&0X1F)|0Xe0;
P0=0Xff;
}
void init(void)
{
P2=(P2&0X1F)|0XA0;
P0=0X00;
P2=(P2&0X1F)|0X80;
P0=0Xff;
P2=(P2&0X1F)|0Xc0;
P0=0Xff;
P2=(P2&0X1F)|0Xe0;
P0=0Xff;
}
void Delay1ms(void) //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
显示效果如下: