一、 实验目的
学习掌握8253用作定时器的编程原理;
二、 实验原理和内容
1.完成一个音乐发生器,通过喇叭或蜂鸣器放出音乐,并在数码管上显示乐谱。
2.扩展部分:利用小键盘实现弹琴功能,并显示弹奏的乐谱。 注意:8253输入频率应小于2MHz。
三 硬件接线图及软件程序流程图
1 硬件接线图
2 软件程序流程图
开始 初始化8254 8255,A口接数码管显示,B口位选数码管,C口接小键盘输入 扫描键盘 判断输入 输入为0 输入1~8 输入为9 播放音乐,数码管显示相应的音符 发出对应的音,数码管显示音符 熄灭数码管,返回dos 否 是否播放结束 按键是否弹起 是 是 停止发音,初始化8254 结束
四 源程序
DATA SEGMENT
FENPIN DW 0001H,3906,3472,3125,2932,2604,2344,2083,1953;分频比 DIGITAL DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH;数码管 MUSIC DB 0,1,2,3,1,1,2,3,1,0,3,4,5,0,3,4,5,0,5,6,5,4,3,1,0,5,6,5,4,3,1,0,1,5,1,0,1,5,1,0 ;存放播放的乐曲音符
NUM DB 00H,070H,0B0H,0D0H,0E0H ;检测键盘输入 DATA ENDS
STACK SEGMENT STACK 'STACK'
DB 100 DUP(?) STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
;延时子程序
DELAY PROC NEAR PUSH CX
MOV CX,100H WAIT0: LOOP WAIT0 POP CX RET DELAY ENDP
;延时子程序2
DELAY1 PROC NEAR PUSH CX
MOV CX,0FFFFH WAIT1: LOOP WAIT1 POP CX RET DELAY1 ENDP
;获取键盘输入值的子程序 KEY PROC NEAR
PUSH AX ;保护现场 PUSH CX PUSH DX MOV CX,01H
CHECK: MOV DX,28AH ;C口地址给DX MOV BX,OFFSET NUM ADD BX,CX MOV AL,[BX] OUT DX,AL ;防抖
IN AL,DX ;判断是否有键盘按下 MOV AH,AL CALL DELAY IN AL,DX CMP AL,AH
JNZ CHECK ;不相等说明为抖动,重新检测 ;判断按下的列
AND AL,0FH
CMP AL,0FH JZ NEXT CMP AL,0EH JZ NEXT1 CMP AL,0DH JZ NEXT2 CMP AL,0BH JZ NEXT3 MOV BX,01H JMP GOT
NEXT: INC CX ;修改变量扫描下一行 CMP CX,05H JNZ JUMP1 MOV CX,01H JUMP1: JMP CHECK NEXT1: MOV BX,04H JMP GOT NEXT2: MOV BX,03H JMP GOT NEXT3: MOV BX,02H ;计算按下键盘的数值 GOT: SUB CX,01H MOV AL,CL MOV DL,04H MUL DL ADD BL,AL
SUB BL,01H ;此时BX中所存即为对应的偏移量 POP DX ;恢复现场 POP CX POP AX RET KEY ENDP ;主程序
START: MOV AX,DATA MOV DS,AX ;8253初始化 MOV DX,283H MOV AL,36H OUT DX,AL ;8255初始化
MOV DX,28BH
MOV AL,81H ;C口输入 OUT DX,AL
MOV DX,289H ;B口位选数码管
MOV AL,01H OUT DX,AL ;扫描键盘
LOOP1: CALL KEY
CMP BX,0 ;按0播放音乐 JZ PLAY0
CMP BX,9 ;按9退出 JZ EXIT
;按1~8发出对应音
MOV CX,BX
MOV BX,OFFSET DIGITAL ;数码管显示音符 ADD BX,CX MOV AL,[BX]
MOV DX,288H ;A口输出 OUT DX,AL ;播放该音符
MOV BX,OFFSET FENPIN MOV AX,CX ADD AX,AX ADD BX,AX
;计数,先低八位后高八位 MOV AX,[BX] MOV DX,280H OUT DX,AL MOV AL,AH OUT DX,AL CALL DELAY1 CALL DELAY1
MOV DX,28AH ;C口输入 IN AL,DX ;检测键盘是否弹起
MOV AH,AL LOOP2: CALL DELAY IN AL,DX CMP AL,AH JZ LOOP2
;初始化8253,停止播放音乐 MOV AX,0H MOV DX,283H MOV AL,36H
OUT DX,AL
JMP LOOP1