HCSR04超声波测距仿真示例

Windows 10,Proteus 8.17 sp4。80C52单片机晶振频率11.0592兆赫。使用Proteus内置超声波测距传感器模组HCSR04。

原理:MCU向TRIG引脚输出一个正脉冲,时长大于十微秒。在正脉冲下降边沿t1处,传感器立即发送8个40千赫声波并于t2时刻结束,此时ECHO输出高电平,时刻t3回波结束,ECHO引脚回到低电平。t2~t3的时长就是声波一个来回的时间。据此可推算距离。

HCSR04需要的是对高电平计时。可以用定时器0、1的GATE。或者CPU原地等待。前者需要硬件电路配合,很好理解,ECHO必须接INT0/1引脚才行。后者浪费时间。按照最大量程4米,一个来回是800厘米,假设ECHO返回的高电平信号的比例因子是58us/cm(此数字由声速决定),那么CPU需要原地等待46.4ms。这显然不太好。

使用定时器0的GATE,配合INT0下降沿中断,可以实现测量INT0引脚上的高电平。因为量程的问题,定时器0的16位不会溢出。

sbit Trig = P2^7;
sbit Echo = P3^2;
static WORD timingResult = 0;
static BOOL canRead = 0;
static BOOL canTrig = 1;

void Timer0_Isr(void) interrupt 1 {
  TR0 = 0; //溢出了(实际不会)
  canRead = 0;
}
void Timer2_Isr(void) interrupt 5 {
  static BYTE x = 0;
  TF2 = 0;//需要手动清零
  if(++x == 20) {
    x = 0;
    // 200ms到了
    TR2 = 0;
    canTrig = 1;//允许再次触发
  }
}
void Ex0_Isr(void) interrupt 0 {
  timingResult = ((WORD)TH0 << 8) | TL0;
  TR0 = 0;
  TF0 = 0;
  ET0 = 0;
  canRead = 1; //本次ECHO结束,可以读结果
}
BOOL Radar_Trigger(void)
{
  ifnot(canTrig) return FALSE;
  
  Trig = 0; // 准备
  Echo = 1; // 输入模式
  
  TR0 = 0;
  TMOD &= 0xF0;
  TMOD |= 0x01; // 16位
  TMOD |= 0x08; // GATE
  TL0 = 0;
  TH0 = 0;
  ET0 = 1; // 也可以是0,因为实际不会溢出
  TF0 = 0;
  TR0 = 1; // INT0高电平时才会计数
  
  EX0 = 0;
  IT0 = 1; // 下降沿触发
  IE0 = 0;
  PX0 = 1; // 测量任务比较紧迫(其实INT0已经是最优先了)
  
  TR2 = 0;
	T2CON = 0;
	TL2 = 0x00;
	TH2 = 0xDC;
	RCAP2L = 0x00;
	RCAP2H = 0xDC; // 10ms @11.0592MHz
    ET2 = 1;
  TR2 = 1; // 检查周期用
  
  Trig = 1;
  Delay20us(); // 触发
  Trig = 0;
  
  EX0 = 1; //准备接受
  canRead = 0; //
  canTrig = 0; //等
  return TRUE;
}
BOOL Radar_GetTiming(LPWORD res) {
  if(res && canRead) {
    *res = timingResult;
    return TRUE;
  }
  return FALSE;
}

最后是测试效果。用下面主循环代码。

void main(void) {
  WORD d;
  UART_Init();
  EA=1;
  while(1) {
    if(Radar_Trigger())
      printf("Radar_Trigger: OK"  CRLF);
    if(Radar_GetTiming(&d))
      printf("%dcm" CRLF, (WORD)((float)d * 1.085f / 58.0f + 0.5f));
  }
}

表达式里面的1.085f是计数器计一次数的耗时(微秒),58.0f是根据声速换段得来的比例因子,单位us/cm:一米距离下用时5800us=5.8ms跑完一个来回,所以声速V=2m/5.8ms,约等于344.8m/s,大概对应22℃左右。查表法即可。

最终的效果是这样。

image

posted @ 2026-03-13 23:38  fish21  阅读(2)  评论(0)    收藏  举报