#include<AT89X51.H>
#include<intrins.h>
/***************************
数码管为共阴数码管
***************************/
sbits0=P2^7;//个位选通
sbits1=P2^6;//十位选通
sbits2=P2^5;//百位选通
sbits3=P2^4;//千位选通
sbitdp=P0^7;//小数点
sbitin=P3^2;//外部中断,接CX20106的脚
sbitcsb=P3^3;//40KHz方波输出脚
#definesegP0//数码管的数据口为P1口
#defineucharunsignedchar
#defineuintunsignedint
#definenop_nop_()
/****************************/
voidinit(void);//初始化
voiddelay_nms(uintn);//延时nms
voiddelay100us();//延时us
voiddisplay(uintdat);//4位数码管显示函数,只用了位
voidtran(void);//超声波测量函数
/***************************/
uintdis,H=100,L=20;
ucharflag=0,high_time,low_time,m=0;
ucharleddata[]={
0x3F,//"0"
0x06,//"1"
0x5B,//"2"
0x4F,//"3"
0x66,//"4"
0x6D,//"5"
0x7D,//"6"
0x07,//"7"
0x7F,//"8"
0x6F,//"9"
0x77,//"A"
0x7C,//"B"
0x39,//"C"
0x5E,//"D"
0x79,//"E"
0x71,//"F"
0x76,//"H"
0x38,//"L"
0x37,//"n"
0x3E,//"u"
0x73,//"P"
0x5C,//"o"
0x40,//"-"
0x00,//熄灭
0x00//自定义
};
voiddelay100us()
{
uchari;
for(i=0;i<50;i++)
;
}
/**********************************
函数名称:主函数
修改日期:
入口参数:无
返回值:无
**********************************/
voidmain(void)
{
init();
while(1)//循环测量并显示
{
tran();//发送超声波信号测距
display(dis);//显示距离
}
}
/**********************************
函数名称:初始化函数
修改日期:
入口参数:无
返回值:无
**********************************/
voidinit(void)
{
TMOD=0x01;//定时器方式用于计时
TH0=0;
TL0=0;/*设定T0的工作模式为*/
EA=1;
IT0=1;//下降沿有效,左传感器
}
/**********************************
函数名称:延时函数
修改日期:
入口参数:n
返回值:无
**********************************/
voiddelay_nms(uintn)
{
uchari;
while(n--)
{
for(i=123;i>0;i--);
}
}
/**********************************
函数名称:显示函数
修改日期:
入口参数:data
返回值:无
**********************************/
voiddisplay(uintdat)
{
uchari,j,k;//分别为百十个位的缓存
i=dat/100;//百位
j=dat%100/10;//十位
k=dat%100%10;//个位
s3=1;s2=0;s1=1;s0=1;
seg=~leddata[i];
dp=0;
delay_nms(2);
dp=1;
s2=1;
s3=1;s2=1;s1=0;s0=1;
seg=~leddata[j];
delay_nms(2);
s1=1;
s3=1;s2=1;s1=1;s0=0;
seg=~leddata[k];
delay_nms(2);
s0=1;
}
/**********************************
函数名称:超声波测量函数
修改日期:
入口参数:无
返回值:无
**********************************/
voidtran(void)
{
uchari;
floattemp;
TH0=0;
TL0=0;//清定时
TR0=1;//开定时
for(i=8;i>0;i--)
{
csb=!csb;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
}
csb=1;
delay_nms(1);
EX0=1;//开中断
if(flag==1)//中断标志位置,说明有回波
{//以下为路程计算
temp=high_time*256+low_time;
temp=(temp/1000)/2;
temp*=340;
temp=temp/10;
dis=(unsignedint)temp;
flag=0;
}
}
/**********************************
函数名称:中断函数
修改日期:
入口参数:无
返回值:无
**********************************/
voidTT()interrupt0
{
uinttmp;
TR0=0;//关定时器
ET0=0;//关外部中断
flag=1;//置位标志位
tmp=TH0*256+TL0;//读取定时器的值
if((tmp>0)&&(tmp<60000))//判断是否超出范围,此设置的范围为到米,实际不能达到米
{
high_time=TH0;//把计时值放入缓冲
low_time=TL0;
}
else//超出范围则重新测量
{
high_time=0;
low_time=0;
}
}