📄 sound.asm
字号:
;========================================================================
; 文件名称: Sound.ASM
; 功能描述: 电子发声实验. 利用定时器/计数器演奏音乐.
; 乐曲: 友谊天长地久 B调 四分之二拍
;========================================================================
VALH DATA 31H
VALL DATA 30H
FCOUNT DATA 32H ;频率表计数器
TCOUNT DATA 33H ;时间表计数器
ORG 0000H
LJMP START
ORG 000BH
LJMP T0ISR
ORG 0100H
START: MOV TMOD, #01H ;初始化定时器T0
MOV IE, #82H
SETB TR0 ;启动定时器T0
MLP1: MOV FCOUNT, #00H ;演奏顺序
MOV TCOUNT, #00H
MLP2: MOV DPTR, #FREQ ;频率表首地址
MOV A, FCOUNT
MOVC A, @A+DPTR ;查表
MOV R6, A ;除数高位
CJNE R6, #00H, MLP3 ;判0, 0表示一遍演奏结束
INC FCOUNT
MOV A, FCOUNT
MOVC A, @A+DPTR
MOV R7, A
CJNE R7, #00H, MLP4
AJMP MLP1 ;R6R7=0 结束一遍演奏
MLP3: INC FCOUNT
MOV A, FCOUNT
MOVC A, @A+DPTR
MOV R7, A ;R6R7中不为0, 作为除数
MLP4: MOV R2, #00H ;被除数(CLK)
MOV R3, #07H
MOV R4, #00H
MOV R5, #00H
LCALL DIV42 ;调用除法程序
CLR C
MOV A, #0FFH
SUBB A, R3
MOV VALL, A ;计数初值低位
MOV A, #0FFH
SUBB A, R2
MOV VALH, A ;计数初值高位
MOV TH0, VALH ;装入计数初值
MOV TL0, VALL
MOV A, TCOUNT
MOV DPTR, #TIME ;得到时间表
MOVC A, @A+DPTR
MOV R4, A ;[R4]次延时
MLP5: LCALL DELAY
DJNZ R4, MLP5
INC FCOUNT
INC TCOUNT
LJMP MLP2 ;继续下一音符的演奏
;定时器0中断程序
T0ISR: CPL P0.0
MOV TH0, VALH ;重装计数初值
MOV TL0, VALL
RETI
;(R2R3R4R5)/(R6R7)--(R2R3)
;影响资源: PSW, A, B, R1~R7
DIV42: CLR C ;比较被除数和除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;计算双字节商
DVD2: CLR C ;部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;计算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;结果判断
JC DVD3
MOV R2,A ;够减,存放新的余数
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)
MOV A,R4 ;将商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;设立成功标志
RET
;单位延时
DELAY: MOV R7, #0E0H
DLP1: MOV R6, #0F0H
DLP2: DJNZ R6, DLP2
DJNZ R7, DLP1
RET
;频率表
FREQ: DW 371,495,495,495,624,556,495,556,624
DW 495,495,624,742,833,833,833,742,624
DW 624,495,556,495,556,624,495,416,416
DW 371,495,833,742,624,624,495,556,495
DW 556,833,742,624,624,742,833,990,742
DW 624,624,495,556,495,556,624,495,416
DW 416,371,495,0
;时间表
TIME: DB 4, 6, 2, 4, 4, 6, 2, 4, 4, 6
DB 2, 4, 4,12, 1, 3, 6, 2, 4, 4
DB 6, 2, 4, 4, 6, 2, 4, 4,12, 4
DB 6, 2, 4, 4, 6, 2, 4, 4, 6, 2
DB 4, 4,12, 4, 6, 2, 4, 4, 6, 2
DB 4, 4, 6, 2, 4, 4,12
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -