利用51单片机实现超声波测距,也是大二做得,当时没有照相机,无法提供照片,比较遗憾,这个程序,有很多问题,但是还是实现了测距,误差两厘米,范围从20cm~500cm
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
#define v 1.88 //声波在空气中的传播速度
sbit out=P3^0;
bit flag=0;
uchar p;
uchar display[10]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,
0x7a,0x20,0x60}; //数码管显示码
uint s; //距离长度
uchar sm=0; //数码管段位
uint fir,sec,thi,four,m; //显示值
void scan( );
void delay( uint i) ; //延时函数
void delay1(uchar n);
void main (void)
{
delay(500); //延时500微妙
TMOD=0x11; //工作方式为1
TH1=(65536-100)/256;
TL1=(65536-100)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
ET1=1;
//开定时器1中断
IT0=1;
p=20;
while(1)
{
while(p--)
{
scan();
}
if(flag==0)
{
EA=1;
m=0;
out=1;
TR1=1;
delay1(5);
out=0;
delay1(30);
EX0=1;
}
if(flag==1)
{
flag=0;
EX0=0;
TR1=0;
}
scan();
}
}
void scan( ) //显示函数
{
switch(sm++)
{
case 1: P0=display[fir];
P2=0xfe; delay(20); break;
case 2: P0=display[sec];
P2=0xfd; delay(20); break;
case 3: P0=display[thi];
P2=0xfb; delay(20); break;
case 4: P0=display[four];
P2=0xf7; delay(20); break;
default: { } break;
}
if(sm>4) sm=0;
}
void outer1() interrupt 0
{
EA=0;
TR1=0;
EX0=0;
s=m*v;
if(s<10)
{
EA=0;
TR1=0;
EX0=0;
flag=0;
}
else
{
flag=1;
fir=s/1000;
sec=(s-1000*fir)/100;
thi=(s-fir*1000-sec*100)/10;
four=s%10;
scan();
}
}
void time1() interrupt 3
{
TH1=(65536-100)/256;
TL1=(65536-100)%256;
m++;
if(m>=500)
{ m=0;
EA=0;
TR1=0;
EX0=0;
flag=0;}
}
void delay( uint i)
{
for(i;i>0;i--);
}
void time0() interrupt 1
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
}
void delay1(uchar n) //延时50*N微妙
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
TR0=1;
while(TF0)
{
TF0=0;
--n;
}
if(n==0)
TR0=0;
}