8086+8255A+8253实现电子琴Proteus仿真
仿真截图
代码
CODE SEGMENT
DATA SEGMENT
KEY2F DB 0,38,34,30,29,26,23,20,19
;262, 294, 330, 347, 392, 440, 494, 524;均采用低音
;计算方式为1/f/0.1ms
KEY DB 1,2,3,5,3,2,1,6,1,3,5,2,1,2,9
DB 3,3,3,3,1,2,3,5,3,2,1,6,1,9
DB 3,5,2,7,6,6,6,6,1,6,2,3,5,3,6,9
DB 2,1,1,6,1,6,2,3,6,5,2,3,3,3,6,1,9
DB 6,2,3,5,3,6,2,1,1,6,1,5,2,6,5,9
DB 6,6,6,6,1,3,2,3,5,3,6,2,1,1,6,1,10
PORT0 EQU 288H
PORT1 EQU 28AH
PORT2 EQU 28CH
PORTCTL3 EQU 28EH
PORTA EQU 280H
PORTB EQU 282H
PORTC EQU 284H
PORTCTL5 EQU 0286H
DATA ENDS
MAIN PROC FAR
START:
ASSUME CS:CODE,DS:DATA;段分配
MOV AX, DATA
MOV DS, AX
MOV SI, 0
BEG:
MOV BX, OFFSET KEY2F;求音阶对应频率、初值
MOV AL, KEY[SI]
CMP AL, 9
JNZ NEXT1
CALL DELAY
CALL DELAY
CALL DELAY
NEXT1:
CMP AL, 10
JE EXIT
XLAT
MOV KEY[SI], AL
MOV DX, PORTCTL3;写8254
MOV AL, 00010110B;00端口 写低字节 方式3 2进制计数
OUT DX, AL
MOV DX, PORT0
MOV AL, KEY[SI]
OUT DX, AL
MOV DX, PORTCTL5;写8255A
MOV AL, 10001011B;A口输出其他输入
OUT DX, AL
MOV DX, PORTA;开喇叭
MOV AL, 03H
OUT DX, AL
CALL DELAY
MOV DX, PORTA;关喇叭
MOV AL, 00H
OUT DX, AL
INC SI
JMP BEG
EXIT:
;MOV AH, 4CH
;INT 21H
MAIN ENDP
DELAY PROC NEAR;延时函数
PUSH SI
PUSH CX
MOV SI, 1
DELAYNEXT1:
MOV CX, 0FFFFH
DELAYNEXT2:
LOOP DELAYNEXT2
DEC SI
JNZ DELAYNEXT1
POP CX
POP SI
RET
DELAY ENDP
CODE ENDS
END MAIN
实现过程
8086控制,每次循环取一个音阶对应的8253计数初始值,然后写入8253,然后通过8255A控制8253开始产生对应频率方波,然后通过喇叭产生声音。
一轮循环结束后,取下一个音阶对应的初始值,周而复始。
实际效果
电子琴演示