51单片机汇编语言音乐盒

采用汇编语言,设计可以上下切换和暂停的音乐盒。该音乐盒一共有四首midi音乐,分别是《两只蝴蝶》,《祝你平安》、《两只老虎》、《猪八戒背媳妇》,直接上程序。

/******利用汇编语言设计的音乐盒 ******/
//一共有四首歌曲,可以通过下一曲,上一曲调整播放顺序***
//设置了暂停按键************/
//作者ydk,2024.5.9 
//******fosc=11.0592MHz******************

/******利用汇编语言设计的音乐盒 ******/
//一共有四首歌曲,可以通过下一曲,上一曲调整播放顺序***
//设置了暂停按键************/
//作者ydksummer,2024.5.9 
//******fosc=11.0592MHz******************

JIA BIT  P3.2				;下一曲
JIAN BIT  P3.3				;上一曲
ZT BIT  P3.4				;暂停键
FLAG BIT 21H.0			    ;调整标志位
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INIT0
ORG 000BH
AJMP TIM0
org 0013h
ajmp INIT1 
ORG 001BH
AJMP TIM1
ORG 0030H
MAIN:
MOV TMOD,#11H
MOV TL1,#0CDH		;设置定时时间为62ms	
MOV TH1,#020H
SETB IT0
SETB EX0
SETB IT1
SETB EX1
SETB EA
SETB ET0
SETB ET1
SETB TR1
MOV R1,#0		  ;控制取节拍还是频率
MOV 20H,R1		  ;20H保存频率位置,查表求频率
MOV R2,#0		  ;保存节拍
mov r7,#0		  ;歌曲演奏计数器
MOV DPTR,#TIME	   ;初始演奏第一首歌曲
MOV R5,DPH		  
使用汇编语言实现51单片机数字音乐盒,以下为相关说明: ### 实现思路 在51单片机数字音乐盒中,以单片机作为主控核心,结合键盘、扬声器等模块组成主控制模块。利用汇编语言进行编程,实现对音乐播放的控制,如播放、暂停、切换曲目等功能。同时,可设置多个按键,如8个普通按键、复位按键、暂停按键、下一曲和上一曲按键等,以实现不同的操作。 ### 示例代码 ```asm ; 51单片机汇编语言音乐盒示例代码 ; 一共有四首曲,可以通过下一曲,上一曲调整播放顺序 ; 设置了暂停按键 ; fosc = 11.0592MHz ; 定义常量 FREQ EQU 11059200 ; 晶振频率 SONG_NUM EQU 4 ; 曲数量 ; 定义变量 ORG 0000H LJMP MAIN ; 中断服务程序 ORG 000BH ; T0中断入口 LJMP TIMER0_ISR ; 主程序 ORG 0030H MAIN: ; 初始化定时器0 MOV TMOD, #01H ; 设置定时器0为模式1 MOV TH0, #HIGH(65536 - FREQ / 12 / 1000) ; 定时1ms MOV TL0, #LOW(65536 - FREQ / 12 / 1000) SETB ET0 ; 使能定时器0中断 SETB EA ; 全局中断使能 SETB TR0 ; 启动定时器0 ; 初始化曲索引 MOV R0, #0 ; 当前曲索引 MAIN_LOOP: ; 检测按键 JB P1.0, NEXT_SONG ; 下一曲按键 JB P1.1, PREV_SONG ; 上一曲按键 JB P1.2, PAUSE_SONG ; 暂停按键 ; 播放当前曲 MOV A, R0 LCALL PLAY_SONG SJMP MAIN_LOOP ; 下一曲函数 NEXT_SONG: INC R0 CJNE R0, #SONG_NUM, NEXT_SONG_END MOV R0, #0 ; 回到第一首曲 NEXT_SONG_END: LCALL DELAY ; 消抖 JNB P1.0, $ ; 等待按键释放 RET ; 上一曲函数 PREV_SONG: DEC R0 CJNE R0, #0FFH, PREV_SONG_END MOV R0, #SONG_NUM - 1 ; 回到最后一首曲 PREV_SONG_END: LCALL DELAY ; 消抖 JNB P1.1, $ ; 等待按键释放 RET ; 暂停函数 PAUSE_SONG: CLR TR0 ; 停止定时器 LCALL DELAY ; 消抖 JNB P1.2, $ ; 等待按键释放 SETB TR0 ; 启动定时器 RET ; 播放曲函数 PLAY_SONG: ; 根据曲索引选择曲数据 MOV DPTR, #SONG_TABLE MOVC A, @A + DPTR ; 播放曲代码 ; ... RET ; 定时器0中断服务程序 TIMER0_ISR: MOV TH0, #HIGH(65536 - FREQ / 12 / 1000) ; 重新加载初值 MOV TL0, #LOW(65536 - FREQ / 12 / 1000) ; 音频输出处理代码 ; ... RETI ; 延时函数 DELAY: MOV R7, #200 DELAY_LOOP: MOV R6, #250 DELAY_LOOP2: DJNZ R6, DELAY_LOOP2 DJNZ R7, DELAY_LOOP RET ; 曲数据表 SONG_TABLE: DB 0, 1, 2, 3 ; 曲索引对应的曲数据 END ``` ### 代码说明 - **定时器初始化**:使用定时器0产生定时中断,用于控制音频输出的频率和节拍。 - **按键检测**:通过检测P1口的按键状态,实现下一曲、上一曲和暂停等功能。 - **曲播放**:根据曲索引从曲数据表中选择相应的曲数据进行播放。 - **定时器中断服务程序**:在定时器中断中进行音频输出处理,如设置扬声器的高低电平。 - **延时函数**:用于按键消抖,避免按键误触发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值