前言
人总是会浪费时间去下载各种资源,于是不知道什么时候我电脑里多了这么一段折磨人的代码。
看了下,其中有几个我没有使用过的指令,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__ 这种东西你信吗!
标号用小写单词或拼音,变量自己重命名为单词或拼音。