在PC机上用汇编语言设计发声程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在PC机上用汇编语言设计发声程序
设计目的:
了解8253定时器的工作原理,以及扬声器的发声原理
了解8253控制端口的地址,计数器端口的地址,以及8255A的B端口接扬声器驱动电路,B端口的地址
设计原理:
设计中用到了8253定时器,在微机系统中,定时/计数器的主要功能是:(1)在多任务的分时系统中用来作为中断信号实现程序的切换;(2)往I/O设备输出精确的定时信号;(3)作为一个可编程的波特率发生器;(4)实现延迟。
当作为计数器使用时,在设置好计数器初值后,便开始做减一的计数,并按定时常数及方式的设定,不断输出为时钟周期整数倍的定时时间间隔。
两者的差别是,作为计数器计数工作可只进行一次。
若作为定时器,则不断的产生信号。
两种方式,其内部的基本工作是减(或加)计数,没有本质区别。
8253就是专门用于定时/计数的集成电路,内部有三个可编程的16位计数器。
各个计数器之间完全独立。
它的基本结构包括:
数据总线缓冲器控制逻辑:与CPU连接及芯片的读/写操作。
控制寄存器(只读不写):用于存放8253可编程控制字,三个端口共用一个控制寄存器,只有一个公用地址,因此在写入工作方式控制子时,需要通过控制字格式中的最高二位(SC1SC0)的状态决定是对哪一个计数器进行控制字的写入。
三个独立的16位计数寄存器:用于存放计数初值,每个计数器都有时钟输入、门控和输出三个信号。
这三个计数器都是可读/可写的。
8253的控制字由8位组成,可分为四组:D0为的状态决定计数值选择BCD码还是二进制码。
若选择BCD码,则改位状态为1,允许的最大值为100000.最高两位D7,D6位经过编码决定选择计数器0,1或2。
D3D2D1位经过编码决定每个端口的工作方式。
8253每个端口都有6种工作方式,分别为0~方式5。
D5D4位是读/写指示位。
对于8253的编程没有严格的顺序规定,但又两条原则必须严格遵守:(1)对于计数器设置初值前必须先写控制字;(2)设置初始值,要符合控制字中的格式规定,即控制字规定的格式必须遵守。
编程命令有读出和写入两种。
读出是用来读计数器当前的值;写入命令有三种,除写控制字和设定计数初值以外,还有锁存命令。
这是为了配合读出命令的,因为在读计数值时,必须先用锁存命令将当前的计数值锁存至输出锁存器中,否则将得不到一个确定的结果。
8253的每个计数端口都有6种工作方式供选择,它们都遵循下面几条基本规则:(1)控制字一旦写入,所有的控制逻辑电路立即复位,输出端OUT即进入初始状态(2)计数初值写入后要迟后一个脉冲计数执行部件方能开始工作。
(3)计数器自始至终都关注门控信号一般在时钟脉冲上升沿时采样门控信号GATE.
三个计数器的编程地址各自独立,所以8253的读/写命令不会混淆。
8253的控制口地址为46H;3个计数器端口地址为40H,42H,44H;8255A的B端口接扬声器驱动电路,B端口地址为61H。
硬件电路的设计:如下图为PC机扬声器的电路图
流成图设计如下:
附录A:(源程序)
stack segment stack'stack'
db 100 dup(?) stack ends
data segment
data ends
code segment
assume cs:code, ds:data,ss:stack
SOUND:PUSHF
CLI
OR DH,DH ;DH中为发长音的个数
JZ K3 ;如不发长音则转K3 K1:MOV BL,6 ;如发长音则,则置长音计数器
CALL BEEL ;调用发音程序
K2:LOOP K2 ;两音之间保持一定间隙DEC DH ;如否,则继续
K3:MOV BL,1 ;如发完长音,则置短音计数器CALL BEEL ;调用发音程序
K4:LOOP K4
DEC DL ;继续发短音吗?
JNZ K3 ;是,则继续
K5:LOOP K5 ;否,则留一个间隙
POPF ;标志恢复
RET ;返回
BEEL:MOV AL,0B6H
OUT 46H,AL ;设置8253计数器2,16位计数,方式3,二进制式
MOV AX,533H
OUT 44H,AL
MOV AL,AH
OUT 44H,AL
IN AL,61H ;取扬声器驱动信息
MOV AH,AL
OR AH,03 ;接通扬声器
OUT 61H,AL ;送回扬声器驱动
SUB CX,CX ;一次发音时间定时
K7:LOOP K7
DEC BL ;BL中为发音计数值
JNZ K7 ;如为结束,则继续发音
MOV AL,AH
OUT 61H,AL ;发音结束恢复端口信息
RET
code ends
end
附录B:(参考文献)
(1)汇编语言程序设计孙一林主编高等教育出版社
(2)微型计算机原理武自芳主编西北工业大学出版社(3)微机原理与接口技术温阳东主审清华大学出版社
(4)汇编语言程序设计林邦杰陈明编著中国铁道出版社。