冰序小站

基于8254定时器与8255A接口的音乐盒设计

发布时间:2026-03-19 21:20:27 | 更新时间:2026-03-19 21:38:49

一、项目概述

本项目基于8086汇编语言实现,依托8254可编程定时器/计数器和8255A并行接口芯片,设计了一款具备交互功能的电子音乐盒。该音乐盒支持4首经典曲目(《柯南》《两只老虎》《友谊地久天长》《一剪梅》)的播放,核心功能包括:

  • 菜单式交互选择歌曲,支持Q键退出;

  • 播放过程中实时响应按键操作(1-4切换歌曲、8暂停、9继续、Q返回菜单);

  • 数码管同步显示当前播放的歌曲编号;

  • 单首曲目播放完毕后自动等待5秒,无输入则循环播放;

  • 按要求优化:按下8键暂停时,输出区不显示任何暂停提示信息。

二、硬件核心原理

1. 8254定时器/计数器

(1)核心作用

8254工作在方式3(方波发生器模式),通过设置不同的计数初值产生对应频率的方波信号,驱动发声设备输出不同音调的音符。

(2)关键配置

  • 控制字:36H(计数器0、先写低8位后写高8位、方式3、二进制计数);

  • 输入时钟:默认1MHz(十六进制0F4240H);

  • 计数初值计算:计数初值 = 1000000Hz / 音符频率(代码中通过DIV指令实现0F4240H / 频率);

  • 端口地址:基于基地址0600H,计数器0端口0600H,控制寄存器端口0606H

2. 8255A并行接口

(1)核心作用

用于驱动数码管显示当前播放的歌曲编号(1-4),分为段选和位选控制。

(2)关键配置

  • 工作方式:方式0(基本输入输出模式);

  • 控制字:89H(A口输出、B口输出、C口输入);

  • 端口分配:

    • A口(0600H):数码管位选(选中第一个数码管);

    • B口(0602H):数码管段选(输出字形编码);

    • 控制寄存器(0606H):写入工作方式控制字。

3. 端口地址映射

设备/功能 端口地址 说明
8254计数器0 0600H 写入计数初值(音符频率)
8254控制寄存器 0606H 写入工作模式控制字
8255A口 0600H 数码管位选
8255B口 0602H 数码管段选
8255控制寄存器 0606H 写入工作方式控制字

三、软件设计架构

1. 数据段(DATA)

定义音乐盒运行所需的静态数据,核心模块如下:

数据模块 内容说明
菜单/提示信息 MENU_MSG(主菜单)、SELECT_MSG(选择提示)、PLAYING_MSG(播放提示)等
歌曲参数表 每首歌的频率表(音符对应的频率值)、时间表(音符持续时长)
歌曲指针表 FRFR_LIST(频率表指针)、TITI_LIST(时间表指针),关联4首歌的参数表
状态变量 SONG_CHOICE(当前选中歌曲)、PAUSE_FLAG(暂停标志:0播放/1暂停)
数码管编码表 DTABLE(0-9的七段数码管字形编码)

2. 代码段(CODE)

采用“主流程+子程序”的模块化设计,核心流程和子程序如下:

(1)主流程

