当前位置:文档之家› 超声波测距程序(详细C语言数码管显示)

超声波测距程序(详细C语言数码管显示)

超声波测距程序(详细C语言数码管显示)
#include<reg52.h> //头文件
#include<intrins.h>// _nop_() 函数延时1US用
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
sbit csb=P1^0;//超声波发送端口为P1.0
sbit bai=P2^2;//数码管百位
sbit shi=P2^1;//数码管十位
sbit ge=P2^0;//数码管个位
uchar flag;//超声波接收标志
float juli1;//距离变量,用来数码管显示用
int juli;
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0到9的代码
int xianshi[3];
void delayshow(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void ledshow(void)
{
xianshi[0]=juli/100;
xianshi[1]=((juli%100)/10);
xianshi[2]=juli%10;
bai=0;
P0=table[xianshi[0]];
delayshow(2);
bai=1;
delayshow(2);
shi=0;
P0=table[xianshi[1]];
delayshow(2);
shi=1;
delayshow(2);
ge=0;
P0=table[xianshi[2]];
delayshow(2);
ge=1;
delayshow(2);
}
/***************n个ms函数*******************/ void delay_nms(uint ms) //delay ms 函数
{
uchar i;
while(ms--)
{
for(i=0;i<123;i++);
}
}
/************************************************ 延时100us函数
***********************************************/ void delay100us()
{
uchar j;
for(j=50;j>0;j--);
}
/********************************************** 发送超声波函数,实测为38KHz信号,4个这样的方波***********************************************/ void tran()
{
uchar i;
for(i=8;i>0;i--)
{
csb=!csb;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
}
csb=1;//关超声波发送
ET0=1;
EA=1;
delay100us();//延时100us左右后再开中断,避免直接回来的回波
//理论上可以测量的最小距离为:0.0001×344=0.0344M=3.44CM
EX0=1;//打开外部中断1
TR0=1;//开定时0
}
void main()
{
uchar i;
delay_nms(10);//等待单片机复位
TMOD=0x11;//定时器0方式1用于计时
TL0=0;
TH0=0;
IT0=0;//中断0下降沿有效
EA=1;
while(1)
{
tran();//发送超声波
while(flag==0);//等待接收
if(flag==1)
{
juli1*=17.2;//计算距离,因为时间是来回的时间,声速为344M/S 除以2就为172
juli1=juli1/1000;
juli=(int)(juli1);
flag=0;
for(i=0;i<50;i++)
ledshow();
juli=0;
}
else
{
juli=0;//超出距离显示000
for(i=0;i<10;i++)
ledshow();
flag=0;
}
}
}
/*超声接收程序(外中断0)*/
void cs_r() interrupt 0
{
EX0 = 0;//关闭外部中断0,也就是超声波接收中断
TR0 = 0;//关闭定时器0
EA=0;
juli1=TH0*256+TL0-100;//减去开始延时的100us
TL0=0;//清定时0
TH0=0;
flag= 1;//成功接收标志置1
}
/*超时清除程序(定时器中断T0)*/
void overtime() interrupt 1
{
EA=0;
TL0=0;//清定时0
TH0=0;
EX0 = 0;//关闭定时器0的中断
TR0 = 0;//关闭定时器0
ET0 = 0;//关闭定时器0的中断
flag= 2;//接收标志置2
}。

相关主题