📄 yy.asm
字号:
;单片机音乐编程实验
;通过单片机发出音乐声,我们的系统发出来的是梁祝的片断
;用户可以参照后面的提示自己谱曲
;输入自己的音乐数据,播放自己的音乐
musich equ 40h ;音乐定时高位数据
musicl equ 41h ;音乐定时低位数据
musicstart equ 42h ;音乐开始首地址
beep bit p1.0 ;蜂鸣器定义
; ************************ 预定义结束 *******************
ORG 0000h ;程序开始
Ajmp main ;跳转到主程
org 1bh ;定时器T1中断入口地址
Ajmp TIMM ;定时器服务程序
org 030h ;主程序代码开始
main: mov sp,#30h ;设置堆栈
lcall music ;调用音乐程序
AJMP main ;重新开始
musdelay:mov r0,#10 ;短时间延时
coss: djnz r0,coss ;延时时间 20 uS
ret ;返回
; ************ 定时器 服务程序 *******************8
TIMM: CLR TR1 ;停止定时器工作
mov th1,musich ;重新设置定时初值
mov tl1,musicl ;
SETB beep ;从蜂鸣器输出声音
setb tr1 ;开始定时工作
reti ;中断返回
;****************************************************
;************ 音乐播放程序 *********************
music: mov tmod,#10h ;设置定时器T1工作方式1
setb ea ;总的中断
setb et1 ;定时器T1中断允许
mov musicstart,#00h ;音乐开始地址
mov musich,#0ffh ;音乐定时常数高位
mov musicl,#0ffh ;音乐定时常数低位
loopm: mov dptr,#mu_tab ;得到音符表头
mov a,musicstart ;开始查表
movc a,@a+dptr ;获得音乐数据
jz musend ;结束符 00H,返回
rl a ;A*2
mov b,a ;暂存地址
mov dptr,#mustab ;获得音符表头
movc a,@a+dptr ;根据音乐数据查得定时常数
mov musich,a ;保存定时常数高位
mov th1,a ;设置定时器高位常数
mov a,b ;开始找低位数据
inc a ;指向下一个数据
mov dptr,#mustab ;得到音符表头
movc a,@a+dptr ;查得低位数据
mov musicl,a ;保存数据
mov tl1,a ;设置定时低位常数
setb tr1 ;定时器T1开始工作
mov dptr,#mu_tab ;得到音乐表
inc musicstart ;指向下一个单元(音符节拍)
mov a,musicstart ;开始查找
movc a,@a+dptr ;找到数据
lcall delay1 ;根据参数延时,发出持续音乐
inc musicstart ;指向下一个音
clr tr1 ;停止发声
lcall delay
Ajmp loopm ;重复,直到遇到结束符号 00H.
musend: clr tr1 ;乐曲播放完毕,关闭定时器
clr ea ;禁止中断
clr et1 ;关闭定时器T1中断
SETB beep ;禁止蜂鸣器
mov a,#20
lcall delay1
ret
;*********************
;************ 节拍发生器 ,产生音乐节拍 *********************************
delay1: mov r0,#00h ;节拍发生器,用来发生节拍
mov r1,#00h ;
mov r2,a ;这是节拍发生器的参数,当它为8
mov b,#2
div ab
mov r2,a
dlay1: djnz r0,dlay1 ;表示1拍
mov r0,#00h
djnz r1,dlay1
mov r0,#00h
mov r1,#00h
djnz r2,dlay1
ret
; ————————————————————
; ******** 延时 产生休止符 *****************
delay: mov r0,#100 ;延时 10ms
mov r1,#50
dlay: djnz r0,dlay
mov r0,#100
djnz r1,dlay
ret
; ************************
; ************************曲谱编码,这是定义的曲谱表,对应如下 **************************************************
mustab: db 'h','j', 0f8h,8bh,0f9h,5bh,0fah,14h,0fah
DB 0ch,0fbh,03h,0fbh,8fh,0fch,0bh
db 0fch,43h,0fch,0abh,0fdh,08h,0fdh,33h
DB 0fdh,81h,0fdh,0c7h,0feh,05h
db 0feh,21h,0feh,55h,0feh,84h,0fdh,99h
DB 0feh,0c0h,0feh,0e3h,0ffh,02h
;以下为音乐乐谱代码,前两位表示曲谱,后一位表示节拍
;8为 1 拍,4 ->半拍
;例子 1----2-- 3 -
; ^ ^ ^ ^ ^ ^
;对应 1,8, 2,4,3,1
mu_tab: db 6,4,8,4,10,4,1,4,9,8,8,4,7,4,10,8,9,8,6,16
db 8,4,10,4,12,4,12,4,13,8,12,4,11,4,10,16
db 00h
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -