资源描述
*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,定时器,8253/8254,通用发声程序,补充材料,2024/11/20,可编程时间间隔定时器,8253/8254,计数器,0,:,用于控制系统时钟正常运转,端口地址为,40H,。,计数器,1,:,用于存储器刷新,端口地址为,41H,。,计数器,2,:,用于控制扬声器发声,端口地址为,42H,。,公用的控制寄存器:,端口地址为,43H,2024/11/20,计数器,0,的工作,系统时钟之所以能连续运转主要依靠定时器的通道,1,(计数器,0,)。系统启动时设定其发出一个频率固定为,18.2Hz,的信号,这个信号直接送到系统中的,“,中断控制器,”,。每一个,“Hz”,都产生一个硬件中断,一般称这个硬中断为,“IRQ0”,,对应的中断类型号是,08H,。,也就是说,当计算机启动后,我们的机器看上去十分平静,但实际上,CPU,非常忙碌。在定时器的控制下每隔,55,毫秒就要执行一个,08H,号中断,这个中断的主要工作就是连续地计数。在内存,“0040H,:,006CH”,处有四个字节的存储空间专门用于保存计数值,,CPU,每执行一次,08H,中断,这四字节的计数值就被加,1,,不难算出这个计数值每增加,1091,后时间恰好过了,1,分钟,每增加,65454,后时间恰好过了,1,小时。系统内部的时钟之所以能准确走时,靠的就是,08H,中断和这四字节的计数值。因此我们要想精确的定时,必须依靠时钟计数值才行。,2024/11/20,1,、,设定控制字:,将控制字写入控制寄存器,43H,;,将计数器,0,设定为模式,3,,先写低字节接着写高字节,,,BCD,码格式,MOV AL,00110111B,OUT 43H,AL,2,、,设定计数初值:,控制计数频率,(,F(OUT)=F(CLK)/N=1193181.6/N,),;,将计数器,0,的计数初值设定为,65536,,则计数频率为,18.2Hz,(基准时钟),MOV AX,0,OUT 40H,AL,MOV AL,AH,OUT 40H,AL,计数器,0,初始化,2024/11/20,8253/8254,定时器作为发声源,计数器,2,的,G,端与,61H,端口的,bit0,位相连,将,61H,端口的,bit0,位置成,1,,那么计数器,2,就被启动,此时将有一组信号从,OUT,端输出,信号的频率可以用程序控制,(,设初值,),;若,61H,端口,bit0,位为,0,,则定时器被关闭,,OUT,端就会恒定为,1,。,系统,将定时器产生的方波信号同,8255,的端口,B,相与来控制扬声器发声,因此当,PB1=1,时,才能控制扬声器的音调。在系统中,8255,的,B,口地址为,61H,。,图,控制扬声器发声原理图,2024/11/20,1,、,设定控制字:,将控制字写入控制寄存器,43H,;,将计数器,2,设定为模式,3,,先读写低字后读写高字,,二进制码格式,MOV AL,10110110B,;0b6h,称为,幻数,“,OUT 43H,AL,2,、,设定计数初值:,控制发声频率,(,F(OUT)=F(CLK)/N=1193181.6/N,),;,将计数器,2,的计数初值设定为,533H,,则声音频率为,896Hz,(,BEEP,子程序),MOV AX,0533H,OUT 42H,AL,MOV AL,AH,OUT 42H,AL,计数器,2,初始化,2024/11/20,扬声器驱动,与门用在这里相当一个,“,可控开关,”,,如果将,61H,端口的,bit0,、,bit1,位都置成,1,,则相当于既打开了定时器又打开了开关,这时候定时器产生的声音信号就会送到放大器推动喇叭发声;称为,定时器触发方式,若将,bit0,位置,0,,则定时器关闭,此时,OUT,端为,1,,这时候如果连续改变,bit1,位的状态,也可以从喇叭中听到声音,这就是,位触发方式,;若将,bit1,位置,0,,则开关关闭,此时即使打开定时器也不能听到声音。,IN AL,61H,;,读状态,MOV AH,AL,;,保存原状态,,push ax,OR AL,00000011B,;,置,bit0,bit,为,1,OUT 61H,AL,.,MOV AL,AH,;,恢复原状态,pop ax,OUT 61H,AL,2024/11/20,通用发声程序,soundf proc near,push ax,pushbx,pushcx,pushdx,pushdi,moval,0b6h,;初始化计数器2 控制扬声器,out43h,al,movdi,220,;音频,movdx,12h,movax,348ch,;dx:ax=输入频率1.1931817MHz,divdi,;ax=,计数初值,out42h,al,moval,ah,out42h,al,inal,61h,movah,al,oral,3 ;打开扬声器,out61h,al,mov bx,1000 ;控制10秒响铃,wait1:mov cx,633,call,waitf,;,调用延时,10ms,dec bx,jnz,wait1,mov,al,ah,out,61h,al ;,恢复,原状态,popdi,popdx,popcx,popbx,popax,ret,soundf endp,2024/11/20,利用硬件产生延迟的方法,与处理器无关,;-,利用端口,61h,的,PB4,延时,10ms,子程序,waitf proc near,pushax,waitf1:,in al,61h,and al,10h,cmp al,ah,jewaitf1,mov ah,al,loop waitf1,popax,ret,waitf endp,见,IBM-PC,教材,P391,2024/11/20,
展开阅读全文