超声波则距是很多电子制作爱好者比较喜欢的制作项目,下面的这款超声波测距C语言程序,超声波测距发送用的是反相器推挽输出,这样可以加大发射功率,超声波测距接收端用的CX20106A这个红外芯片接收40KHZ的方波,这是网上比较经典的模式,按照这个电路是挺容易成功的测量误差的问题 1m内应为mm级、2m内1cm左右、5m的时候3cm左右。下面的这款超声波测距C语言程序程序也挺简单的,用的定时器和外部中断,接收到回波的时候触发外部中断,在中断服务程序中进行处理,不用加注释应该能看懂吧,这款超声波测距C语言程序程序肯定还有很多不足,给初学者用用应该也可以吧。
#include
#define unit unsigned int
#define uchar unsigned char
sbit fs=P3^0; //发送端;
sbit h=P2^0;
sbit l=P2^1;
sbit m=P2^2;//数码管位选端;
sbit jieshou=P3^2;
uchar tab[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8e};
uchar u[3]; //显示数组;
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发出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;
}
}