超声波数码管显示

超声波工作原理

(1)采用 IO 触发测距,给至少 10us 的高电平信号;
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间;
(4)超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;
在这里插入图片描述
接口定义
Vcc、 Trig(控制端)、 Echo(接收端)、 Gnd
注意事项
1:此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响
模块工作。
2:测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。
3:超声波测距的测距能力,要保证第一次发射的超声波有足够的时间反射回来,得算出时差并通过声速计算出距离,然后才能发射第二次,假设量程为3.4M,则超声波从发射到接受需要20MS 为一个测量周期, 量程与发射间隔成正比,理论上是这样。为了取得更好效果,超声波测距仪间隔取50-100MS 。

#include"reg51.h"
#include <intrins.h>
sbit RX=P2^1;
sbit TX=P2^0;
unsigned int  time=0;
unsigned int  timer=0;
bit flag=0;
unsigned long S=0;
#define GPIO_DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char disbuff[4]unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void DigDisplay()
{
 unsigned char i;
 unsigned int j;
 for(i=0;i<8;i++)
 {
  switch(i)  //位选
  {
   case(0):
    LSA=0;LSB=0;LSC=0; break;//0位
   case(1):
    LSA=1;LSB=0;LSC=0; break;//1
   case(2):
    LSA=0;LSB=1;LSC=0; break;//2
   case(3):
    LSA=1;LSB=1;LSC=0; break;//3
   case(4):
    LSA=0;LSB=0;LSC=1; break;//4
   case(5):
    LSA=1;LSB=0;LSC=1; break;//5
   case(6):
    LSA=0;LSB=1;LSC=1; break;//6
   case(7):
    LSA=1;LSB=1;LSC=1; break;//7
  }
  GPIO_DIG=disbuff[i];//发送段码
  j=10;       //扫描时间间隔
  while(j--); 
  GPIO_DIG=0x00;//消隐
 }
}
void Conut(void)
 {
  time=TH0*256+TL0;//读取当前数值
  TH0=0;//赋初值为0
  TL0=0;
  S= (long)(time*0.17);     //计算出来的距离位MM
  if(S<=40||flag==1) //超出范围显示ERR0
  { 
   flag=0;
   disbuff[0]=0x3f;    //0
   disbuff[1]=0x50;    //R
   disbuff[2]=0x50;    //R
   disbuff[3]=0x79;    //E
  }
  else//距离
  {
   disbuff[3]=DIG_CODE[S/1000];
   disbuff[2]=DIG_CODE[S%1000/100];
   disbuff[1]=DIG_CODE[S%100/10];
   disbuff[0]=DIG_CODE[S%10/1];
  }
 }
   void zd0() interrupt 1    //T0溢出标志
  {
    flag=1;        
  }
 void  zd3()  interrupt 3    //80Ms启动一次模块
  {
  TH1=0xf8;
  TL1=0x30;
  DigDisplay();
  timer++;
  if(timer>=40)
  {
   timer=0;
   TX=1;                   //80MS 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_();
   _nop_(); 
   _nop_(); 
   _nop_(); 
   _nop_();
   TX=0;
  } 
  }
  void  main(  void  )
  {  
    TMOD=0x11;     //配置T0T1
 TH0=0;
 TL0=0;          
 TH1=0xf8;     //2MS定时
 TL1=0x30;
 ET0=1;             //T0中断
 ET1=1;      //T1中断
 TR1=1;      //开启定时器1
 EA=1;      //总开关
 while(1)
 {
  while(!RX);  //当RX为0时等待
  TR0=1;       //开始计数
  while(RX);   //当RX为1时
  TR0=0;    //关闭定时器0
     Conut();   //计算距离
 }
 }
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个超声波数码显示的Verilog代码示例: ```verilog module ultrasonic_display( input clk, input echo, output reg [6:0] seg, output reg [3:0] dig ); reg [23:0] count; // 计算超声波距离 always @(posedge clk) begin if (echo) begin count <= 24'd0; end else begin count <= count + 24'd1; end end // 数码显示 always @(posedge clk) begin case (dig) 4'b0000: seg <= 7'b1111110; // 显示数码 0 4'b0001: seg <= 7'b0110000; // 显示数码 1 4'b0010: seg <= 7'b1101101; // 显示数码 2 4'b0011: seg <= 7'b1111001; // 显示数码 3 4'b0100: seg <= 7'b0110011; // 显示数码 4 4'b0101: seg <= 7'b1011011; // 显示数码 5 4'b0110: seg <= 7'b1011111; // 显示数码 6 4'b0111: seg <= 7'b1110000; // 显示数码 7 4'b1000: seg <= 7'b1111111; // 显示数码 8 4'b1001: seg <= 7'b1111011; // 显示数码 9 default: seg <= 7'b0000001; // 显示 - endcase end // 数码管扫描 always @(posedge clk) begin case (count[23:18]) 6'b000000: dig <= 4'b0000; // 第一位 6'b000001: dig <= 4'b0001; // 第二位 6'b000010: dig <= 4'b0010; // 第三位 6'b000011: dig <= 4'b0011; // 第四位 default: dig <= 4'b0000; // 循环 endcase end endmodule ``` 代码中使用了一个计数器 `count` 来计算超声波的距离,通过 `dig` 控制显示数码管位数,然后通过 `case` 语句来选择显示数码。最后通过扫描 `dig` 实现数码管的动态显示。需要注意的是,这只是一个简单的示例,实际应用中可能需要更多的逻辑和控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值