51汇编:分析一段别人写的音乐播放的程序---------他人即地狱

前言

人总是会浪费时间去下载各种资源,于是不知道什么时候我电脑里多了这么一段折磨人的代码。

看了下,其中有几个我没有使用过的指令,JZ、JB、JNZ、DW等。所以,还是把这个骨头给啃下吧!

兰花草

可以自己先听听。感觉好老啊,我小时候都没听过。

链接:https://pan.baidu.com/s/113viGAEdxuaJqDABw9wmXg 提取码:abnu
复制这段内容后打开百度网盘手机App,操作更方便哦

代码70行左右,应该是使用的是T0定时器、查表的知识来操纵蜂鸣器发声。
按照惯例,先把全部代码放出来。

;兰花草音乐播放程序
;P1.6是喇叭输出端口,用杜邦线连接到J42插针 B1针脚,喇叭即播放音乐
org 00h
jmp start
org 0bh
jmp tim0
start:;JB P3.7,$   ;检测该口的按键是否按下?
      mov tmod,#01h
      mov ie,#82h
start0:mov 30h,#00
next:mov a,30h
     mov dptr,#table
     movc a,@a+dptr
     mov r2,a
     jz end0
     anl a,#0fh
     mov r5,a
     mov a,r2
     swap a
     anl a,#0fh
     jnz sing
     clR tr0
     jmp d1
sing:dec a
     mov 22h,a
     rl a
     mov dptr,#table1
     movc a,@a+dptr
     mov th0,a
     mov 21h,a
     mov a,22h
     rl a
     inc a
     movc a,@a+dptr
     mov tl0,a
     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 P1.6       ;由该口输出音频数据;可以更改口线
       POP PSW
       pop acc
       reti
  delay:mov r7,#02
    d2:mov r4,#125
    d3:mov r3,#248
    djnz r3,$
    djnz r4,d3
    djnz r7,d2
    djnz r5,delay
    ret
 table1:
       dw 64021,64103,64260,64400
       dw 64524,64580,64684,64777
       dw 64820,64898,64968,65030
       dw 64934
 table:db 42h,82h,82h,82h,84h,02h,72h
       db 62h,72h,62h,52h,48h
       db 0b2h,0b2h,0b2h,0b2h,0b4h,02h,0a2h
       db 12h,0a2h,0d2h,92h,88h
       db 82h,0b2h,0b2h,0a2h,84h,02h,72h
       db 62h,72h,62h,52h,44h,02h,12h
       db 12h,62h,62h,52h,44h,02h,82h
       db 72h,62h,52h,32h,48h
       db 00h
  


table表的高4位表示查表table1的索引,table低4位表示延时的"几个delay"。所以table的数据还是比较随意的!!!
比如42h,2表示延时"两个delay",4表示找table表第4个数据。

table1每个数据都是两个字节,高8位放TH0的初值,低8位放TL0的初值。
每次查表的时候,步进两个字节,a需要翻倍。然后低8位的寻址就是在之前的翻倍基础上,再步进一个字节。——所以,一般用十六进制写表就行,换成10进制不直观。

64021(FA15),64103(FA67),64260(FB04),64400(FB90)
64524(FC0C),64580(FC44),64684(FCAC),64777(FD09)
64820(FD34),64898(FD82),64968(FDC8),65030(FE06)
64934(FDA6)
  • table里放的两个字节的数据表示的意思是音符和节拍(大概),仅仅几个音符对应着table1里的初值,节拍表示这个音发的时间。

程序流程解释:

在这里插入图片描述


因为我的单片机是P15口以及接好了蜂鸣器,所以把P1.6改成P1.5就能运行。但是一个音调很难听。


代码规范

代码写的不规整,过了一段时间连自己也看不懂。
第一点看的不舒服的问题就是她写的每行有标号的那行后面都接上了别的句子。
所以,标号就放一行。
第二点就是大小写混用。
要用就全用小写。
第三点不写注释,看得真是不舒服。这东西写出来看着真难受。
注释,每个函数和较难理清的部分、标号处需要清晰的注释。
第四点变量、标号的命令不直观,什么d0,d1,d2。
当然,这世界上有更丑的命名方式——看同学二级备考的试题,那个大题里的变量命名大都是__1__ 这种东西你信吗!
标号用小写单词或拼音,变量自己重命名为单词或拼音。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念心科道尊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值