```Plain Text

初始化8255 → 显示菜单 → 获取用户选择 → 数码管显示歌曲编号 → 初始化8254 → 播放歌曲 → 循环/退出


#### (2)核心子程序

|子程序名|功能说明|
|---|---|
|INIT_8255|初始化8255A为方式0,A/B口输出、C口输入|
|SHOW_MENU/DISPLAY_SONG_LIST|清屏并显示菜单、歌曲列表|
|GET_USER_CHOICE|获取用户按键选择(1-4/Q),做合法性校验|
|PLAY_SELECTED_SONG|核心播放逻辑:读取频率/时长、设置8254、带按键检测的延时、响应暂停/切换|
|SET_SONG_POINTERS|根据选中歌曲,映射到对应的频率表和时间表指针|
|CHECK_KEYBOARD|非阻塞式检测键盘输入(INT 16H),保证播放不中断|
|DELAY_WITH_CHECK|带按键检测的延时:延时中实时检测按键,有输入则立即退出|
|DISPLAY_SONG_NUMBER|查数码管编码表,输出到8255A/B口显示歌曲编号|
|STOP_SOUND|设置8254计数初值为0FFH,停止发声(暂停/结束时调用)|
## 四、核心功能实现细节

### 1. 音符播放原理

1. 根据选中歌曲,通过`SET_SONG_POINTERS`获取频率表(SI)和时间表(DI)指针;

2. 读取当前音符频率:若为0则表示曲目结束,进入5秒等待循环;

3. 计算计数初值:`AX=4240H、DX=0FH`(组合为`0F4240H`),执行`DIV [SI]`得到计数初值;

4. 将计数初值低8位、高8位依次写入8254计数器0,产生对应频率方波;

5. 读取当前音符时长(DL),调用`DELAY_WITH_CHECK`实现带按键检测的延时;

6. 延时结束后,SI+2(下一个频率)、DI+1(下一个时长),循环播放。

### 2. 实时交互控制

#### (1)非阻塞按键检测

通过`INT 16H`的01H功能检查键盘状态(无按键则ZF=1),00H功能读取键值,避免阻塞播放流程:

```Assembly language

CHECK_KEYBOARD PROC
    MOV AH, 01H         ; 检查键盘状态
    INT 16H
    JZ  NO_KEY          ; 无键按下,返回0
    MOV AH, 00H         ; 有键按下,读取键值
    INT 16H
    RET
NO_KEY:
    MOV AL, 0           ; 无按键返回0
    RET
CHECK_KEYBOARD ENDP

(2)暂停/继续逻辑

  • 暂停(8键):设置PAUSE_FLAG=1,调用STOP_SOUND停止发声,无任何提示输出;

  • 继续(9键):清除PAUSE_FLAG=0,恢复音符播放流程;

  • 核心:暂停仅修改标志位和停止发声,无任何INT 21H输出指令,满足“不显示暂停信息”的要求。

(3)歌曲切换

播放中按下1-4键时,立即更新SONG_CHOICE,重新映射频率/时间表指针,数码管同步更新编号,实现无缝切换。

3. 自动循环播放

单首曲目播放完毕(频率表读到0)后:

  1. 调用STOP_SOUND停止发声;

  2. 进入5秒等待循环(CX=50次短延时),期间检测按键;

  3. 无按键则恢复频率/时间表到起始指针,清除暂停标志,重新播放;

  4. 有按键则立即响应(切换/退出等)。

五、关键技术亮点

  1. 实时性保障:延时函数DELAY_WITH_CHECK在延时过程中持续检测按键,确保播放中按键操作无延迟响应;

  2. 资源复用:8254/8255共用基地址,通过偏移区分端口,简化硬件接线;

  3. 状态管理:通过PAUSE_FLAG单一标志位控制暂停/继续,逻辑简洁且易维护;

  4. 用户体验优化:数码管实时显示歌曲编号、播放完毕自动循环、无效按键不响应,符合交互直觉;

  5. 需求精准满足:按下8键暂停时,代码中无任何输出暂停信息的指令(如INT 21H 09H),严格匹配修改要求。

六、运行环境与依赖

  1. 硬件环境:8086微机实验箱(含8254、8255A芯片、数码管、发声模块);

  2. 软件环境:MASM/TASM汇编器、DOSBox(或实模式8086环境);

  3. 编译运行指令

    
    MASM SOUND.ASM;       # 汇编生成目标文件
    LINK SOUND.OBJ;       # 链接生成可执行文件
    SOUND.EXE             # 运行程序
    

总结

  1. 本音乐盒核心依托8254方式3产生不同频率方波实现音符播放,8255A驱动数码管显示歌曲编号;

  2. 软件通过非阻塞按键检测、状态标志位管理,实现播放中实时切换、暂停/继续等交互功能;

  3. 严格遵循需求:按下8键暂停时无任何暂停信息输出,且具备曲目自动循环、数码管同步显示等增强特性。

评论区

暂无评论,快来抢沙发吧~