#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;
}
}