//尽管fa,jie两端子默认高电平,但是上电后就变成低电平
#include<reg52.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char data aa[]={0,0,0,0};
uint shijian;
sbit fa=P1^0;
sbit jie=P3^3; //INT1
void tmpDelay(int num)//延时函数
{
while(num--) ;
}
void Send(unsigned char dat)
{
SBUF=dat;
while(TI==0) //等待发送完毕
;
TI=0;
tmpDelay(1000);
}
void fashe()
{
TMOD=0x91; //定时器T0`T1工作于方式1 ,16位.T0发射,T1计时 .GATE=1,只有int1为高电平时才能
启动
TH0=0xff; //T0发射30us,
TL0=0xe1;
TH1=0x00; //T1计时
TL1=0x00;
ET1=1; //允许中断
ET0=1;
EA=1; //总中断允许
IT1=1; //INT1下降沿触发
EX1=0; //关闭INT1
TR1=0; //关闭定时器T1
TR0=1; //启动定时器T0
fa=1;
}
void jieshou()
{
while(TF0==0);//等待T0发射30us结束
TF0=0; //软件清零
fa=0; //停止发射
TR0=0; //关闭定时器T0
TH0=0xd2; //T0计时11764us,约为4M,超过极限值停止计时
TL0=0x0b;
TR0=1; //开启定时器T0
TR1=1; //开启定时器T1
EX1=1; //开启INT1
while(jie==0) //等待T1接受高电平回波
{
if(TF0==1)//当T0计时到11764us时,则证明无反射波。
{
TF0=0 ; //软件清零
TR1=0; //关闭定时器T1,返回值0
TH1=0;
TL1=0;
break ;
}
}
// if(jie==1) //如果接受到高电平,则计时
// TR1=1;
while(jie==1); //等待计时结束
// TR1=0; //关闭定时器T1
EX1=0; //关闭INT1
shijian=TH1*255+TL1;
jie=0;
}
void jisuanzhi ()
{
float juli;
uint a;
juli=(float)shijian/2*0.34 ; // 0.34mm/us ,得到的单位为mm.
a=(uint)juli;
aa[0]=(a/1000)%10+48;
aa[1]=(a/100)%10+48 ;
aa[2]=(a/10)%10+48 ;
aa[3]=a%10+48;
}
void chuankou_init()
{
TMOD=0x20; //定时器T1工作于方式2 ,8位自动重装
SCON=0x50; //SCON=0101 0000B,串口工作方式1,允许接收(REN=1)
PCON=0x00; //PCON=0000 0000B,波特率2400
TH1=0xF3 ; //根据规定给定时器T1赋初值
TL1=0x00; //根据规定给定时器T1赋初值
TR1=1; //启动定时器T1
REN=0; //不允许接收
}
void main ()
{
uchar i,j;
TF0=0;
while(1)
{
fashe();
jieshou();
jisuanzhi();
chuankou_init();
for(i=0;i<4;i++)
Send(aa[i]);
for(j=0;j<4;j++)
tmpDelay(6000);
}
}
void int_1() interrupt 2
{
TR1=0; //关闭定时器T1
}
由于数码管连接麻烦,常用的液晶1602太贵,没买。所以显示就用串口和PC通讯
连续四次单字节发送。另附简单的VB程序,至于怎么添加控件,这里就不在细说
以上为老版本VB编写的界面,现在可能不能直接运行了,只可以参考。
Private Sub Form_Load()
MSComm1.CommPort = 1 ' 设置通信端口号为COM1
MSComm1.Settings = "2400,n,8,1" ' 设置串口1参数
MSComm1.InputMode = 0 ' 接收文本型数据
MSComm1.PortOpen = True ' 打开通信端口1
End Sub
Private Sub Timer1_Timer()
Dim buf As String
buf = Trim(MSComm1.Input) ' 将缓冲区内的数据读入buf变量中
If Len(buf) = 4 Then ' 判断缓冲区内是否存在数据
Label2.Caption = buf + "mm " '空格
End If
End Sub
完整资料打包: