一个基于 8086 汇编语言的微机原理与接口技术学习项目,使用唐都试验箱实现超声波测距和舵机控制。
本项目通过 8255 并行接口芯片和 8254 计数器芯片,驱动 HC-SR04 超声波模块和 SG90 舵机,实现实时距离测量和显示。系统采用动态扫描方式驱动 6 位数码管显示测量结果。
• 超声波测距:使用 HC-SR04 模块测量距离,精度达 0.1cm • 舵机控制:通过 PWM 信号驱动 SG90 舵机,角度范围 45°~135°,步进 10° • 实时显示:6 位数码管动态扫描显示距离值 • 数据过滤:采用中位数滤波算法提高测量稳定性 • 调试输出:通过串口输出原始计数值和计算结果
• 8255 并行接口芯片 - 控制舵机、声波模块、数码管 • 8254 计数器芯片 - 精确计时和测距 • 8086 CPU - 唐都试验箱主控
• HC-SR04 超声波模块 - 测距传感器 • SG90 舵机 - 执行机构 • 唐都试验箱上的共阴极数码管 - 显示模块
8255 基地址:0600H
PA = 0600H(数码管位选)
PB = 0602H(数码管段选)
PC = 0604H(舵机/声波控制)
控制口 = 0606H
8254 基地址:0640H
CNT0 = 0640H(测距计数器)
控制口 = 0646H
采用 PWM 脉冲宽度调制方式驱动舵机: • 周期:20ms • 脉宽范围:0.5ms ~ 2.5ms • 角度计算:脉宽(us) = 角度 × 11 + 500
使用 8254 计数器捕捉 ECHO 信号的上升沿和下降沿: • 发送 >10us 的 TRIG 脉冲触发声波模块 • 计数器记录 ECHO 高电平持续时间 • 距离计算:距离(cm) = 计数值 × 10 ÷ 108
动态扫描方式驱动 6 位数码管: • 轮流点亮各位(通过位选信号) • 每位显示对应的段选信号 • 刷新频率 >100Hz 时人眼看上去同时点亮
为了提高测量的稳定性,采用中位数滤波算法: • 每次测距时连续采集 5 次原始测量值 • 使用冒泡排序算法对 5 个值进行排序 • 取排序后的中间值(第 3 个)作为最终的距离值 • 这样可以有效消除偶发的干扰值,提高测量精度
• test.asm - 主程序源代码(8086 汇编)
• 原理.md - 详细的设计原理和算法说明
• 接线方案.md - 完整的硬件接线方案和时序图
-
初始化阶段
- 配置 8255 和 8254 芯片
- 舵机初始化到 90°
- 计数器开始计数
-
主循环
- 调用测距子程序获取原始计数值
- 中位数滤波处理
- 计算距离值
- 更新数码管显示
- 舵机步进运动(45°~135°)
- 输出调试信息到串口
-
测距子程序
- 重新初始化计数器
- 发送 TRIG 脉冲
- 轮询 ECHO 上升沿,锁存 start_time
- 轮询 ECHO 下降沿,锁存 end_time
- 计算时间差
• 中位数滤波:采集 5 次测量值,使用冒泡排序算法排序,取中间值(第 3 个)作为最终结果,有效消除偶发干扰 • 范围检测:有效距离 1.85cm ~ 600cm,超出范围提示 • 实时显示:0.1cm 精度显示距离值 • 自动扫描:舵机在 45°~135° 范围内自动扫描
使用 8086 汇编器编译:
masm test.asm
link test.obj
在唐都试验箱上运行编译后的可执行文件。
• 唐都试验箱没有 XA0 地址线,所以 8255 和 8254 的地址配置需要根据实际硬件调整 • 确保 8255 和 8254 的地址配置与程序一致 • GATE0 接高电平以保证计数器持续计数 • 舵机供电需要独立电源,避免影响逻辑电路 • 超声波模块需要清晰的声学环境,避免干扰 • 数码管显示刷新频率需要 >100Hz,否则会出现闪烁
由于时间原因,以下功能未在本项目中实现,但都是很好的扩展方向:
目前采用中位数滤波,可以进一步优化:
• 实现卡尔曼滤波算法,更好地处理测量噪声 • 采用自适应滤波,根据环境变化动态调整滤波参数 • 实现低通滤波器,平滑距离变化曲线
目前舵机采用固定步进(10°),可以改进为:
• 使用插值算法实现舵机的平滑运动,而不是离散的步进 • 例如使用线性插值或三次样条插值,让舵机转动更丝滑 • 可以设置不同的扫描速度和加速度曲线
本项目目前采用轮询方式进行测距,可以通过添加 8253 串口芯片实现上位机通信进行优化:
• 使用 8253 串口芯片与上位机通信 • 将测距数据实时发送到上位机进行处理和显示 • 上位机可以绘制距离变化曲线,便于数据分析 • 可以通过上位机控制舵机的扫描范围和速度
感兴趣的开发者可以基于本项目进行实现。