基于8254定时器与8255A接口的音乐盒设计
一、项目概述
本项目基于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)后:
调用
STOP_SOUND停止发声;进入5秒等待循环(
CX=50次短延时),期间检测按键;无按键则恢复频率/时间表到起始指针,清除暂停标志,重新播放;
有按键则立即响应(切换/退出等)。
五、关键技术亮点
实时性保障:延时函数
DELAY_WITH_CHECK在延时过程中持续检测按键,确保播放中按键操作无延迟响应;资源复用:8254/8255共用基地址,通过偏移区分端口,简化硬件接线;
状态管理:通过
PAUSE_FLAG单一标志位控制暂停/继续,逻辑简洁且易维护;用户体验优化:数码管实时显示歌曲编号、播放完毕自动循环、无效按键不响应,符合交互直觉;
需求精准满足:按下8键暂停时,代码中无任何输出暂停信息的指令(如
INT 21H 09H),严格匹配修改要求。
六、运行环境与依赖
硬件环境:8086微机实验箱(含8254、8255A芯片、数码管、发声模块);
软件环境:MASM/TASM汇编器、DOSBox(或实模式8086环境);
编译运行指令:
MASM SOUND.ASM; # 汇编生成目标文件 LINK SOUND.OBJ; # 链接生成可执行文件 SOUND.EXE # 运行程序
总结
本音乐盒核心依托8254方式3产生不同频率方波实现音符播放,8255A驱动数码管显示歌曲编号;
软件通过非阻塞按键检测、状态标志位管理,实现播放中实时切换、暂停/继续等交互功能;
严格遵循需求:按下8键暂停时无任何暂停信息输出,且具备曲目自动循环、数码管同步显示等增强特性。
评论区
暂无评论,快来抢沙发吧~