超聲波則距是很多電子制作愛好者比較喜歡的制作項目,下面的這款超聲波測距C語言程序,超聲波測距發(fā)送用的是反相器推挽輸出,這樣可以加大發(fā)射功率,超聲波測距接收端用的CX20106A這個紅外芯片接收40KHZ的方波,這是網(wǎng)上比較經(jīng)典的模式,按照這個電路是挺容易成功的測量誤差的問題 1m內(nèi)應(yīng)為mm級、2m內(nèi)1cm左右、5m的時候3cm左右。下面的這款超聲波測距C語言程序程序也挺簡單的,用的定時器和外部中斷,接收到回波的時候觸發(fā)外部中斷,在中斷服務(wù)程序中進行處理,不用加注釋應(yīng)該能看懂吧,這款超聲波測距C語言程序程序肯定還有很多不足,給初學(xué)者用用應(yīng)該也可以吧。
#include
#define unit unsigned int
#define uchar unsigned char
sbit fs=P3^0; //發(fā)送端;
sbit h=P2^0;
sbit l=P2^1;
sbit m=P2^2;//數(shù)碼管位選端;
sbit jieshou=P3^2;
uchar tab[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8e};
uchar u[3]; //顯示數(shù)組;
unit count,b,outcomeH,outcomeL,textover;
void delay(unit a) //延時;
{
unit m;
for(m=0;m
}
void delayms(uchar z)
{
uchar x,y;
for(x=0;x
for(y=110;y>0;y--);
}
void tx() //從P3.0發(fā)出40KHz的脈沖
{
uchar n,p;
for(n=0;n<40;n++)
{
fs=1;
for(p=0;p<3;p++);
fs=0;
for(p=0;p<2;p++);
fs=0;
}
}
void display(void) //顯示;
{
for(b=0;b<3000;b++)
{
l=1;m=1;h=1;
P1=tab[u[0]];
m=0;
delay(10);
m=1;
P1=tab[u[1]];
l=0;
delay(10);
l=1;
P1=tab[u[2]];
h=0;
delay(10);
h=1;
}
}
void rx() interrupt 0 //外部中斷0,接收信號
{
TR0=0;
outcomeH=TH0;
outcomeL=TL0;
count=outcomeH;
count<<=8;
count=count|outcomeL;
count/=59;
if(count>=10)
{
u[0]=count;
u[1]=(count/10);
u[2]=(count/100);
display();
}
TH0=0;
TL0=0;
//textover=1;
}
void over()interrupt 1 //T0溢出為無效測量顯示FFF;
{
u[0]=10;
u[1]=10;
u[2]=10;
display();
TR0=0;
}
void main()
{
fs=0;
delay(8600);
TH0=0;
TL0=0;
TMOD=0x01;
EA=1;
ET0=1;
PT0=1;
IT0=1;
IE=0x83;
while(1)
{
delayms(50);
fs=0;
jieshou=1;
tx();
TR0=1;
}
}