STC51单片机24——超声波测距 窗口显示距离

  

//尽管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

完整资料打包:

STC51单片机24-超声波测距窗口显示距离资源-单片机文档类资源-CSDN下载

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fengyuzhe13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值