制作超声波测距仪,是很多单片机爱好者动手实践的一个项目,接下来,笔者介绍一下一个建议的简易的超声波测距仪的制作。超声波测距模块使用的是HC-SR04,接线方式如下:Trig ——- P2^1; Echo ——- P2^0;
VCC ——– +5v GND ——– GND。
源代码如下:
#include<reg51.h>
#include<intrins.h>
#include"lcd.h"
sbit Trig = P2^;
sbit Echo = P2^;
unsigned char PuZh[]=" Pechin Science ";
unsigned char code ASCII[] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
static unsigned char DisNum = ; //显示用指针
unsigned int time=;
unsigned long S=;
bit flag =;
unsigned char disbuff[] ={ ,,,,};
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Conut(void)
{
time=TH0*+TL0;
TH0=;
TL0=;
S=(time*)/; //算出来是CM
if((S>=)||flag==) //超出测量范围显示“-”
{
flag=;
DisplayOneChar(, , ASCII[]);
DisplayOneChar(, , ASCII[]); //显示点
DisplayOneChar(, , ASCII[]);
DisplayOneChar(, , ASCII[]);
DisplayOneChar(, , ASCII[]); //显示M
}
else
{
disbuff[]=S%/;
disbuff[]=S%%/;
disbuff[]=S%% %;
DisplayOneChar(, , ASCII[disbuff[]]);
DisplayOneChar(, , ASCII[]); //显示点
DisplayOneChar(, , ASCII[disbuff[]]);
DisplayOneChar(, , ASCII[disbuff[]]);
DisplayOneChar(, , ASCII[]); //显示M
}
}
void zd0() interrupt //T0中断用来计数器溢出,超过测距范围
{
flag=; //中断溢出标志
}
void StartModule() //启动模块
{
Trig=; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=;
}
void delayms(unsigned int ms)
{
unsigned char i=,j;
for(;ms;ms--)
{
while(--i)
{
j=;
while(--j);
}
}
}
void main(void)
{
TMOD=; //设T0为方式1,GATE=1;
TH0=;
TL0=;
ET0=; //允许T0中断
EA=; //开启总中断
InitLcd1602();
LcdShowStr(,,PuZh);
while()
{
StartModule();
while(!Echo); //当RX为零时等待
TR0=; //开启计数
while(Echo); //当RX为1计数并等待
TR0=; //关闭计数
Conut(); //计算
delayms();
}
}