基于51单片机的超声波测距历程

/***************************************************************/
#include // 单片机头文件
#include
#include <4LED_YANG.h>//包含共阳数码管驱动程序
#define uchar unsigned char
#define uint unsigned int
uint timeH,timeL;//定义2个存储计时器值的变量
uint distance;//定义测量值的变量
uint time;//定义Echo脚返回的高电平时间变量
/***************************************************************/
sbit Echo = P5 ^ 5; //超声波测距模块Echo连接的IO
sbit Trig = P5 ^ 4; //超声波测距模块Trig连接的IO
/*******************************************/
void delay1ms (unsigned int a)
{ // 1ms延时程序
unsigned int i;
while( --a != 0)
{
for(i = 0; i < 630; i++); //STC单片机在晶振为12MHz时i值上限为630
} //AT89C51单片机在外部晶振为12MHz时i值上限为125
}
/*******************************************/
void delay_20us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 57;
while (--i);
}
/*********************************************************************************************
函数名:定时器初始化函数
调 用:INT_init();
/**********************************************************************************************/
void INT_init (void)
{
TMOD=0x01; //定时器0,16位工作方式计数模式
TH0=0; //定时器0清零
TL0=0; //定时器0清零
EA = 1; //总中断开
Trig=0; //拉低为下次触发做准备
}
//***************************************************************
void dist (void)
{ //测量距离程序
Trig=1; //
delay_20us(); //延时20us
Trig=0; //Trig输出20us高电平触发测距
while(Echo==0); //等待Echo回波引脚变高电平
TR0=1; //程序运行到此处时说明Echo脚变成了高电平,此时启动T0开始计时
while(Echo==1); //等待Echo回波引脚高电平结束
TR0=0; //程序运行到此处时说明Echo脚变成了低电平,此时T0停止计时
time=TH0*256+TL0;
distance=time*0.170; //测量距离
distance=distance-2; //测量起点不同减去的数值不同
TH0 = 0; //重置计时器
TL0 = 0;

}
void main()//主函数
{

init(); //单片机IO口工作方式初始化
INT_init; //T0初始化
while(1)

{
dist(); //测量距离
disp()

; //数码管显示距离
delay1ms(20); //两次测量间需要有10ms间隔
}
}

相关文档
最新文档