- 只有音乐发声汇编程序,没有加入LED灯,供参考。数据代码已改为小星星发声
- ;**********************************************
- ORG 0000H
- SJMP MAIN
- ORG 0BH
- AJMP TIME0
- ;*************主程序************************
- MAIN: MOV SP,#60
- MOV TMOD,#01H ;T0定时工作方式
- MOV IE,#82H ;CPU 中断允许,T0中断允许
- START0: MOV 30H,#00H ;TABLE 相对地址指针
- NEXT: MOV A,30H
- MOV DPTR,#TABLE ;到TABLE处取 简谱码 节拍 码
- MOVC A,@A+DPTR
- MOV R2,A ;取到的简谱码 节拍码 暂存于R2中
- JZ ENDF ;取到 00 结束
- ANL A,#0FH ;否,取低四位 节拍 码
- MOV R5,A ;将节拍码存于R5中
- MOV A,R2 ;简谱码 节拍 码 给A
- SWAP A ;高4位 与 低4位 交换
- ANL A,#0FH ;取简谱 码
- JNZ SING ;取到的简谱 码不是0,则去发声
- CLR TR0 ;取到0 则不发声
- SJMP DLY1 ;节拍延时子程序( 随节拍码变化,延时时间不同)
- ;---------------发声-----------------------
- SING: DEC A ;取到的简谱码减1
- ;(简谱码计数值16位数据存储首地址从TABLE1 《相对地址》0处开始放起,所以要减1)
- MOV 22H,A ;存入(22H)中
- RL A ;乘2 因为取的数据占两字节(16位)
- ;所以指针增加量要乘2
- MOV DPTR,#TABLE1
- ;...........简谱码转换为相应定时器16位计数值.............
- MOVC A,@A+DPTR ;到TABLE1取相应的高字节计数值
- MOV TH0,A ;高字节计数值存入TH0和(21H)中
- MOV 21H,A
- MOV A,22H ;减1的简谱码给A
- RL A ;乘2 因为取的数据占两字节(16位)
- ;所以指针增加量要乘2
- INC A ;A 增加 取下一个字节计数值
- ;...........简谱码转换为相应定时器16位计数值.............
- MOVC A,@A+DPTR ;到TABLE1取相应的低字节计数值
- MOV TL0,A ;低字节计数值存入TL0和(20H)中
- MOV 20H,A
- SETB TR0 ;启动T0定时器让喇叭发出不同频率声音
- ;---------------节拍延时-------------------
- DLY1: ACALL DELAY ;基本单位时间为1/4拍 187ms
- INC 30H ;取下一个简谱码 节拍 码
- SJMP NEXT
- ;---------------歌放完结束---------------
- ENDF: CLR TR0 ;关闭T0定时器
- AJMP START0 ;反复循环
- ;****T0中断子程序(用来驱动喇叭发出不同频率声音)**************
- TIME0: PUSH ACC
- PUSH PSW
- MOV TL0,20H ;重装计数值
- MOV TH0,21H
- CPL P3.7 ;驱动发声
- POP PSW
- POP ACC
- RETI
- ;******************节拍延时187ms****************************
- DELAY: MOV R7,#187 ;187ms延时子程序
- DLY2: MOV R4,#02
- DLY3: MOV R3,#248
- DJNZ R3,$
- DJNZ R4,DLY3
- DJNZ R7,DLY2
- DJNZ R5,DELAY
- RET
- ;*******音符T值表(用来让定时器发出不同的频率)**DW 表示一个 计数值 占两个字节存储单元***************
- TABLE1: DW 64260,64400,64524,64580,64684 ;低音SO 低音LA 低音SI /中音DO 中音RE
- DW 64777,64820,64898,64968,65030 ;中音MI 中音FA 中音SO 中音LA 中音SI
- DW 65058,65110,65157,65178,65217 ;高音DO 高音RE 高音MI 高音FA 高音SO
- ;*********简谱码 节拍码(高4位简谱码 ,低4位节拍码)*************
- TABLE: DB 44H,44H,84H,84H ; 1 1 5 5
- DB 094H,094H,88h ; 6 6 5 -
- DB 74H,74H,63H,63H ; 4 4 3 3
- DB 52H,52H,48h ; 2 2 1-
- DB 84H,84H,74H,74H ; 5 5 4 4
- DB 64H,64H,58h ; 3 3 2-
- DB 84H,84H,74H,74H ; 5 5 4 4
- DB 64H,64H,58h ; 3 3 2-
- DB 44H,44H,84H,84H ; 1 1 5 5
- DB 094H,094H,88h ; 6 6 5 -
- DB 74H,74H,63H,63H ; 4 4 3 3
- DB 52H,52H,48h ; 2 2 1-
- END
复制代码
|