
A43基于51单片机汇编语言梁祝音乐盒Proteus设计
用51单片机汇编语言做一个音乐盒,播放《梁祝》片段:每个音符在表里占三个字节——定时器高字节、低字节、音长,定时器1中断翻转P2.0和P2.7推动扬声器,主程序只管按节奏往下走表,走完从头再来。
一、设计实现功能
本设计功能简介:使用51单片机和汇编语言设计一个梁祝音乐盒的proteus仿真,要求以下功能:
1、使用汇编语言编写程序。
2、定时器1工作在方式1,按表中重装值产生不同频率的方波。
3、P2.0、P2.7两路输出驱动扬声器发声。
4、按表循环播放《梁祝》片段,播完自动重头开始。
二、资源汇总
1、仿真文件:Proteus工程,7.8和8.6两个版本都能直接打开。
2、程序文件:main.asm汇编源码,以及编译好的cx.hex。
3、修改日期小工具:购买资料后赠送,用于修改文件创建日期,下载地址在文章最后。
三、设计介绍
拿到压缩包之后先解压,没有解压软件的直接搜"压缩",下载解压软件后先解压文件,再运行仿真和程序。
图1 Proteus仿真总览

乐谱全部存在TAB这张表里,每三个字节一组:
`asm
TAB: DB 0FAH,15H,08H ;E4,音长8
DB 0FBH,05H,06H ;F4,音长6
DB 0FBH,8CH,02H ;G4,音长2
DB 0FCH,44H,04H ;A4,音长4
DB 0FCH,0ACH,02H ;B4,音长2
...
DB 0FFH,0FFH ;结束标志`
前两个字节是定时器的重装值,第三个字节是这个音要持续多少个基本单位。查一下表就能看出音高怎么来的:
| 表值 | 十进制 | 半周期 | 频率 | 音名 |
| 0FA15H | 64021 | 1515微秒 | 330Hz | E4 |
| 0FB05H | 64261 | 1275微秒 | 392Hz | G4 |
| 0FB8CH | 64396 | 1140微秒 | 439Hz | A4 |
| 0FC44H | 64580 | 956微秒 | 523Hz | C5 |
| 0FCACh | 64684 | 852微秒 | 587Hz | D5 |
| 0FD09H | 64777 | 759微秒 | 659Hz | E5 |
| 0FD82H | 64898 | 638微秒 | 784Hz | G5 |
| 0FE22H | 65058 | 478微秒 | 1046Hz | C6 |
规律很明确:重装值 = 65536 - 500000÷频率。想加新歌,按这个公式把简谱上每个音的频率算成重装值填进表里即可。
主循环是一个"取音高、取音长、延时"的三段式:
`asm
LOOP: CLR A
MOVC A,@A+DPTR
MOV R1,A ;高字节
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R0,A ;低字节
ORL A,R1
JZ XZF ;两个都是0,是休止符
MOV A,R0
ANL A,R1
CJNE A,#0FFH,NEXT ;两个都是FF,是曲子结束
SJMP MAIN ;回到开头重播
NEXT: MOV TH1,R1
MOV TL1,R0
SETB TR1 ;起振`
这里用了两个巧妙的判断:两个字节相或为0就是休止符(停振但继续走表),两个字节相与等于0FFH就是结束标志(跳回开头)。用数据本身当控制码,表里不用另设标志字节。
音长由第三个字节控制,单位是D130子程序的执行时间。D130是三层循环:内层200次、外层160次,每次4个机器周期,合计128000个机器周期,12MHz下约128毫秒。所以音长值8代表1秒,值2代表0.25秒——曲子里的四分音符填8、八分音符填4、十六分音符填2。
定时器1中断里没有别的活,就是把重装值再写一遍然后翻转两个引脚:
`asm
TIM1: MOV TH1,R1
MOV TL1,R0
CPL P2.0 ;两路同时翻转
CPL P2.7
RETI`
两路一起翻,是因为仿真里扬声器接在P2.0、P2.7之间做差分驱动,两脚反相,声压翻倍;只接一路也能响,另一路就当备用。
特别注意: 声音发闷或者只有一个音,先查MOV TH1,R1有没有写进中断——方式1不自动重装,漏了这一句会一直响同一个音;曲子放到一半卡住,检查结束标志,两个字节必须都是0FFH才认结束,写成0FFH、00H会被当成正常音符;节奏整体偏慢,D130是按12MHz算的,换成11.0592MHz时基变长,音长要按比例改小;想要音量可调,P2.0外接三极管驱动扬声器,直接带喇叭电流不够;换歌时表尾一定要补0FFH,0FFH,否则程序会顺着往下读到程序区。
四、日期修改
资料中提供修改日期的小工具,购买资料赠送修改文件创建日期的小工具,三个下载地址都在文章最后。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

