📄 ex5-9.sdi
字号:
,,, ORG 0000H ;复位地址
0000,02 00 30,, LJMP MAIN ;跳转到主程序
,,, ORG 000BH ;T0中断入口
000B,02 00 74,, LJMP TIM0 ;跳转到T0中断服务程序
,,, ORG 0030H ;主程序入口地址
0030,75 89 01,MAIN,MAIN: MOV TMOD,#01H ;写入T0控制字, 16位定时方式
0033,75 A8 82,, MOV IE,#82H ;开中断
0036,75 30 00,, MOV 30H,#00H ;取简谱码指针
0039,E5 30,NEXT,NEXT: MOV A,30H ;简谱码指针装入A
003B,90 00 B2,, MOV DPTR,#TABLE ;从TABLE处取简谱码
003E,93,, MOVC A,@A+DPTR
003F,FA,, MOV R2,A ;取得的简谱码暂存于R2
0040,60 2D,, JZ END0 ;是否取到结束码00H?
0042,54 0F,, ANL A,#0FH ;不是,则取节拍码
0044,FD,, MOV R5,A ;节拍码存于R5
0045,EA,, MOV A,R2 ;将简谱码装入A
0046,C4,, SWAP A ;高、低4位交换
0047,54 0F,, ANL A,#0FH ;取音符码
0049,70 05,, JNZ SING ;取得的音符码是否为0?
004B,C2 8C,, CLR TR0 ;是则不发音
004D,02 00 67,, lJMP D1 ;跳转到D1
0050,14,SING,SING: DEC A ;取得的音符码减1(不含0)
0051,F5 22,, MOV 22H,A ;存入22H单元
0053,23,, RL A ;乘2
0054,90 00 94,, MOV DPTR,#TABLE1 ;到TABLE1中取相对的高位字节值
0057,93,, MOVC A,@A+DPTR
0058,F5 8C,, MOV TH0,A ;取得的高位字节装入TH0和21H单元
005A,F5 21,, MOV 21H,A
005C,E5 22,, MOV A,22H ;再装入取得的音符码
005E,23,, Rl A ;乘2
005F,04,, INC A ;加1
0060,93,, MOVC A,@A+DPTR ;到TABLE1中取相对的低位字节值
0061,F5 8A,, MOV TL0,A ;取得的高位字节装入TL0和20H单元
0063,F5 20,, MOV 20H,A
0065,D2 8C,, SETB TR0 ;启动T0
0067,12 00 85,D1,D1: LCALL DELAY ;基本单位时间1/4拍,延时187毫秒
006A,05 30,, INC 30H ;取简谱码指针加1
006C,02 00 39,, LJMP NEXT ;取下一个码
006F,C2 8C,END0,END0: CLR TR0 ;停止T0
0071,02 00 30,, LJMP MAIN ;重复循环
,,,
,,,;定时器T0中断服务程序:
0074,C0 E0,TIM0,TIM0: PUSH ACC ;保护现场
0076,C0 D0,, PUSH PSW
0078,85 20 8A,, MOV TL0,20H ;重设定时初值
007B,85 21 8C,, MOV TH0,21H
007E,B2 90,, CPL P1.0 ;P1.0引脚电平取反
0080,D0 D0,, POP PSW ;恢复现场
0082,D0 E0,, POP ACC
0084,32,, RETI ;中断返回
,,,
,,,;基本单位延时子程序:
0085,7F 02,DELAY,DELAY: MOV R7,#02H ;fosc=12MHz时延时187毫秒
0087,7C BB,D2,D2: MOV R4,#187
0089,7B F8,D3,D3: MOV R3,#248
008B,DB FE,, DJNZ R3,$
008D,DC FA,, DJNZ R4,D3
008F,DF F6,, DJNZ R7,D2
0091,DD F2,, DJNZ R5,DELAY ;决定节拍
0093,22,, RET
,,,
,,,;音符对应的定时器初值表:
0094,FB 04 FB 90,TABLE1,TABLE1: DW 64260,64400,64521,64580
009C,FC AC FD 09,, DW 64684,64777,64820,64898
00A4,FD C8 FE 06,, DW 64968,65030,65058,65110
00AC,FE 85 FE 9A,, DW 65157,65178,65217
,,,
,,,;音符节拍表:
00B2,,TABLE,TABLE: ;1
00B2,82 01 81 94,, DB 82H,01H,81H,94H,84H
00B7,B4 A4 04,, DB 0B4H,0A4H,04H
00BA,82 01 81 94,, DB 82H,01H,81H,94H,84H
00BF,C4 B4 04,, DB 0C4H,0B4H,04H
,,, ;2
00C2,82 01 81 F4,, DB 82H,01H,81H,0F4H,0D4H
00C7,B4 A4 94,, DB 0B4H,0A4H,94H
00CA,E2 01 E1 D4,, DB 0E2H,01H,0E1H,0D4H,0B4H
00CF,C4 B4 04,, DB 0C4H,0B4H,04H
,,, ;3
00D2,82 01 81 94,, DB 82H,01H,81H,94H,84H
00D7,B4 A4 04,, DB 0B4H,0A4H,04H
00DA,82 01 81 94,, DB 82H,01H,81H,94H,84H
00DF,C4 B4 04,, DB 0C4H,0B4H,04H
,,, ;4
00E2,82 01 81 F4,, DB 82H,01H,81H,0F4H,0D4H
00E7,B4 A4 94,, DB 0B4H,0A4H,94H
00EA,E2 01 E1 D4,, DB 0E2H,01H,0E1H,0D4H,0B4H
00EF,C4 B4 04,, DB 0C4H,0B4H,04H
00F2,00,, DB 00H
000E,,, END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -