闲话:人情势利古犹今,谁识英雄是白身。这句话说的是哪两个人呢?
上篇文章整理了关于超声波测距传感器 HC-SR04 这个模块,本篇文章来完成一个它的基本编程。
本篇文章来完成一个简单的功能,让超声波测距传感器来控制 LED 灯的变化。
当测距小于 10cm 时让 LED1 亮、LED2 灭,当测距大于 10cm 的时候让 LED1 灭、LED2 亮。按这个思路的话,在常态下是 LED2 亮着、LED1 是灭的。
要完成这个功能的话,会用到超声波测距传感器,让它发波、收波,然后还要用到定时器,让它记录发波和收波之间的时间间隔。这样就可以来完成距离的测算了。
首先我们来生成要给 10us 的延时,因为发送通过 TRIG 发送高电平来让超声波测距传感器发波需要 10us 的高电平。使用 STC-ISP 生成的代码如下:
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
接着我们来定义一个启动 TRIG 的函数,代码如下:
void startHC()
{
TRIG = 0;
TRIG = 1;
Delay10us();
TRIG = 0;
}
上面的代码中就完成了给 TRIG 引脚 10us 高电平的功能。
接着我们来定义一个初始化计时器的函数,代码如下:
void Timer0Init()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0;
TH0 = 0;
}
最后我们来完成整个功能的主要逻辑,代码如下:
void main()
{
double time = 0.0;
double dis = 0.0;
while (1)
{
Timer0Init();
startHC();
while (ECHO == 0);
TR0 = 1;
while (ECHO == 1);
TR0 = 0;
time = (TH0 * 256 + TL0) * 1.085;
dis = time * 0.017;
if (dis < 10)
{
LED1 = 0;
LED2 = 1;
}
else
{
LED1 = 1;
LED2 = 0;
}
}
}
上面变量 time 用来记录时间,dis 用来保存计算距离的结果。注意,定时器 TL0 和 TH0 最后记录的是经过了多少个机器周期,而一个机器周期对于我们的芯片而言是 1.085 微秒,因此单位微秒,这里要注意。而距离的单位是厘米,也需要注意。
因此,声音的距离是 340m/s 要转换成 0.034cm/us,也就是 0.034厘米每微秒。
最后来看一下演示,注意 LED 灯的变化:
我是一个程序员,了解 C、PHP、Java、ASM、Python,有 信安、CISP 证书,写小白也能看得懂的文章,感谢关注!!!