程序
#include <STC15F2K60S2.H>
#include "intrins.h"
#include <hc138_hs.H>
sbit Measure_TX = P1^0;
sbit Measure_RX = P1^1;
unsigned int distance = 0;
void Delay12us()//@12.000MHz 延时12us
{
unsigned char i;
_nop_();
_nop_();
i = 33;
while (--i);
}
void Send_Wave() //产生8个40KHx超声波信号
{
unsigned char i;
for(i = 0; i < 8; i++)
{
Measure_TX = 1;
Delay12us();
Measure_TX = 0;
Delay12us();
}
}
void Measure_Distance() //超声波测距
{
unsigned int time = 0;
TMOD &= 0x0f; //定时器1模式0,13位,最大8192个计数脉冲
TL1 = 0x00;
TH1 = 0x00;
Send_Wave();//发送超声波信号
TR1 = 1;//启动定时器
while((Measure_RX == 1) && (TF1 == 0));//等待超声波信号返回或者等到测量超出范围
TR1 = 0;//停止定时器
if(TF1 == 0)//正常测量范围
{
time = TH1;
time = (time << 8) | TL1;
distance = ((time / 10) * 17) / 100 + 3;//计算距离
}
else//超出测量范围
{
TF1 = 0;
distance = 999;
}
}
/* 应用 */
void main(void)
{
while(1)
{
//超声波
Measure_Distance();//读取数据
smg_SetOne(1,distance/100);
smg_SetOne(2,distance%100/10);
smg_SetOne(3,distance%10);
}
}
效果