最近在造小车 需要用到超声波模块 现将调试时用到的代码分享出来。
所用超声波模块为HC-SR04 单片机开发板是吴鉴鹰的
先理解超声波模块的原理,它有四个接口 Vcc Trig Echo Gnd 。
Vcc接正极 Gnd接地
Trig和Echo随便接两个IO口
然后给Trig口高电平10us以上,超声波模块会自动发出8个40khz的方波,并检测是否有信号返回,有信号返回时就在Echo口输出高电平,持续的时间就是发出信号到接受信号所用的时间。
然后开始写程序。
这里我为了能更好的看到超声波模块是否起作用,加入了单片机上的蜂鸣器,并设置了一个报警距离。
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
sbit Trig=P2^5; //控制端
sbit Echo=P2^4; //接收端
sbit Beep=P3^4; //单片机开发板上的蜂鸣器
unsigned char T0RH=0;
unsigned char T0RL=0;
void Start_Buzz(unsigned int frequ)
{
unsigned int reload;
reload = 65536 - (11059200/12)/(frequ*2);
T0RH = (unsigned char)(reload >>8); //蜂鸣器定时用 产生方波
T0RL = (unsigned char)reload; //蜂鸣器定时用 产生方波
TH1 = 0xFF;//蜂鸣器定时器
TL1 = 0xFE;//蜂鸣器定时器
ET1 = 1;
TR1 = 1;
} //启动蜂鸣器 并设置音高
void Stop_Buzz()
{
Beep= 1;
ET1 = 0;
TR1 = 0;
} //关闭蜂鸣器
void InterruptTimer0() interrupt 3
{
TH1 = T0RH;
TL1 = T0RL;
Beep = ~Beep;
} //蜂鸣器中断程序
void time_init()
{
EA=1;
TMOD=0x11;
TH0 = 0;
TL0 = 0;
} //初始化定时器
void Delay_us(unsigned char t)
{
while(--t);
} //大约延时t*2+5us 超声波模块用
void timer0()interrupt 1
{
TH0 = 0;
TL0 = 0;
} //中断程序 初始化赋值 重新计数 超声波模块用 计算时间
void main()
{
unsigned int time,distance;
Trig=0;
Echo=0;
time_init();
while(1)
{
Trig=1;
Delay_us(5);
Trig=0;
while(Echo==0);
TR0=1;
while(Echo);
TR0=0;
time=TH0*256+TL0;
distance=(int)(time*0.017); //计算路程 单位为cm
TH0=0;
TL0=0;
if(distance<30) //如果距离小于30cm 蜂鸣器响
{
Start_Buzz(4000); //用于控制蜂鸣器的音高
}
else
{
Stop_Buzz();
}
}
}
才学疏浅如有不妥请多多指教。