超声波原理简略测距精确,运用广泛下面贴一个自己写的数码管程序,显现部分需求改,写的是我运用的是慧净开发板,共阴数码管
//超声波模块程序
//Trig = P2^0
//Echo = P3^2
#include
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //0-9的码表
uint TIme = 0;
uint TImeH = 0;
uint TImeL = 0;
uint succeed_flag;
sbit dula=P2^0; //段选信号的锁存器操控
sbit wela=P2^1; //位选信号的锁存器操控
sbit Trig = P2^2;
sbit Echo = P3^2;
//
void delay(uint z)
{
uint x,y;
for(x=z;x》0;x–)
for(y=125;y》0;y–);
}
//
void delay_20us()
{
uchar a ;
for(a=0;a《100;a++);
}
//***************************************************************
//显现数据转化程序
void display(uint temp)
{
uchar qian,ge,shi,bai;
qian = temp/1000;
bai=temp/100%10;
shi=temp%100/10;
ge=temp%10;
wela=1;
//P0=0xf7;
P0 = 0xfe;
wela=0;
dula=1;
P0=table[qian];
dula=0;
delay(5);
wela=1;
//P0=0xf7;
P0 = 0xfd;
wela=0;
dula=1;
P0=table[bai];
dula=0;
delay(5);
dula=1;
P0=0x00; //关位码
dula=0;
wela=1;
//P0=0xef;
P0 = 0xfb;
wela=0;
dula=1;
P0=table[shi];
dula=0;
delay(5);
dula=1;
P0=0x00; //关位码
dula=0;
dula=1;
P0=table[ge];
dula=0;
wela=1;
//P0=0xdf;
P0 = 0xf7;
wela=0;
delay(5);
dula=1;
P0=0x00; //关位码
dula=0;
}
//***************************************************************
void main()
{
uint distance;
uint test =0;
Trig=0; //首要拉低脉冲输入引脚
EA=1; //翻开总中止0
TMOD=0x10; //定时器1,16位工作方式
while(1)
{
EA=0; //关总中止
Trig=1; //超声波输入端
delay_20us(); //延时20us
Trig=0; //发生一个20us的脉冲
while(Echo==0); //等候Echo回波引脚变高电平
succeed_flag=0; //清丈量成功标志
EA=1;
EX0=1; //翻开外部中止0
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //计数溢出标志
TR1=1; //发动定时器1
delay(20); //等候丈量的成果
TR1=0; //封闭定时器1
EX0=0; //封闭外部中止0
if(succeed_flag==1)
{
TIme=timeH*256+timeL;
distance=time*0.172; //厘米
display(distance);
}
if(succeed_flag==0)
{
distance=0; //没有回波则清零
test = !test; //测验灯改变
}
}
}
//***************************************************************
//外部中止0,用做判别回波电平
void exter() interrupt 0 // 外部中止0是0号
{
timeH =TH1; //取出定时器的值
timeL =TL1; //取出定时器的值
succeed_flag=1;//至成功丈量的标志
EX0=0; //封闭外部中止
}
//****************************************************************
//定时器1中止,用做超声波测距计时
void timer1() interrupt 3 //
{
TH1=0;
TL1=0;
}