接口技术-8253芯片实验
8253芯片实验
写在前面:
之前做过一个8255的实验,但是对汇编语言真心摸不着头脑,基础没打好,打代码都痛苦N倍!
实验内容:
通过8253芯片通道0和通道2级连,clk0输入时钟信号100khz,使out2每隔1s,通过不可屏蔽引脚NMI产生中断,依次轮流点亮8盏LED灯。
在公布实验代码前,请允许我卑微的介绍本次实验必不可少的基础知识!
1、计数器的3个引脚
- CLK时钟输入信号
• 在计数过程中,此引脚上每输入一个时钟信号(下降沿),计数器的计数值减1
• GATE门控输入信号
• 控制计数器工作,可分成电平控制和上升沿控制两种类型
• OUT计数器输出信号
• 当一次计数过程结束(计数值减为0),OUT引脚上将产生一个输出信号
2、确定计数初始值:
$f_{clk0}$=100khz;因此$T_{clk0}$=$\frac{1}{f_{clk0}}$=$\frac{1}{100khz}$=$10^{-5}$
其中,有这个公式$T_{out}=T_{clk}*N$,因此我们观察一下8253
从图可知,Tout0=Tclk2,因此
$T_{out2}=T_{clk2}*N_{2}=T_{out0}*N_{2}=T_{clk0}*N_{0}*N_{2}=1s$,
$N_{0}*N_{2}=10^{5}$,在满足等式成立情况下,给N0,N2任意取值皆可。
3、8253的其中2种工作方式:当计数器的计数初值已经确定时,计数器就开始工作
-
- 方式0:当计数初值为4时,在做了4个$T_{clk}$时,它就结束了任务,并产生中断。
-
- 方式3:初始化计数初值为4后,就一直工作下去。
4、地址
-
- 74HC154的地址
Y0=IO0,Y1=IO1,Y2=IO2;
结合上表,可知IO2的信号是DCBA=0010,从而得出$A_{12}A_{11}A_{10}A_{9}$=0010;
-
- 8253的地址
我们观察上面的8253的图,可以知道地址线$A_{1}A_{2}$分别接在8253的$A_{0}A_{1}$
我们从下图可以得知,当$A_{0}A_{1}$=00时,为读写计数器0;当$A_{0}A_{1}$=10时为读写计数器2;
从而推出对应的$A_{1}A_{2}$的值。
具体如下:
计数器0地址:$A_{2}A_{1}$=00;
计数器1地址:$A_{2}A_{1}$=01;
计数器2地址:$A_{2}A_{1}$=10;
控制字地址:$A_{2}A_{1}$=11;
因此我们可以得出20位8253的地址,我们设置其他地址线为0,则
计数器0端口地址:$A_{2}A_{1}$=0000 0000 0100 0000 0000B=400H
计数器1端口地址:$A_{2}A_{1}$=0000 0000 0100 0000 0010B=402H
计数器2端口地址:$A_{2}A_{1}$=0000 0000 0100 0000 0100B=404H
控制端口地址:$A_{2}A_{1}$=0000 0000 0100 0000 0110B=406H
-
- 灯的地址
观察以上74HC273的电路图,我们可以发现,IO1和A0接入或非门,查询上表,可得IO1=0001,即$A_{12}A_{11}A_{10}A_{9}$=0001;
或非门只有当输入全为0时才为1,所以取地址线$A_{0}$=0,同样的,设置其他地址为0,则灯的地址为0000 0000 0010 0000 0000B=200H
代码如下:
1 DATA SEGMENT 2 ;灯的地址及初始状态 3 LIGHT_ADD EQU 200H;灯的地址 4 LIGHT_STATUS DB 11111110B; 有8个灯,0开1关,通过循环左移ROL实现灯状态变化 5 ;8253的地址 6 PORT0 EQU 400H; 计数器0端口地址 7 PORT2 EQU 404H; 计数器2端口地址 8 PORT3 EQU 406H; 控制端口地址 9 10 ;控制方式字 11 CONTROL0 EQU 00010110B;计数器0 只读写低字节,方式3,二进制 12 CONTROL2 EQU 10110000B;计数器2 先读写低字节后读写高字节,方式0,二进制 13 DATA ENDS 14 15 CODE SEGMENT 16 ASSUME CS:CODE,DS:DATA 17 BEGIN: 18 MOV AX,DATA 19 MOV DS,AX 20 21 ;设置2号中断向量 22 NMI_INIT: 23 PUSH ES 24 XOR AX,AX 25 MOV AL,02H 26 XOR AH,AH 27 SHL AX,1 28 SHL AX,1 29 MOV SI,AX 30 MOV AX,OFFSET NMI_SERVICE 31 MOV ES:[SI],AX 32 INC SI 33 INC SI 34 MOV BX,CS 35 MOV ES:[SI],BX 36 POP ES 37 38 39 ; 8253通道0初始化 40 ; 写入方式控制字 41 MOV DX,PORT3 42 MOV AL,CONTROL0 43 OUT DX,AL 44 ; 计数器0写入计数初值 45 MOV DX,PORT0 46 MOV AL,11001000B; 设定N0=200 47 OUT DX,AL 48 49 ; 8253通道2初始化 50 ; 写入方式控制字 51 MOV DX,PORT3 52 MOV AL,CONTROL2 53 OUT DX,AL 54 ; 计数器2写入计数初值 55 MOV DX,PORT2 56 MOV AX,0000000111110100B; 设定N2=500 57 OUT DX,AL; 写入低字节计数初值 58 MOV AL,AH; 将高字节的数值赋值给低字节 59 OUT DX,AL; 写入高字节计数初值 60 61 ;点亮第一个LED灯 62 MOV DX,LIGHT_ADD 63 MOV AL,LIGHT_STATUS 64 OUT DX,AL 65 66 ;等待中断 67 JMP $ 68 69 ; 程序退出 70 MOV AH,4CH 71 INT 21H 72 73 ;中断服务程序 74 NMI_SERVICE PROC FAR 75 ;点亮下一个LED 76 MOV DX,LIGHT_ADD 77 MOV AL,LIGHT_STATUS 78 ROL AL,1; 循环左移 79 OUT DX,AL 80 MOV LIGHT_STATUS,AL; 更新LIGHT_STATUS的值 81 82 ; 通道2送计数初值,再次启动计数 83 ; 8253通道2初始化 84 ; 写入方式控制字 85 MOV DX,PORT3 86 MOV AL,CONTROL2 87 OUT DX,AL 88 89 MOV DX,PORT2 90 MOV AX,0000000111110100B; 91 OUT DX,AL; 写入低字节计数初值 92 MOV AL,AH; 93 OUT DX,AL; 写入高字节计数初值 94 95 IRET; 中断返回 96 NMI_SERVICE ENDP 97 98 CODE ENDS 99 END BEGIN