一、实现步骤
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();
}
}
注:本笔记借鉴小蜜蜂,仅作个人学习使用。