⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex5-9.sdi

📁 《单片机原理实用教程——基于Proteus虚拟仿真》一书的配套光盘
💻 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 + -