基于AT89C52的超声波测距仪

超声波测距仪是利用
HC—SR04超声波
测距公式:时间 ✖ 340 m/s ➗2 得出后显示在
8位数码管上,可显示距离由数码管个数决定
所用芯片:AT89C52
超声波测距仪
正面
背面
侧面
刚开始学51

主函数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
}
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值