资源描述
一. 实验名称:发声器
二. 功能及用法:
设计一种电子琴发声程序,并在运营时通过实验箱上扬声器发声,并且当按下数字1~14时,依次发出1,2,3,4,5,6,7低音和1,2,3,4,5,6,7中音。并在实验箱上发声器上发声,这必定需要有发声程序,驱动发声程序,尚有键盘扫描程序,及为了可以听见清脆字符音还得对程序进行必要延时。运用8254芯片所提供转化后频率送到发声单元进行发声及8255芯片送提供输入输出功能,来完毕从键盘输入到发声装置发声控制。
电子发声原理:
一种音符相应一种频率,将相应一种音符频率方波通到扬声器上,就可以发出这个音符声音。将一段乐曲音符相应频率方波一次送到扬声器,就可以演奏出这段乐曲。运用8254“方波发生器”,将相应一种频率计数初值写入计数器,就可以产生相应频率方波。计数初值计算如下:
计数初值 = 输入时钟\输出频率
例如输入时钟采用1MHZ,要得到800HZ频率,计数初值即为1000000/800。音符与表对照关系如上表所示。对于每一种音符演奏时间,可以通过软件延时来解决。一方面拟定单位延时子程序(依照CPU频率不同而有所变化)。然后拟定每个音符演奏需要几种单位延时,将此值送入寄存器,再调用延时子程序即可。
三.实验器件:
通过实验箱上扬声器发声,并且当按下数字1~14时,依次发出1,2,3,4,5,6,7低音和1,2,3,4,5,6,7中音。并在实验箱上发声器上发声。
选用器件:
8254和8255芯片各一片,微机一台,TPC-H通用微机接口实验系统一台,扬声器和导线若干
四.电路连接图:
8254某些接线图
8255某些接线图
五.各子程序功能
1.为8255和8254所定义端口地址:
I0Y0 EQU 06C0H
MY8254_COUNT0 EQU I0Y0+00H
MY8254_COUNT1 EQU I0Y0+02H
MY8254_COUNT2 EQU I0Y0+04H
MY8254_MODE EQU I0Y0+06H
MY8255_A EQU 0640H
MY8255_B EQU 0642H
MY8255_C EQU 0644H
MY8255_MODE EQU 0646H
2..频率表及所相应时间表:
FREQ_LIST DW 262H,294H,330H,349H,392H,440H,496H
DW 523H,587H,659H,698H,784H,880H,988H
DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
3.定义8255和8254控制字
MOV DX,MY8255_MODE
MOV AL,81H
OUT DX,AL
MOV DX,MY8254_MODE
MOV AL,36H
OUT DX,AL
4.CCSCAN子程序实现取出按键值并输入A口(清屏子程序)
CCSCAN:MOV AL,00H
MOV DX,MY8255_A
OUT DX,AL
MOV DX,MY8255_C
IN AL,DX
NOT AL
AND AL,0FH
RET
5.Play输出发音子程序
PLAY PROC
MOV AH,0
MOV SI,AX
SHL SI,1
MOV DX,0FH
MOV AX,4240H
DIV WORD PTR [SI]
MOV DX,MY8254_COUNT0
OUT DX,AL
MOV AL,AH
OUT DX,AL
RET
PLAY ENDP
6.延时子程序
DALLY PROC
D0:MOV CX,0010H
D1:MOV AX,02H
D2:DEC AX
JNZ D2
LOOP D1
DEC DL
JNZ D0
RET
DALLY ENDP
7.按键扫描功能
COLUM:
MOV AL,CH
MOV DX,MY8255_A
OUT DX,AL
MOV DX,MY8255_C
IN AL,DX
L1:TEST AL,01H
JNZ L2
MOV AL,00H
JMP KCODE
L2:TEST AL,02H
JNZ L3
MOV AL,04H
JMP KCODE
L3:TEST AL,04H
JNZ L4
MOV AL,08H
JMP KCODE
L4:TEST AL,08H
JNZ NEXT
MOV AL,0CH
KCODE:ADD AL,CL
CALL PLAY
PUSH AX
KON:CALL DALLY
CALL CCSCAN
JNZ KON
POP AX
JMP BEGIN1
六.源程序清单
I0Y0 EQU 06C0H
MY8254_COUNT0 EQU I0Y0+00H
MY8254_COUNT1 EQU I0Y0+02H
MY8254_COUNT2 EQU I0Y0+04H
MY8254_MODE EQU I0Y0+06H
MY8255_A EQU 0640H
MY8255_B EQU 0642H
MY8255_C EQU 0644H
MY8255_MODE EQU 0646H
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
FREQ_LIST DW 262H,294H,330H,349H,392H,440H,496H
DW 523H,587H,659H,698H,784H,880H,988H
DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_MODE
MOV AL,81H
OUT DX,AL
MOV DX,MY8254_MODE
MOV AL,36H
OUT DX,AL
BEGIN1:
CALL CCSCAN
JNZ INK1
JMP BEGIN1
INK1:
CALL CCSCAN
JNZ INK2
JMP BEGIN1
INK2:MOV CH,0FEH
MOV CL,00H
COLUM:
MOV AL,CH
MOV DX,MY8255_A
OUT DX,AL
MOV DX,MY8255_C
IN AL,DX
L1:TEST AL,01H
JNZ L2
MOV AL,00H
JMP KCODE
L2:TEST AL,02H
JNZ L3
MOV AL,04H
JMP KCODE
L3:TEST AL,04H
JNZ L4
MOV AL,08H
JMP KCODE
L4:TEST AL,08H
JNZ NEXT
MOV AL,0CH
KCODE:ADD AL,CL
CALL PLAY
PUSH AX
KON:CALL DALLY
CALL CCSCAN
JNZ KON
POP AX
JMP BEGIN1
NEXT:INC CL
MOV AL,CH
TEST AL,08H
JZ KERR
ROL AL,1
MOV CH,AL
JMP COLUM
KERR:JMP BEGIN1
CCSCAN:MOV AL,00H
MOV DX,MY8255_A
OUT DX,AL
MOV DX,MY8255_C
IN AL,DX
NOT AL
AND AL,0FH
RET
PLAY PROC
MOV AH,0
MOV SI,AX
SHL SI,1
MOV DX,0FH
MOV AX,4240H
DIV WORD PTR [SI]
MOV DX,MY8254_COUNT0
OUT DX,AL
MOV AL,AH
OUT DX,AL
RET
PLAY ENDP
DALLY PROC
D0:MOV CX,0010H
D1:MOV AX,02H
D2:DEC AX
JNZ D2
LOOP D1
DEC DL
JNZ D0
RET
DALLY ENDP
CODE ENDS
END START
展开阅读全文