《021定时器8254》由会员分享,可在线阅读,更多相关《021定时器8254(14页珍藏版)》请在金锄头文库上搜索。
1、 8254定时/ 8254是可编程的定时/计数器,兼容8253,有3个可独立编程的16位定时/数据总线缓冲器 读/写 逻辑控制字寄存器012D7D0RDWRA0A1CSCLK0GATE0OUT0CLK1GATE1OUT1CLK2GATE2OUT2内部总线18254的编程 通过写控制字可确定每个通道的工作方式。方式0:计数结束输出正跃变信号方式1:单脉冲发生器方式2:分频器方式3:方波发生器方波发生器(分频器方式)方式4:软件触发的单脉冲发生器方式5:硬件触发的单脉冲发生器2控制字寄存器(0x43)SC1SC0RL1RL0 M2M1M0BCD通道选择读写方式选择工作方式选择数制选择SC1 SC0
2、 选通道,表明对那个通道进行操作。选通道,表明对那个通道进行操作。 0 0 通道 0 0 1 通道 1 1 0 通道 2 1 1 无效D7D6D5D4D3D2D1D03读写方式RL1 RL0 确定读写计数值的方法和顺序确定读写计数值的方法和顺序 0 0 锁定当前计数值,供CPU读 0 1 只读/写低8位 1 0 只读/写高8位 1 1 先读/写低8位,再读/写高8位 4确定工作方式M2M1M0 确定通道的工作方式确定通道的工作方式 0 0 0方式0 0 0 1方式1 X 1 0方式2 X 1 1方式3 1 0 0方式4 1 0 1方式5BCD=1:BCD码计数BCD=0:二进制计数099990
3、6553558254在PC机中的应用 8254有两条地址线,占4个连续的I/O端口地址。通道通道0通道1通道2控制字寄存器I/O地址0x400x410x420x43 通道0用于电子钟定时基准,OUT0接到8259A的IR0作为中断源,中断类型号08H.。 通道1用于动态RAM刷新。通道2产生音频信号,供喇叭发声。6通道2outportb(0x43,0xb6);7通道0的工作方式 通道0初始化为方式3 方波频率发生器,OUT0端产生方波,方波的频率等于CLK0端输入脉冲频率除以计数初值。TCLK0输入脉冲频率为 1.193MHz(1193182 Hz)周期为 1/1.193MHz838ns 通道
4、0 作为计数器,每838ns计数值减1,减到0时又自动恢复计数初值。这时OUT0输出的方波完成一个周期,方波的上升沿触发一次中断。8计数初值方波的频率f2等于输入脉冲频率f1除以计数初值Nf f2 2=f=f1 1/N/N方波的周期T2 =1/f2等于输入脉冲周期T1=1/f1乘以计数初值NT T2 2=T=T1 1 N N计数初值N等于方波的周期T2(单位为秒)除以输入脉冲周期T1N=TN=T2 2/T/T1 1=T=T2 2/838ns/838ns更精确的办法:更精确的办法:N=TN=T2 2*1193182;*1193182;9通道0的初始化MOV AL,36HOUT43H,ALMOV
5、AL,0OUT40H,ALOUT40H,AL控制字36H=00110110B D7 D6 D5 D4 D3 D2 D1 D0 00110110选0通道先写低8位再写高8位方式3二进制计数00000 -) 1 11111111111111110-1=65535!0经65536次减1后又减到0方波完成一个周期,0相当最大的计数初值65536。10通道0的中断周期通道0的计数初值相当于65536方波的频率1.193MHz/6553618.2Hz方波的周期838ns*6553655ms通道0每55ms申请一次中断,每秒18.2次通道0的中断服务子程序TIMER-INT固化在BIOS中,有三个功能:1.
6、进行年、月、日、时、分、秒的计时。2.软盘I/O时,确定软驱电机停止转动的时间。3.发出一个1CH类软中断,可以调用一个用户程序。11思考题1.若希望10ms中断一次,计数初值是多少?2.若CLK0输入脉冲频率为2MHz,采用二进制计数和BCD码计数时最大的中断周期是多少?3.若CLK0输入脉冲频率为4MHz,希望中断周期为10ms,写出初始化程序。12 时钟中断程序举例时钟中断程序举例 利用8254的通道0作为实时时钟定时,每10ms中断一次。编写第8类中断的中断服务程序每中断一次在CRT上显示一个8字。 根据新的中断周期对8254通道0初始化 写中断服务子程序 设置中断向量计数初值 10m
7、s/838ns11933=0x2e9dInt(0.010*1193182)=11931=0x2e9b13程序清单程序清单#include #include voidinterrupt myint8(void);voidmain(void)disable();outportb(0x43,0x36);outportb(0x40,0x9d);outportb(0x40,0x2e);setvect(0x08,myint8);enable();while(1);voidinterrupt myint8(void) putchar(8);outportb(0x20,0x20); 设中断向量关中断开中断循环等待主程序初始化0#显示字符EOI命令返回子程序14