📄 超声波发射程序.c
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uint c;
ulong l,time;
char i=1,j=1,k=80;
char t,tp=10,ts,tg,lb,ls,lg,lsf,fh,cb,cs,cg;
sbit RW=P2^1;
sbit RS=P2^0;
sbit E=P2^2;
sbit rece=P3^3;
sbit tup=P1^1;
sbit tdown=P1^0;
sbit aj=P1^2;
sbit reset=P1^3;
sbit sg=P3^7;
sbit DQ=P3^5;
sbit ctl=P3^5;
void delay(uint i)
{while(i--);
}
//************液晶显示***************//
void writercom(uchar q)
{E=1;
RS=0;
RW=0;
P0=q;
E=0;
delay(20);
}
void writerdata(uchar o)
{
E=1;
RS=1;
RW=0;
P0=o;
E=0;
delay(20);
}
void writer_d(uchar *u)
{while(*u)
writerdata(*u++);
}
void xsinit(void)
{writercom(0x01);
writercom(0x38);//使用8位数据,显示两行,使用5*7的字型//
writercom(0x0c);//显示设置,不显示光标,字符不显闪琐//
writercom(0x06);//光标从左往右移,内容不移//
}
pdisplay()
{writercom(0x80);
writer_d("Press any key ");
writercom(0xba);
writer_d(" to continue...");
delay(2000);
}
bdisplay()
{writercom(0x80);
writer_d("Ultrasonic ");
writercom(0xba);
writer_d(" range finder");
delay(60000);
}
ipdisplay()
{writercom(0x80);
writer_d(" Please input ");
writercom(0xba);
writer_d("T(");
writerdata(0xdf);
writer_d("C) with K1,K2.");
delay(2000);
}
//*************超声波测距*************************//
void csbinit() //初始化程序,计数/定时器状态 //
{TMOD=0x12; //定时器1工作在定时方式1,定时器0工作在定时方式2//
IE=0x84; //中断设置//
TH0=244;
TL0=244;
}
void sen() //超声波发射程序//
{uchar times=0;
TR0=1;
TR1=1; //开定时器//
while(1)
{while(TF0==0);
sg=~sg;
times++; //翻转20次,发送10个脉冲信号的超声波//
TF0=0;
if(times==20)break;}
times=0;
}
csbdata()
{lb=l/1000000;
ls=l%1000000/100000;
lg=l%1000000%100000/10000;
lsf=l%1000000%100000%10000/1000;
if(lsf>=5)lg=lg+1;
}
rec()interrupt 2 using 2//接收中断程序//
{TR1=0;//关计数器//
ctl=0;
time=TH1*256+TL1; //算出t的值,t的单位为us//
l=time*c/2;
TH1=0;
TL1=0;
}
display1()
{
while(k--)
{ipdisplay();
if(tup==0||tdown==0||reset==0||aj==0){i=0;break;}
}
k=60;
while(k--)
{pdisplay();
if(tup==0||tdown==0||reset==0||aj==0){i=0;break;}
}
k=60;
}
measure()
{csbdata();
while(1)
{if(aj==1)break;}
ctl=0;
sen();
delay(200);
ctl=1;
}
display2()
{writercom(0x80);
writer_d("T:");
writerdata(fh);
writerdata(ts+0x30);
writerdata(tg+0x30);
writerdata(0xdf);
writer_d("C ");
writer_d("c=");
writerdata(cb+0x30);
writerdata(cs+0x30);
writerdata(cg+0x30);
writer_d("m/s");
while(i)
{while(k--)
{writercom(0xba);
writer_d("Press K3 measure");
if(aj==0){i=0;break;}
delay(2000);}
k=20;
while(k--)
{writercom(0xba);
writer_d(" ");
if(aj==0){i=0;break;}
delay(2000);}
k=20;
}
i=1;
measure();
delay(2000);
csbdata();
writercom(0x80);
if(l<=360000)writer_d("too near! ");
else if(TH1>=93)writer_d("too long! ");
else {csbdata();
writer_d("L=");
writerdata(lb+0x30);
writerdata('.');
writerdata(ls+0x30);
writerdata(lg+0x30);
writer_d("m ");
writer_d("T:");
writerdata(fh);
writerdata(ts+0x30);
writerdata(tg+0x30);
writerdata(0xdf);
writer_d("C ");
}
while(i)
{writercom(0xba);
writer_d("Press K4 again..");
if(tup==0&&tdown==0){j=0;break;}
if(reset==0){i=0;break;}
}
}
//***************温度输入程序**************//
iptemp()
{while(1)
{if(t<0){fh=0x2d;t=~t+1;}
else{fh=0x20;}
ts=t/10;
tg=t%10;
writercom(0x80);
writer_d(" T:");
writerdata(fh);
writerdata(ts+0x30);
writerdata(tg+0x30);
writerdata(0xdf);
writer_d("C ");
if(tup==0){tp++;if(tp>=99)tp=99;}
delay(7000);
if(tdown==0){tp--;if(tp<=(-30))tp=(-30);}
t=tp;
delay(7000);
writercom(0xba);
writer_d("Press K4 finish ");
if(reset==0)break;
}
}
//********声速处理程序************************//
sscl()
{c=340;
cb=c/100;
cs=c%100/10;
cg=c%100%10;
}
//***************主程序***************//
main()
{while(1)
{xsinit();
csbinit();
bdisplay();
bdisplay();
bdisplay();
bdisplay();
bdisplay();
ipdisplay();
ipdisplay();
while(i)
{display1();
}
i=1;
delay(20000);
iptemp(); //调温度输入函数//
sscl();
delay(20000);
while(j)
{display2();
i=1;
}
j=1;
delay(60000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -