单片机开发音乐盒(生日快乐歌)

本文介绍了一个使用51单片机实现播放生日快乐歌的程序实例。该程序通过设定定时器的方式控制单片机发出特定频率的声音,实现了简单的音乐播放功能。通过查表确定音调和节拍,并在每次循环中更新定时器的初始值以产生正确的音符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

;P0.7小喇叭---生日快乐。

 ORG 0000H
 AJMP MAIN
 ORG 000BH
 JMP TIM0
 ORG 0030H
 
 ;主程序
   MAIN:MOV TMOD,#01H ;设定时方式
 MOV IE,#82H ;开中断
   START0:MOV 30H,#00H ;
   NEXT:MOV A,30H
 MOV DPTR,#TABLE
 MOVC A,@A+DPTR ;查表取音调和节拍
 MOV R2,A
 JZ END0 ;为零,不进行处理.
 ANL A,#0FH
 MOV R5,A ;将节拍存入R5
 MOV A,R2
 SWAP A
 ANL A,#0FH
 JNZ SING ;根据音调决定是否演奏.
 CLR TR0
 JMP D1
   SING:DEC A
 MOV 22H,A;将音调存入22H.
 RL A
 MOV DPTR,#TABLE1
 MOVC A,@A+DPTR ;根据音调决定定时器初值.
 MOV TH0,A ;放入TH0
 MOV 21H,A
 MOV A,22H
 RL A
 INC A
 MOVC A,@A+DPTR
 MOV TL0,A ;放入TL0
 MOV 20H,A
 SETB TR0 ;启动定时
     D1:CALL DELAY
 INC 30H
 JMP NEXT
   END0:CLR TR0
 JMP START0

 ;定时器中断服务程序
   TIM0:PUSH ACC
 PUSH PSW
 MOV TL0,20H ;重赋初值.
 MOV TH0,21H
 CPL P0.7
 POP PSW
 POP ACC
 RETI
 

DELAY:MOV R7,#02H ;延时子程序
 D2:MOV R4,#187
 D3:MOV R3,#248
 DJNZ R3,$
 DJNZ R4,D3
 DJNZ R7,D2
 DJNZ R5,DELAY
 RET

 ;决定音调的定时初值.
 TABLE1:DW 64260,64400,64524,64580
 DW 64684,64777,64820,64898
 DW 64968,65030,65058,65110
 DW 65157,65178,65217

 ;决定音调和节拍的表格,不同的歌曲只是此表不同

 TABLE:DB 82H,01H,81H,94H,84H,0B4H,0A4h,04H,82H,01H,81H,94H,84H,0C4H,0B4H,04H ;1
 DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H,0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H   ;2
 DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H,82H,01H,81H,94H,84H,0C4H,0B4H,04H         ;3
 DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H,0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00;4
 END

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值