这是一款单片机超声波测距原理图,这款单片机超声波测距板电路简单,制作容易,无需进行调试,电路焊焊接好后,下装程序后即可工作。
#include
#define csboutP3_5//超声波发送
#define csbintP3_7 //超声波接收
#define csbc=0.034
#define bgP3_4
unsigned char csbds,opto,digit,buffer[3],xm1,xm2,xm0,key,jpjs,ki;//显示标识
unsigned char convert[10]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9段码
unsigned int s,t,i,sj1,sj2,sj3,mqs,sx1,sjtz,sja,sjb;
bit cl;
void csbcj();
void delay(i);//延时函数
void scanLED();//显示函数
void showOnce();//显示循环函数
void timeToBuffer();//显示转换函数
void offmsd();
void main()//主函数
{
EA=1;//开中断
TMOD=0x11; //设定时器0为计数,设定时器1定时
ET0=1; //定时器0中断允许
ET1=1; //定时器1中断允许
TH0=0x00;
TL0=0x00;
TH1=0x9E;
TL1=0x57;
csbds=0;
csbint=1;
csbout=1;
cl=0;
opto=0xff;
sj1=40;
sj2=100;
sj3=150;
ki=0;
TR1=1; //设定时值1为20ms
while(1)
{
csbcj();//调用超声波测距程序
if(s>sj3)//大于时显示"CCC"
{
buffer[2]=0x39;
buffer[1]=0x39;
buffer[0]=0x39;
}
else if(s//小于时显示"- - -"
{
buffer[2]=0x40;
buffer[1]=0x40;
buffer[0]=0x40;
}
else timeToBuffer();//调用转换段码功能模块
offmsd();//调用判断百位数为零模块,百位为零时不显示
scanLED();//调用显示函数
}
}
void scanLED()//显示功能模块
{
digit=0x04;
for( i=0; i<3; i++)//3位数显示
{
P3=~digit&opto;//依次显示各位数
P1=~buffer[i];//显示数据送P1口
delay(20);//延时处理
P1=0xff;//P1口置高电平(关闭)
if((P3&0x10)==0) //判断3位是否显示完
key=0;
digit>>=1;//循环右移1位
}
}
void timeToBuffer()//转换段码功能模块
{
xm0=s/100;
xm1=(s-100*xm0)/10;
xm2=s-100*xm0-10*xm1;
buffer[2]=convert[xm2];
buffer[1]=convert[xm1];
buffer[0]=convert[xm0];
}
void delay(i)//延时子程序
{
while(--i);
}
void timer1int (void)interrupt 3using 2 //终断处理程序,1秒测量一次
{
TH1=0x9E;
TL1=0x57;
csbds++;
if(csbds>=15)
{
csbds=0;
cl=1;
}
}
void csbcj()//超声波测距子程序
{
if(cl==1)
{
TR1=0;
TH0=0x00;
TL0=0x00;
i=8;
while(i--)
{
csbout=1;
}
TR0=1;
i=70;
while(i--)
{
}
i=0;
while(csbint)//判断接收回路是否收到超声波的回波
{
i++;
if(i>=500)
csbint=0;
}
TR0=0;
TH1=0x9E;
TL1=0x57;
t=TH0;
t=t*256+TL0;
s=t*csbc;//计算测量结果
TR1=1;
cl=0;
}
}
void offmsd()//百位为数0判断模块
{
if (buffer[0] == 0x3f)//如果值为零时百位不显示
buffer[0] = 0x00;
}