
微机原理课件第9-10讲-8253.ppt
37页第4章 中断控制器、计数器/定时器,实现定时的方式: 软件定时 不可编程的硬件定时 可编程的硬件定时4.4 可编程定时器/计数器芯片8253/8254,4.4.1 计数器/定时器的工作原理,2. 控制寄存器存放CPU送来的控制字,控制8253的工作方式有3个,只占用一个地址,不能读三个独立的计数/定时通道计数器0,1,2 每个计数器的结构为: (1)16位计数初值寄存器(CR) (2)16位的计数执行部件(CE) (3)16位输出锁存器(OL),4.4.2 8253的结构与功能,8253的引脚,8253:02MHz 8254-2:010MHz,A9A8A7A6A5A4A3A2A1A0 功能 基本地址 0 0 0 1 0 0 0 计数器0 40H 0 0 0 1 0 0 1 计数器1 41H 0 0 0 1 0 1 0 计数器2 42H 0 0 0 1 0 1 1 控制寄存器 43H (其他) 芯片禁止,在IBM-PC机中,8253的地址为,8253内部结构框图,计数器内部结构框图,8253端口地址及内部操作,4.4.3 8253的编程,控制命令字,1)写操作 (1)对每个计数器,必须先写控制字,后写计数初值 (2)计数初值必须符合控制字(D5D4两位)决定的格式 2)读操作 (1)先停止计数再读计数器(CE) (2)先锁存再读,8253的读/写操作,8253的初始化编程,(1)控制字(2)计数初值,例:设8253芯片的端口地址为388H38BH。
现要求计数器0工作在方式3,计数初值为2354,十进制计数;计数器1工作在方式2,计数初值为18H,二进制计数试根据上述要求编写初始化及读取计数器0当前计数值的程序计数器0工作在方式3,计数初值为2354,十进制计数;,计数器0 outportb(0 x38b,0 x37); /控制字00110111B outportb(0 x388,0 x54); /初值低8位 outportb(0 x388,0 x23); /初值低8位,计数器1工作在方式2,计数初值为18H,二进制计数,计数器1 outportb(0 x38b,0 x54); /控制字01010100B outportb(0 x389,0 x18); /初值低8位,读取计数器0当前计数值的程序,outportb(0 x38b,0 x00); /控制字0 data_l=inportb(0 x388); /初值低8位 data_h=inportb(0 x388); /初值高8位,4.4.4 8253的工作方式 8253有6种工作方式,不论用哪种工作方式,都遵守下面几条基本规则: 控制字写入计数器时,所有的控制逻辑电路立即复位,输出端OUT进入规定的初始状态(高电平或者低电平)。
初始值写入以后,要经过一个周期,计数器才开始计数 通常,在时钟脉冲CLK的上升沿时,门控信号GATE被采样以检测是何种触发方式 在时钟脉冲的下降沿,计数器作减1计数0是计数器所能容纳的最大初始值计数结束中断),1.方式0,说明:初值装入后,要经过1个CLK的周期(1个上升沿和1个下降沿)后,计数器才开始计数,所以,输出OUT要经过N+1个时钟周期后才有输出; 输出OUT的有效电平为高电平,并可同时触发中断请求; 门控GATE的作用:高电平时计数,低电平或下降沿时停止计数; CW为写入控制字,N=4表示写入初值1.方式0,方式0时GATE信号的作用,(单稳态触发器),2.方式1,说明:方式字和初值装入后,在门控GATE的上升沿触发下,经过1个CLK的上升沿和1个下降沿后,计数器开始从初值减1计数,同时使OUT=0;当计数结束(归0)时,OUT=1,使输出产生1个宽度为TW=NTCLK的负脉冲单稳态触发器 在GATE的上升沿触发下,输出可再次产生1个宽度为TW负脉冲可重触发频率发生器),3.方式2,(频率发生器),3.方式2,说明:方式字装入后,OUT=1为初始状态 初值装入后,经过1个CLK的周期,计数器开始从初值减1计数,计到1(不是0)时,使输出OUT=0并保持1个CLK周期,然后OUT=1,开始下一个新的计数周期,使输出为CLK的时钟1/N分频信号,占空比q=(N-1)/N。
门控GATE的作用:高电平时计数,低电平停止计数;用GATE的上升沿可以触发分频重新开始称为硬同步;而在GATE=1时,用装初值的方法启动分频开始称为软同步,4.方式3 (方波发生器),说明:特点与方式2类似,主要区别:输出方波,其占空比q为 当N为偶数时,q=0.5; 当N为奇数时,q=(N+1)/2N软件触发选通),5.方式4,说明:初值装入后,经过1个CLK的周期,计数器开始从初值减1计数,计数结束(归0)时,使输出OUT产生一个宽度为1个CLK周期的负脉冲选通信号 (用指令)重新装入初值后,经过N+1个CLK周期,又可使OUT产生一个选通信号(用软件)可重触发 门控GATE的作用:高电平时计数,低电平时停止计数;,(硬件触发选通),6.方式5,说明:初值装入后,在GATE的上升沿的触发下,经过1个CLK的周期,计数器开始从初值减1计数,计数结束(归0)时,使输出OUT产生一个宽度为1个CLK周期的负脉冲选通信号 用GATE的上升沿可重新触发,使OUT产生一个选通信号(用硬件)可重触发总结:,方式2、4、5的输出波形是相同的,都是宽度为一个CLK周期的负脉冲方式2是连续工作, 方式4由软件(设置计数值)触发启动 方式5由门控脉冲触发启动,写入计数值后才能开始计数 方式0、2、3、4在写入计数值后,计数过程就开始了 方式1、5需要外部触发启动,才开始计数,6种方式中只有方式2、3是连续计数,其他4种方式都是一次计数,要继续工作需要重新启动,方式0、4由写入计数值(软件)启动,方式1、5要由外部信号(硬件)启动。
4) 6种方式中选通信号GATE的功能见P277表8.28254与8253的区别 8254是8253的改进型,它们的引脚定义与排列、硬件组成等基本上是相同的其区别主要表现在: 允许最高计数脉冲(CLK)的频率不同 8253:2MHz,8254:10MHz 8254每个计数器内部都有一个状态寄存器和状态锁存器,而8253没有 8254有一个读回命令字,用于读出当前减1计数器CE的内容和状态寄存器的内容,而8253没有4.4.5 8253应用举例,4.4.5 8253应用举例,红外光电对管,4.4.5 8253应用举例,计数器1工作于方式3方波方式,产生2000Hz喇叭音调,方式控制字为:01110111B(77H),即方式3,先低后高,BCD数制; 初值(分频比)=(1.4106)/2000=700(H)分析: 计数器0工作于方式2分频方式,每隔50个CLK0产生一个中断INT;方式控制字为:00010101B(15H),即方式2,只装低8位,BCD数制,初值为50(H)主程序段:outport(0 x43,0 x15); /置计数器0方式 outport(0 x40,0 x50); /装初值 outport(0 x63,0);/关8255的PC0 outport(0 x43,0 x77);/置计数器1方式 outport(0 x41,0);/装初值 outport(0 x41,7); disable();/关中断 mode=getvect(0 x0a);/取IRQ2中断向量 setvect(ox0a,intpp); temp=inport(0 x21);/取8259屏蔽寄存器数据 outport(0 x21,temp ,(说明:在装入8253计数器的初值时,不管是二进制数制还是BCD数制,初值后均要加“H”。
中断服务程序: Void interrupt intpp() outport(0 x63,1);/开8255的PC0 DLY5S();/调5S延迟子程序 outport(0 x63,0) ;/关8255的PC0 ,2. 计数器1向DMAC系统提供定时中断,刷新动态RAM:工作于方式2(分频),CLK1=1193181.6Hz,BCD数制,初值=18,OUT1输出频率为1193181.6/18=66287KHz(周期为150857s)的矩形波向DMAC提供定时中断8253在IBM-PC机中的应用 1. 计数器0向系统提供定时中断:工作于方式3(方波),CLK0=1193181.6Hz,二进制数制,初值=0(即65536),OUT0输出频率为1193181.6/65536=182Hz(周期为55ms)的方波控制8259A的IRQ0(日时钟)的中断,即每隔55ms产生一次中断3. 计数器2提供喇叭的音调:工作于方式3(方波),CLK2=1193181.6Hz,BCD数制,初值=533,OUT2输出频率为1193181.6/533=900Hz的方波作为喇叭的声源练习:用8253设计洗衣机定时程序,设输入频率为2MHz,要求能产生3分、6分和12分的定时,定时到产生中断,试画出8253的连接示意图并编写相应的初始化程序及程序段。
分析:计数器0工作于方式3,初值N=0(10000)(H) 计数器1工作于方式3,N=200(H) 计数器2工作于方式0,初值由3分、6分、12分除1S(减1)得出,outport(0 x43,0 x37) ;/计数器0 outport(0 x40,0); outport(0 x40,0); outport(0 x43,0 x77); /计数器1 outport(0 x41,0); outport(0 x41,2);,3分定时:N=180/1=180 outport(0 x43,0 xb1) outport(0 x42,0 x80); outport(0 x42,1);,6分定时:N=360/1=360 outport(0 x43,0 xb1) outport(0 x42,0 x60); outport(0 x42,3);,。
