8253芯片实验

8253芯片实验

写在前面:

之前做过一个8255的实验,但是对汇编语言真心摸不着头脑,基础没打好,打代码都痛苦N倍!此次8253实验,多亏了老王,苦口婆心教我这个小白,真的很感谢上天让我遇到他啊哈哈哈!

实验内容:

通过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

 参考链接:https://www.cnblogs.com/wstong/p/12890547.html

猜你喜欢

转载自www.cnblogs.com/acmer-hmin/p/12900420.html