#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit tx=P2^0;//发射启动引脚
sbit rx=P3^2;//接收引脚
sbit dula=P2^6;
sbit wela=P2^7;
sbit led=P1^0;
void delay_20us();
uchar timeh,timel,successflag,tab[3],flag;
float distance;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
float date;
void display(uchar);
uint process(void);
void delay(uint t)
{uint i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
TMOD=0x01;
ET0=1;
// IT0=1;
TH0=0;
TL0=0;
//ES=1;
}
main()
{ uint t;
// uchar i;
init();
tx=0;
EX0=0;
while(1)
{EA=1;
tx=1;
delay_20us();//20US的启动信号
tx=0;
while(!rx);
successflag=0; //当RX为零时等待
EX0=1;
TH0=0;
TL0=0;
TR0=1; //开启计数
delay(30); //当RX为1计数并等待
TR0=0;
EX0=0;
// TR0=1;
if(successflag==1)
{t=process();
display(t);
led=0;
}
else
{t=0;
}
}
}
void display(uchar temp)//数码管显示
{ uchar ge,shi,bai;
bai=temp/100;
shi=(temp%100)/10;
ge=temp%10;
dula=1;
P0=table[bai];
dula=0;
wela=1;
P0=0xfe;
wela=0;
delay(5);
dula=1;
P0=table[shi];
dula=0;
wela=1;
P0=0xfd;
wela=0;
delay(5);
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=0xfb;
wela=0;
delay(5);
}
uint process(void)//超声波数据处理
{
date=timeh*256+timel;
distance=date*0.172;
return distance;
}
void delay_20us()//延时20US
{ uchar t ;
for(t=0;t<100;t++);
}
void t0() interrupt 1
{ TH0=0;
TL0=0;
}
void ser0() interrupt 0
{ EX0=0;
TR0=0;
timeh=TH0;//取高电平时间
timel=TL0;
successflag=1;
}
我的程序怎么只能测255毫米范围内的超过这个255就变0了,而且误差也有5MM。那位大侠知道啊小弟新手
此帖出自
小平头技术问答
一周热门 更多>