最近做毕业设计。 用单片机设计一个单子琴 在网上找个份程序 但看不懂 希望好心人帮我注释下 谢谢 !急

org 0000h
orl p1,#11111111B
orl p3,#11111111B
test: jnb p3.2,SOL
jnb p3.1,LAL
jnb p3.0,SIL
jnb p1.7,DO
jnb p1.6,RE
jnb p1.5,MI
jnb p1.4,FA
jnb p1.3,SO
jnb p1.2,LA
jnb p1.1,SI
jnb p1.0,DOH
ajmp test

SOL: mov r6,#170
ajmp output
LAL: mov r6,#150
ajmp output
SIL: mov r6,#134
ajmp output
DO: mov r6,#126
ajmp output
RE: mov r6,#113
ajmp output
MI: mov r6,#100
ajmp output
FA: mov r6,#95
ajmp output
SO: mov r6,#85
ajmp output
LA: mov r6,#75
ajmp output
SI: mov r6,#67
ajmp output
DOH: mov r6,#63

output: clr p3.7
acall delay
setb p3.7
acall delay
ajmp test

delay: mov B,r6
dl: mov r7,#6
djnz r7,$
djnz r6,dl
mov r6,b
ret
end

;这是一个声音测试程序,P1和P30、P31接按键,按哪个就发出相应的声音(低音5到高音1)
org 0000h
orl p1,#11111111B ;按键初始化
orl p3,#11111111B ;按键初始化
test: jnb p3.2,SOL ;P3.2是低音5
jnb p3.1,LAL ;P3.1是低音6
jnb p3.0,SIL ;P3.0是低音7
jnb p1.7,DO ;P1.7是音1
jnb p1.6,RE ;P1.6是音2
jnb p1.5,MI ;P1.5是音3
jnb p1.4,FA ;P1.4是音4
jnb p1.3,SO ;P1.3是音5
jnb p1.2,LA ;P1.2是音6
jnb p1.1,SI ;P1.1是音7
jnb p1.0,DOH ;P1.0是高音1
ajmp test

SOL: mov r6,#170 ;发低音5,将延时170装入寄存器
ajmp output ;跳转至蜂鸣器程序
LAL: mov r6,#150 ;发低音6,将延时150装入寄存器
ajmp output
SIL: mov r6,#134
ajmp output
DO: mov r6,#126
ajmp output
RE: mov r6,#113
ajmp output
MI: mov r6,#100
ajmp output
FA: mov r6,#95
ajmp output
SO: mov r6,#85
ajmp output
LA: mov r6,#75
ajmp output
SI: mov r6,#67
ajmp output
DOH: mov r6,#63
;以下为蜂鸣器程序
output: clr p3.7 ;P37接蜂鸣器一类的,发出音调
acall delay ;延时
setb p3.7 ;关闭蜂鸣器,等待延时结束
acall delay
ajmp test

delay: mov B,r6 ;蜂鸣器延时,延时不同,发出的音调就不同。
dl: mov r7,#6
djnz r7,$
djnz r6,dl
mov r6,b
ret ;返回
end
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-29
对扬声器输出 方波,就可以播放出声音。
方波脉冲 宽度不同,频率就不同。
程序中,用R6的数值,控制脉冲宽度的延时时间,从而就控制了输出频率。
程序中,通过按键检测,为R6送进去不同的数值,最终即可听到不同的音调。
只是使用这种简单的方法,恐怕跑调比较严重。本回答被提问者采纳