您的位置:首页 > 其它

超声波测距程序

2011-11-18 21:21 246 查看
利用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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: