#include"reg52.h"
#include<intrins.h>
sbit D5=P3^7;
sbit D6=P3^6;
sbit Trig=P2^2;
sbit Echo=P2^3;
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void startHC()//开始条件,给Trig一个10us的高电平,让传感器启动
{
Trig=0;
Trig=1;
Delay10us();
Trig=0;
}
void Timer0Init() //500微秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式为16位
TMOD |= 0x01;
TL0 = 0x00; //设置低八位定时初值
TH0 = 0x00; //设置高八位定时初值
}
void main()
{
double time;
double dis;
Timer0Init();
while(1)
{
Delay300ms();//让硬件稳定
Timer0Init();//每次都初始化低八位与高八位的值
startHC();
while(Echo==0);//Echo由低电平变为高电平时,结束循环,硬件开发送波
TR0 = 1;//开启计数器计数模式
while(Echo==1);//Echo由高电平变为低电平时,结束循环,表明硬件接受到返回波
TR0 = 0;//关闭计数器计数模式
time=(TH0 * 256 + TL0)*1.085;//计算次数,乘以一次的时间1.085us,得到来回的总时间
dis=0.034 * time/2; //速度是340m/s=0.034cm/us
if(dis<10.00)//距离小于10,D5灯亮,D6灯灭
{
D5=0;
D6=1;
}
else距离大于10,D6灯亮,D5灯灭
{
D5=1;
D6=0;
}
}
}
超声波时序图
超声波简介
型号:HC-SR04
如果大家对计时模式的开启有疑问,可以自己看stc89c51系列的手册,也可以看我的“51单片机如何定时的文章”。
最后说一个我自己遇到的疑问,我发现这里的计数器技术T0最大计数是65535,所以我就在想,有没有一种可能我的距离太远导致计数器记的数字不够就被刷新了,因此我计算了一下T0计数器下最远的距离。
系统计数一次耗时1.085us,最大计数65535次,耗时大于71ms,声速是340m/s,那么在计数被填满之前,距离=71ms*340m/s,大约是24m,也就是说在24m的范围内,你可以放心使用。