制作超音波測距儀,是很多單片機愛好者動手實踐的一個項目,接下來,筆者介紹一下一個建議的簡易的超音波測距儀的制作。超音波測距子產品使用的是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();
}
}