该楼层疑似违规已被系统折叠隐藏此楼查看此楼
C51编程:超声波测距程序(附图)[请帮助]-9-3018:44:03
#include
#definek1P3_4
#definecsboutP3_5//超声波发送
#definecsbintP3_7//超声波接收
#definecsbc=0.034
#definebgP3_3
unsignedcharcsbds,opto,digit,buffer[3],xm1,xm2,xm0,key,jpjs;//显示标识
unsignedcharconvert[10]=
{0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9段码
unsignedints,t,i,xx,j,sj1,sj2,sj3,mqs,sx1;
bitcl;
voidcsbcj();
voiddelay(j);//延时函数
voidscanLED();//显示函数
voidtimeToBuffer();//显示转换函数
voidkeyscan();
voidk1cl();
voidk2cl();
voidk3cl();
voidk4cl();
voidoffmsd();
voidmain()//主函数
{
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;
jpjs=0;
sj1=45;
sj2=200;
sj3=400;
k4cl();
TR1=1;
while(1)
{
keyscan();
if(jpjs<1)
{
csbcj();
if(s>sj3)
{
buffer[2]=0x76;
buffer[1]=0x76;
buffer[0]=0x76;
}
elseif(s
{
buffer[2]=0x40;
buffer[1]=0x40;
buffer[0]=0x40;
}
elsetimeToBuffer();
}
elsetimeToBuffer();//将值转换成LED段码
offmsd();
scanLED();//显示函数
if(s
bg=0;
bg=1;
}
}
voidscanLED()//显示功能模块
{
digit=0x04;
for(i=0;i<3;i++)//3位数显示
{
P3=~digit&opto;//依次显示各位数
P1=~buffer;//显示数据送P1口
delay(20);//延时处理
P1=0xff;//P1口置高电平(关闭)
if((P3&0x10)==0)//判断3位是否显示完
key=0;
digit>>=1;//循环右移1位
}
}
voidtimeToBuffer()//转换段码功能模块
{
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];
}
voiddelay(i)
{
while(--i);
}
voidtimer1int(void)interrupt3using2
{
TH1=0x9E;
TL1=0x57;
csbds++;
if(csbds>=40)
{
csbds=0;
cl=1;
}
}
voidcsbcj()
{
if(cl==1)
{
TR1=0;
TH0=0x00;
TL0=0x00;
i=10;
while(i--)
{
csbout=!csbout;
}
TR0=1;
i=mqs;//盲区
while(i--)
{
}
i=0;
while(csbint)
{
i++;
if(i>=2450)//上限值
csbint=0;
}
TR0=0;
TH1=0x9E;
TL1=0x57;
t=TH0;
t=t*256+TL0;
s=t*csbc/2;
TR1=1;
cl=0;
}
}
voidkeyscan()//健盘处理函数
{
xx=0;
if(k1!=1)//判断开关是否按下
{
delay(400);//延时去抖动
if(k1!=1)//判断开关是否按下
{
while(!k1)
{
delay(30);
xx++;
}
if(xx>2000)
{
jpjs++;
if(jpjs>4)
jpjs=0;
}
xx=0;
switch(jpjs)
{
case1:k1cl();break;
case2:k2cl();break;
case3:k3cl();break;
case4:k4cl();break;
}
}
}
}
voidk1cl()
{
sj1=sj1+5;
if(sj1>100)
sj1=30;
s=sj1;
}
voidk2cl()
{
sj2=sj2+5;
if(sj2>500)
sj2=40;
s=sj2;
}
voidk3cl()
{
sj3=sj3+10;
if(sj3>500)
sj3=100;
s=sj3;
}
voidk4cl()
{
sx1=sj1-1;
sx1=sx1/csbc;
mqs=sx1/4.5;
}
voidoffmsd()
{
if(buffer[0]==0x3f)
buffer[0]=0x00;