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


      

    //尽管fa,jie两端子默认高电平,但是上电后就变成低电平

    #include

    #include

    #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下载

  • 相关阅读:
    014 gtsam/examples/LocalizationExample.cpp
    Excel下载、Excel上传,邮件发送Excel并带Char图表
    Java中的Collections类[80]
    判断一个点是否在一个多边形内部
    mysql里的事务
    学习网络编程No.8【应用层协议之HTTP】
    iTOP-RK3588开发板rknn_multiple_input_demo 体验
    watch在项目中的使用
    Docker Compose安装部署Jenkins
    Java Spring Boot中的爬虫防护机制
  • 原文地址:https://blog.csdn.net/fengyuzhe13/article/details/127841021