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

📄 yy.asm

📁 单片机音乐编程源代码。
💻 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 + -