//超声波测距,可以测距离在2-100cm之间
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit trig = P3^3;
sbit echo=P3^2;
sbit test=P1^1;
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep = P2^3;
sbit key2=P3^4;
uint timeh,timel,distance;
uint ge,shi,bai,xiaoshu,flag,time;
//共阴极数码管不带小数点的代码表
uchar code list[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
};
//共阴极数码管带小数点的代码表
uchar code listtwo[]={
0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef};
void delay(uint z) //延时函数
{
uint x;uchar y;
for(x=z;x>0;x–);
for(y=110;y>0;y–);
}
void delay20us()
{
uchar a;
for(a=0;a<100;a++);
}
void beer() //报警函数
{
uchar j=0;
while(1)
{
if(distance >= 500)
{
beep = ~beep;
delay(700);
}
j++;
if(j==50)
{
break;
}
}
}
void initime0() //定时器初始化
{
TMOD=0x01;
TH0=0;
TL0=0;
EA=0;
ET0=0;
EX0=0;
}
void estern()interrupt 0 //外部中断函数
{
timeh=TH0;
timel=TL0;
beer();
flag=1; //进入中断,标志位置1
EX0=0; //同时关闭外部中断和定时器
TR0=0;
}
/*void buttons()
{
if(key2 == 0)
{
delay(10); //键盘消抖
if(key2==0)
{
TR0=0;
return;
}
}
}/
void display(distance)
{
bai=distance/1000;
shi=distance%1000/100;
ge=distance%100;
xiaoshu=distance%10;
dula=1;
P0=list[xiaoshu];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(2);
dula=1;
P0=listtwo[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(2);
dula=1;
P0=list[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=list[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
}
void diaoyong() //调用子函数
{
uint i;
EA=0;
echo=1;
trig=1;
delay20us();
trig=0;
while(echo == 0); //如果进入中断收到超声波后向下执行
flag=0; //清除标志位
EA=1; //打开总中断
EX0=1; //打开外部中断
TR0=1; //开定时器
TH0=0; //定时器清零
TL0=0;
for(i=0;i<100;i++) //等待测量结束
{
display(distance); //利用一百次显示循环来掩延时
}
delay(50); //延时函数,数码管闪烁
TR0=0; //关定时器
EX0=0; //关外部中断
if(flag==1)
{
time=timeh256+timel; //计算测定距离
distance=time*0.1720;
display(distance);
}
if(flag==0) //如果没有进入中断定时器为0
{
distance=0;
test = !test;
}
}
void main()
{
TH0=0
TL0=0
ET0=1;
initime0();
test=0;
trig=0;
EA=1;
while(1)
{
diaoyong();
display(distance);
if(key2 == 0)
{
delay(10); //键盘消抖
if(key2==0)
{
TR0=0;
while(!key2);
}
}
}
}