1. 实验目的
- 了解定时计数器8254的初始化及用法。
- 了解定时计数器8254各种工作方式的特点。
2. 实验内容
- 题目:编写程序,使8254的计数器1分别工作在方式0、1、3下,在示波器上观察各工作方式下OUT1的输出波形。
- 实验扩展1:利用8254产生周期为1s的方波。
- 实验扩展2:使计数器工作在方式2,在示波器上观察OUT1的输出波形。要求负脉冲清晰可见。
3. 实验说明
- 实验中CLK1和GATE1的连接需要自行确定。我的选择是将OUT0连接CLK1,这样计数器1的计数脉冲可以由8254计数器0工作在方式3下产生,并且计数脉冲的周期和频率可以人为控制。GATE1则直接连接开关,可以由开关的闭合控制GATE1的高低电平。
- 本实验对8254在各种工作方式下的波形变化的理解要求较深,建议做实验之前弄懂《微型计算机原理与接口技术》P191-217的内容。
- 以下所有程序的连线都如上所说。
4. 8254计数器1工作在方式0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | A8254 EQU 0600H B8254 EQU 0602H C8254 EQU 0604H CON8254 EQU 0606H ;8254计数器012以及控制端口的地址,由IOY决定 SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE START: MOV DX, CON8254 MOV AL, 36H ;8254计数器0工作在方式3,产生方波,相当于CLK OUT DX, AL MOV DX, A8254 MOV AL, 0E8H OUT DX, AL MOV AL, 03H ;分别写入低8位和高8位计数器初值,合起来是3E8H=1000 OUT DX, AL MOV DX, CON8254 MOV AL, 70H ;8254计数器0工作在方式0,计数时输出低电平,到0时输出高电平 OUT DX, AL MOV DX, B8254 MOV AL, 00H OUT DX, AL MOV AL, 0AH ;写入计数初值0A00H OUT DX, AL AA1: JMP AA1 ;将GATE1置为低电平,运行程序。 ;将GATE1置为高电平,在示波器中可以观察到OUT1输出低电平,待过一段时间后(计数器减至0)输出高电平。 CODE ENDS END START |
5. 8254计数器1工作在方式1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | A8254 EQU 0600H B8254 EQU 0602H C8254 EQU 0604H CON8254 EQU 0606H SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE START: MOV DX, CON8254 MOV AL, 36H OUT DX, AL MOV DX, A8254 MOV AL, 0E8H OUT DX, AL MOV AL, 03H OUT DX, AL ;8254计数器0工作在方式3,产生方波,相当于CLK MOV DX, CON8254 MOV AL, 72H ;8254计数器0工作在方式1,计数时输出低电平,到0时输出高电平 OUT DX, AL MOV DX, B8254 MOV AL, 00H OUT DX, AL MOV AL, 0AH ;写入计数初值0A00H OUT DX, AL AA1: JMP AA1 ;将GATE1置为低电平,运行程序,在示波器中可以看到OUT1输出高电平。 ;把开关闭合然后快速断开,使GATE1产生一次脉冲,在示波器中可以观察到OUT1输出低电平 ;待过一段时间后(计数器减至0)输出高电平。 ;重复上述过程,可以看到每次GATE1产生脉冲,8254都会开始计数(输出低电平),计数器减至0时恢复高电平。 CODE ENDS END START |
6. 8254计数器1工作在方式3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | A8254 EQU 0600H B8254 EQU 0602H C8254 EQU 0604H CON8254 EQU 0606H SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE START: MOV DX, CON8254 MOV AL, 36H OUT DX, AL MOV DX, A8254 MOV AL, 0E8H OUT DX, AL MOV AL, 03H OUT DX, AL ;8254计数器0工作在方式3,产生方波,相当于CLK MOV DX, CON8254 MOV AL, 76H ;8254计数器0工作在方式3,产生方波。 OUT DX, AL MOV DX, B8254 MOV AL, 00H OUT DX, AL MOV AL, 0AH ;写入计数初值0A00H OUT DX, AL AA1: JMP AA1 ;将GATE1置为高电平,运行程序,在示波器中可以看到OUT1规律输出方波。 CODE ENDS END START |
7. 产生周期为1s的方波
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | A8254 EQU 0600H B8254 EQU 0602H C8254 EQU 0604H CON8254 EQU 0606H SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE START: MOV DX, CON8254 MOV AL, 36H OUT DX, AL MOV DX, A8254 MOV AL, 0E8H OUT DX, AL MOV AL, 03H OUT DX, AL ;8254计数器0工作在方式3,产生方波,相当于CLK MOV DX, CON8254 MOV AL, 76H ;8254计数器0工作在方式3,产生方波。 OUT DX, AL MOV DX, B8254 MOV AL, 0E8H OUT DX, AL MOV AL, 03H ;写入计数初值0E8H OUT DX, AL AA1: JMP AA1 ;将GATE1置为高电平,运行程序,在示波器中可以看到OUT1规律输出方波。 ;CLK0输入为1MHz的计数脉冲,周期为1μs,产生1s周期的方波需要1s/1μs=1000000个计数 ;由于单个计数器的上限为2的16次方为65536远小于所需计数值 ;因此将1000000拆分成1000*1000,计数器0的计数初值为1000,产生1ms的计数脉冲输入到CLK1 ;计数器1的计数初值为1000,最终计数器1产生1s的方波。 CODE ENDS END START |
8. 8254计数器1工作在方式2且负脉冲清晰可见
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | A8254 EQU 0600H B8254 EQU 0602H C8254 EQU 0604H CON8254 EQU 0606H SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE START: MOV DX, CON8254 MOV AL, 36H OUT DX, AL MOV DX, A8254 MOV AL, 0FFH OUT DX, AL MOV AL, 0FFH OUT DX, AL ;8254计数器在方式2下的负脉冲宽度仅为一个周期,所以加大OUT0产生的计数脉冲(CLK1)的周期。 MOV DX, CON8254 MOV AL, 74H ;8254计数器0工作在方式3,产生方波。 OUT DX, AL MOV DX, B8254 MOV AL, 11H OUT DX, AL MOV AL, 00H ;写入计数初值11H,因为计数脉冲周期变长,次数适当减少计数器1的计数初值。 OUT DX, AL AA1: JMP AA1 ;将GATE1置为高电平,运行程序,在示波器中可以看到OUT1输出一段高电平后会输出一个宽度为一个周期的负脉冲。 CODE ENDS END START |