OUT DX,AL
call singmi
call singmi call singfa call singso
call singso call singfa call singmi call singre
call singdo call singdo call singre call singmi call singmi
call singre
call singre
call delay
call singmi
;只延时,呈现长音效果36
call singmi call singfa call singso
call singso call singfa call singmi call singre
call singdo call singdo call singre call singmi call singre call singdo call singdo
call delay
call singre call singre call singmi
37
call singdo
call singre call singmis call singfas call singmi call singdo
call singre call singmis call singfas call singmi call singre call singdo call singre call singsod
call singmi call singmi call singfa call singso
38
call singso call singfa call singmi call singre
call singdo call singdo call singre call singmi call singre call singdo call singdo
mov ah,0bh int 21h OR AL,AL JNZ goon
jmp ini
goon: MOV DX,0E823H MOV AL,16H OUT DX,AL
;检测键盘缓冲区 ;退出前送出一个控制字,使音乐停止播放39
MOV AH,4CH
mov ax,4c00h ;返回DOS
int 21h ret
START ENDP
CODE ENDS END START
六、思考题:
写出8253计数初值、输入频率和输出频率的关系。
答:输出频率 = 输入频率 / 8253计数初值
七、实验心得与体会:
这次实验中我们学习使用了8253定时器,8253共有3个工作通道,每个通道有5种工作方式,在程序一开始应该将控制字送入控制寄存器以确定工作的通道和方式,在这次实验里主要是驱动蜂鸣器所以选择工作方式2。通过技术初值,输入频率和输出频率的关系计算出每个音符应该给工作通道送的计数初值,将计数初值送到工作通道的地址以实现蜂鸣器响。再通过改变不同的计数初值实现音乐播放。值得一提的是,我们在初步设计时候,没有考虑到可能有低音,但是由于我们选用了贝多芬的《欢乐颂》,这一旋律中出现了低音so,于是我们利用已有的中音do的频率是高音do频率的一半推测低音so是中音so频率的一半并且尝试写进了代码中,实际运行时证实了我们这么做的正确性。还有就是长短音也有出现,只要改变延迟时间即可。还有就是我们在实现时,增加了一个“暂停”的功能,为使得逻辑上方便编写代码,将这一部分的代码分配给了每个音阶的子程序中。在暂停期间,能使得蜂鸣器不发出声音,但是数码管仍然显示当前停止时的音阶数目,在编写这部分程序时,我们仔细推敲了逻辑过程,并且在调试时反复修改,最终获得了成功。
总之本次实验是微机原理硬件实验中代码最多,调试时间最长的一次,非常遗憾的是没有能够完成扩展功能。但是我们通过基本内容的实现编程能力已经得到了提高,举一反三的
40