单片机的超声波测距代码

#include "reg52.h"
#include "absacc.h"  // 单片机的存储器扩展方法
#include "intrins.h"  // 使用该模块的_nop_()方法

sfr AUXR = 0x8e;
sbit TX = P1^0;
sbit RX = P1^1;


unsigned int distance = 0;

unsigned char code Seg_code[18]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
			0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

void MeasureDis();
void Display();


void main()
{
	AUXR = 0;
	XBYTE[0x8000] = 0xff;
	XBYTE[0xa000] = 0x00;
	while(1)
	{
		MeasureDis();
		Display();
	}
	
}

			
void DDelay(unsigned int t)  // Dyanamic Delay -- 动态数码管的延时函数
{
	while(t--);
}

void DisplayBit(unsigned char pos, unsigned char dat)  // 数码管位显示函数
{
	XBYTE[0xe000] = 0xff;
	XBYTE[0xc000] = 0x01 << pos;
	XBYTE[0xe000] = dat;
}

void Display()  // 动态数码管
{
	if(distance == 999)
	{
		DisplayBit(0, Seg_code[15]);
	}
	else
	{
		DisplayBit(5, Seg_code[distance/100]);
		DDelay(500);
		DisplayBit(6, Seg_code[(distance%100)/10]);
		DDelay(500);
		DisplayBit(7, Seg_code[distance%10]);
		DDelay(500);
	}
}

void Delay12us()  // 延时 12 us, 也可以是使用纯 _nop_() 的方法来精确控制延时(推荐);
{
	unsigned char i;
	
	_nop_();
	_nop_();
	i = 33;
	while(--i);
}

void SendWave()  // 超声波测距模块的驱动函数
{
	unsigned char i;
	for(i=0; i<8; i++)
	{
		TX = 1;
		Delay12us();
		TX = 0;
		Delay12us();
	}
}


void MeasureDis()  // 核心函数 - 测距函数
{
	unsigned int time = 0;
	
	TMOD &= 0x0f;  // 清空 TMOD 前 4 位,定时器 1 工作在方式 0 
	TL1 = 0x00;
	TH1 = 0x00;
	
	SendWave();
	TR1 = 1;  // 开启定时器 1
	while((RX == 1) && (TF1 == 0));  // 等待超声波测距完成,RX == 0 时测距完成,TF1 == 1 时测距失败
	TR1 = 0;  // 关闭定时器 1
	
	if(TF1 == 0)  // 测距正常 							
	{
		time = TH1;									
		time = (time << 8) | TL1;  // time 记录测距所用时间
		distance = (unsigned char)(time *0.017);  // 计算距离 s = v * t; v = 172 m/s, t = time (us)
	}
	else                        // 超出最大测距距离		
	{
		TF1 = 0;
		distance = 999;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值