《8253基于Proteus仿真模拟音乐发生器》
二、实验目的
(1)了解和熟悉8253/8254接口芯片的工作原理和应用方法。
(2)掌握8253/8254接口芯片的设计与调试技巧。
(3)掌握8253/8254定时器/计数器的工作方式和编程原理。
三、实验内容
- 功能介绍
图1 含有三个开关
如上图1所示,当开始仿真运行后:
①按下开关SW1:启动音乐《虫儿飞》
②按下开关SW2:启动音乐《我和我的祖国》
③按下开关SW3:启动音乐《小毛驴》
- 设计的元件的介绍及相关知识点
⑴ 涉及的元件:
本次实验主要使用了8253、8086、8255元件,还包括7411、74LS138、74LS32、74LS273、SOUNDER、SW-SPST元件的应用。接下来主要针对8253介绍。
⑵ 芯片8253简介:
①外部介绍
- 面向CPU的信号源
D0~D7:数据线
/CS片选端,A0A1片内端口地址
/RD/WR读写信号
- 面向I/O设备的信号
CLKi时钟脉冲信号,用作计数脉冲
GATEi门控信号,用于定时/计数的启动/停止、允许/禁止
OUTi输出信号,用于实现I/O设备的定时/计数操作
图2 8253的外部引脚图
②内部介绍
它由数据总线缓冲器、读/写逻辑、控制字寄存器用于处理CPU与8253之间命令、数据、地址及数据的交换。3个独立的16位计数器组成,其中,计数值寄存器用于存放计数初值;减法计数器,用于进行减法计数操作,在装入计数初数器同时也装入减法计数器,然后,每来一个计数脉冲,它就减1,直至将计数初值减为0;当前计数值锁存器(16位),用于锁存减法计数器的内容,以供读出和查询当前计数值。其内部结构如下:
图3 8253内部结构
- 数据总线缓冲器
数据总线与系统总线连接,8位双向,与CPU交换信息的通道。是8253与CPU之间的数据接口,它由8位双向三态缓冲存储器构成,是CPU与8253之间交换信息的必经之路。
- 控制寄存器
用来保存来着CPU的控制字。每个计数器都有一个控制命令寄存器,用来保存该计数器的控制信息。控制字将决定计数器的工作方式、计数器形式以及输出方式。8253的3个控制寄存器只占用一个地址号,而靠控制字的最高两位来决定将控制信息送入哪个计数器的控制寄存器中保存。控制寄存器只能写入不能读出。
- 读/写逻辑
它的任务是接收CPU的控制信号,完成对8253内部的操作控制。这些控制信号包括读信号/RD、写信号/WR、片选信号/CS以及用于片内寄存器寻址的地址信号A0、A1。当片选信号有效,即/CS=0时,读写逻辑才能正常工作。该控制逻辑根据读/写命令即送来的地址信息,决定3个计数器和控制寄存器中哪一个工作,并控制内部总线上数据传送的方向。8253共占用4个I/O端口,CPU可对写操作。这4个端口地址由最低2位地址码A1和A0来选择,如表1所示。
/CS | /RD | /WR | A1 | A0 | 操作 |
0 | 1 | 0 | 0 | 0 | 写计数值到计数器0的CR |
0 | 1 | 0 | 0 | 1 | 写计数值到计数器1的CR |
0 | 1 | 0 | 1 | 0 | 写计数值到计数器2的CR |
0 | 1 | 0 | 1 | 1 | 写控制字,并根据控制字高两位将其送到相应的控制寄存器 |
0 | 0 | 1 | 0 | 0 | 从计数器0的OL中读出当前计数值 |
0 | 0 | 1 | 0 | 1 | 从计数器1的OL中读出当前计数值 |
0 | 0 | 1 | 1 | 0 | 从计数器2的OL中读出当前计数值 |
0 | 0 | 1 | 1 | 1 | 无操作 |
1 | * | * | * | * | 未选中 |
0 | 1 | 1 | * | * | 无操作 |
表1 8253端口地址以及内部操作
②工作方式选择控制字
图4 8253控制字段
④工作方式
- 方式0:计数结束产生中断方式
- 方式1:可编程单次脉冲方式
- 方式2:频率发生器方式
- 方式3:方波发生器
- 方式4:软件出发选通方式
- 方式5:硬件触发方式计数
- 实现过程
⑴实现平台及安装过程
- Proteus8.6
- 过程:
下载安装Proteus8.6(选择合适的存储地址)
安装Masm32(可直接实现在Proteus软件中编程)
⑵模拟过程
- 首先设计并连接电路图
- 进SOURCE CODE页面新建工程文件选编译环境MASM32(可下载)
- 进行程序编译
- 修改8086的Internal Memory Size为0x10000
- 修改CLK的脉冲频率为307.2k
- 音频表
- 汇编源代码
;*******根据 CHECR 配置信息修改下列符号值********
MY8255_A EQU 0C400H+00H*4 ;8255的A口地址
MY8255_B EQU 0C400H+01H*4 ;8255的B口地址
MY8255_C EQU 0C400H+02H*4 ;8255的C口地址
MY8255_MODE EQU 0C400H+03H*4 ;8255的控制寄存器地址
MY8253_COUNT0 EQU 0c440H+00H*4 ;8253计数器0端口地址
MY8253_COUNT1 EQU 0c440H+01H*4 ;8253计数器1端口地址
MY8253_COUNT2 EQU 0c440H+02H*4 ;8253计数器2端口地址
MY8253_MODE EQU 0c440H+03H*4 ;8253控制寄存器端口地址
STACK SEGMENT STACK
DW 256 DUP(0)
STACK ENDS
DATA SEGMENT
FREQ_LIST DW 330,330,330,350,393,330,294 ;频率表
DW 262,262,262,294,330,330,248,248
DW 221,330,294,221,330,294
DW 221,330,294,262
DW 262,0 ; 时间表
TIME_LIST DB 4,2,2,4,4,8,8
DB 4,2,2,4,4,6,2,8
DB 4,4,8,4,4,8
DB 4,4,6,2
DB 16
FREQ_LIST1 DW 495,556,495,441,393,350,330,248
DW 330,393,661,624,556,393,495,495
DW 556,624,556,495,441,393,393,278
DW 312,278,248,495,330,350,393,393,0
TIME_LIST1 DB 4,2,2,4,2,2,8,8
DB 3,3,3,3,3,3,8,8
DB 3,3,3,3,3,3,8,8
DB 3,3,3,3,3,3,8,8
FREQ_LIST2 DW 495,495,495,624,742,742,742,742,833
DW 833,833,990,742,661,661,833,833,624
DW 624,624,624,556,556,556,556,742,65535,742
DW 495,495,495,624,742,742,742,742,833
DW 833,833,990,742,661,6661,661,833,624
DW 624,624,624,624,556,556,556,624,495
DW 0
TIME_LIST2 DB 4,4,4,4,4,4,4,4,4
DB 4,4,4,16,4,4,4,4,4
DB 4,4,4,4,4,4,4,10,2,4
DB 4,4,4,4,4,4,4,4,4
DB 4,4,4,16,4,4,4,4,4
DB 2,2,4,4,4,4,4,4,16
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
;DS SS DP寄存器写入对应的数值
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX,256
MOV SP,AX
;8255初始化,A输出,b输入
MOV DX,MY8255_MODE
MOV AL,82h
OUT DX,AL
;初始化8254工作方式
MOV DX,MY8253_MODE
MOV AL,36h
OUT DX,AL ;定时器0,方式3
main:
MOV DX,MY8255_B;检测开关信号
IN AL,DX
TEST AL,01H;检测按键1是否被按下
JZ BEGIN0
TEST AL,02H;检测开关2是否被按下
JZ BEGIN1
TEST AL,04H;检测按键3是否被按下
JZ BEGIN2
;无有效按键时输出关蜂鸣器
MOV DX,MY8255_A
MOV AL,0H
OUT DX,AL
JMP MAIN
BEGIN0:
MOV DX,MY8255_A
MOV AL,1H
OUT DX,AL
MOV SI,OFFSET FREQ_LIST ;装入频率表起始地址
MOV DI,OFFSET TIME_LIST ;装入时间表起始地址
PLAY0:
MOV DX,0FH
MOV AX,0E502H
DIV WORD PTR [SI]
MOV DX,MY8253_COUNT0
OUT DX,AL
MOV AL,AH
OUT DX,AL
;取出演奏相对时间,调用延时子程序
MOV BX,0
MOV Bl,[DI]
CALL DALLY
ADD SI,2
INC DI
CMP WORD PTR [SI],0
JE BEGIN0
MOV DX,MY8255_B
IN AL,DX
TEST AL,01H
jnz main
Jmp PLAY0
BEGIN1:
MOV DX,MY8255_A
MOV AL,1H
OUT DX,AL
MOV SI,OFFSET FREQ_LIST1
MOV DI,OFFSET TIME_LIST1
PLAY1:
MOV DX,0FH
MOV AX,0E502H
DIV WORD PTR [SI]
MOV DX,MY8253_COUNT0
OUT DX,AL
MOV AL,AH
OUT DX,AL
;取出演奏相对时间,调用延时子程序
MOV BX,0
MOV Bl,[DI]
CALL DALLY
ADD SI,2
INC DI
CMP WORD PTR [SI],0
JE BEGIN1
MOV DX,MY8255_B
IN AL,DX
TEST AL,02H
jnz main
Jmp PLAY1
BEGIN2:
MOV DX,MY8255_A
MOV AL,1H
OUT DX,AL
MOV SI,OFFSET FREQ_LIST2
MOV DI,OFFSET TIME_LIST2
PLAY2:
MOV DX,0FH
MOV AX,0E502H
DIV WORD PTR [SI]
MOV DX,MY8253_COUNT0
OUT DX,AL
MOV AL,AH
OUT DX,AL
;取出演奏相对时间,调用延时子程序
MOV BX,0
MOV Bl,[DI]
CALL DALLY
ADD SI,2
INC DI
CMP WORD PTR [SI],0
JE BEGIN2
MOV DX,MY8255_B
IN AL,DX
TEST AL,04H
jnz main
Jmp PLAY2
;延时函数
DALLY PROC
PUSH CX
DELAY1:
MOV CX,08800H
LOOP $
DEC BX
JNZ DELAY1
POP CX
RET
DALLY ENDP
CODE ENDS
END START
- 音乐播放器原理
其工作方式是方式3:方波发生器
当装入初值后,在GATE上升沿启动计数,OUT 输出高电平;当计数完成一半时,OUT输出低电平。
计数过程:
当把方式3的控制字写入控制字寄存器后,输出端OUT变成高电平,作为初始电平。再将计数初值写入计数初值寄存器CR中,再经过一个时钟周期,计数初值被移入计数执行单元CE中,从下一个时钟脉冲开始作减1计数,方式3的计数过程分为两种情况:
第一种情况:计数初值为偶数,当作减1计数减到N/2时,输出端OUT端变成低电平,减到0时,输出端OUT变成高电平,并重新从初值开始新的计数过程。若GATE为高电平,则一直重复同样的计数过程。可见,输出端OUT输出连续的方波,故称方波发生器。
第二种情况:计数初值为奇数,当作减1计数减到(N+1)/2以后,输出端OUT变成低电平,减到0时,输出端OUT又变成高电平。并重新从初值开始新的计数过程。若GATE为高电平,则一直重复同样的计数过程。可见,输出端OUT输出连续的方波,故称为方波发生器。
门控信号的影响:工作在方式3时,门控信号GATE的功能与工作方式2一样,即GATE 为高电平时,允许计数:GATE为低电平时停止计数。GATE引脚上的信号从低电平跳到高电平时,将会重新把计数初值寄存器CR中的内容移入计数执行单元CE中,并以新装入的值重新开始计数。
四、电路设计
- 整体电路图:实现可播放《虫儿飞》《我和我的祖国》《小毛驴》三首音乐的音乐播放器,实现音乐的开关及发声
图5 音乐发生器电路图
五、流程图
通过给8253定时器装入不同的计数值,可以使其输出不同频率的波形。便可驱动扬声器发出不同频率的音调,要使该音调的声音持续一段时间,只要插入一段延时程序。SI指向曲中的频率,BP指向曲中的时间节拍。从SI的指向的音节表中取一个频率,只要不是0,即有效就再读取时间,然后转到start子程序,计算计数初值送入计数器,产生各种频率信号,再送至扬声器。
图6 整体流程图