锅盖没有盖儿 2021-06-20 10:08 采纳率: 0%
浏览 38

(超声波测距)求用汇编语言的一个子程序计算距离,时间已经记好

我用的是HC-SR04超声波模块,计的时间已经放到40H(高位)和41H(低位)

求一个子程序算距离,算出来是两字节16进制就行

  • 写回答

1条回答 默认 最新

  • qq_33991927 2023-11-23 10:53
    关注
    通过超声波模块测量距离,并将结果存储在变量distance中。如果距离小于30厘米,则点亮LED指示灯;否则,关闭指示灯。程序使用计时器来测量超声波的往返时间,并将其转换为距离。循环进行测量并显示结果。
    
    ```bash
    
    ; 定义引脚和寄存器
    sbit TRIG = P0^0 ; 超声波模块的触发引脚
    sbit ECHO = P0^1 ; 超声波模块的回声引脚
    sbit LED = P1^0 ; 指示灯引脚
    
    ; 定义常量
    distance equ 0x80 ; 距离变量存储地址
    
    org 0x0000 ; 程序起始地址
    
    main:
      mov TH0, #0 ; 清空计时器高字节
      mov TL0, #0 ; 清空计时器低字节
      clr TRIG    ; 将TRIG引脚置为低电平
      clr ECHO    ; 将ECHO引脚置为低电平
    
      ; 发送超声波信号
      setb TRIG   ; 将TRIG引脚置为高电平
      acall delay_us ; 延时10us
      clr TRIG    ; 将TRIG引脚置为低电平
    
      ; 接收回声信号
      while (ECHO == 0) ; 等待ECHO引脚变为高电平
      while (ECHO == 1) ; 等待ECHO引脚变为低电平
    
      ; 计算距离
      mov TH0, #0 ; 清空计时器高字节
      mov TL0, #0 ; 清空计时器低字节
      while (ECHO == 0) ; 等待ECHO引脚变为高电平
      while (ECHO == 1) ; 等待ECHO引脚变为低电平
      mov A, TH0   ; 读取计时器高字节
      mov B, TL0   ; 读取计时器低字节
      add A, #256 ; 高字节溢出位加1
      mov R0, A   ; R0寄存器保存计时器值
      mov R1, B   ; R1寄存器保存计时器值
      mov A, R0   ; 将R0寄存器的值存入累加器A
      mul AB, #10 ; 将计时器十进制值乘以10
      mov A, R0   ; 将R0寄存器的值存入累加器A
      mul AB, #343 ; 将计时器十进制值乘以343
      div AB, #20000 ; 计算距离(单位:厘米)
    
      ; 显示距离
      mov R0, A   ; 将累加器A中的值存入R0寄存器
      mov distance, R0 ; 将距离存入distance变量
    
      ; 判断距离是否超出阈值
      mov A, R0   ; 将R0寄存器的值存入累加器A
      cmp A, #30  ; 比较距离与阈值
      jnc too_far ; 如果距离大于阈值,则跳转到too_far标签
    
      ; 距离未超出阈值,亮起LED
      setb LED    ; 将LED引脚置为高电平
      sjmp exit   ; 跳转到程序结束
    
    too_far:
      clr LED     ; 将LED引脚置为低电平
    
    exit:
      sjmp main   ; 跳转到主循环
    
    ; 微秒级延时函数
    delay_us:
      mov R2, #5  ; 初始化R2为5,用于延时
    delay_loop:
      nop         ; 空操作
      djnz R2, delay_loop ; 循环5次
      ret         ; 返回主程序
    
    

    ```

    评论

报告相同问题?