超声波测距仪是利用
HC—SR04超声波
测距公式:时间 ✖ 340 m/s ➗2 得出后显示在
8位数码管上,可显示距离由数码管个数决定
所用芯片:AT89C52
主函数main.c
#include "dig.h" //添加数码管显示程序
#include "HC-SR04.h"
#include "timer.h"
//全局变量定义
//段码表,使用于共阴数码管
unsigned int code duan_ma[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0~9
0x77,0x7c,0x39,0x5e,0x79,0x71}; //A~F
unsigned int dis_buf[3] = {4, 0, 0};
unsigned long S = 0; //距离缓冲变量
unsigned long time = 0; //时间缓冲变量
//函数声明
void count(void); //计算距离
void dis_distance(void); //显示距离
/* 主函数 */
void main(void)
{
InitTimer0(); //定时器0初始化
while(1)
{
count(); //测距
if(S>=100 || S<=10) //如果超出10cm-100cm范围,则显示“---”
{
dis_buf[2] = 0x40; //显示"---"
dis_buf[1] = 0x40;
dis_buf[0] = 0x40;
dig_scan(dis_buf);
}
else
dis_distance(); //显示距离
}
}
/* 计算测距 */
void count(void)
{
start_ranging(); //启动一次超声波
while(!Echo); //等待超声波模块输出IO拉高
TR0 = 1; //开启定时器计时
while(Echo); //等待超声波模块输出IO拉低
TR0 = 0; //关闭定时器计时
/* 计算距离 */
time = TH0 * 256 + TL0; //得到时间
TH0 = 0; //定时计数器清零
TL0 = 0;
S = (time * 1.7) / 100; //算出来是CM
}
/* 显示距离 */
void dis_distance(void)
{
dis_buf[2] = duan_ma[S / 100 % 10]; //取出百位数,并在数码管的第三位显示,从右往左数
dis_buf[1] = duan_ma[S / 10 % 10]; //取出十位数,并在数码管的第二位显示,从右往左数
dis_buf[0] = duan_ma[S % 10]; //取出个位数,并在数码管的第一位显示,从右往左数
dig_scan(dis_buf); //送到数码管上显示
}
数码管代码:
#include "dig.h"
/* 数码管延时函数,单位“ms” */
static void dig_delayms(unsigned int ms)
{
unsigned char a,b,c;
while(--ms)
{
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
}
/*
* 数码管扫描
* *dat:以数组的方式传值,使用的时候直接填入数组名即可
*/
void dig_scan(unsigned int *dat)
{
unsigned char i; //循环变量
/* 数码管扫描处理 */
for(i = 0; i < 4; i++)
{
switch(i)
{
case 0:
{
digWei1 = 0; //选通第一位数码管
digDuan = dat[0]; //显示第一位数码管的内容
break;
}
case 1:
{
digWei2 = 0; //选通第一位数码管
digDuan = dat[1]; //显示第二位数码管的内容
break;
}
case 2:
{
digWei3 = 0; //选通第三位数码管
digDuan = dat[2] + 0x80; //显示第三位数码管的内容,顺便也显示小数点
break;
}
case 3:
{
digWei4 = 0; //选通第四位数码管
digDuan = dat[3]; //显示第四位数码管的内容
break;
}
default: break;
}
dig_delayms(5); //数码管扫描延时5ms,根据实际情况可适当调节此延时
digWei1 = 1; //消隐
digWei2 = 1;
digWei3 = 1;
digWei4 = 1;
}
}
超声波的脉冲启动程序:
#include "HC-SR04.h"
/* 启动超声波程序*/
void start_ranging(void)
{
Ttig = 1; //启动一次模块
_nop_(); //延时一段时间,至少10us以上
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Ttig = 0;
}
定时器:
#include "timer.h"
/* 定时器0初始化,定时1ms */
void InitTimer0(void)
{
TMOD = 0x01; //配置定时器0为工作方式
TH0 = 0;
TL0 = 0;
TR0 = 0; //打开定时器0
}