微机接口端口计算问题
关于
8254
A
8254A
8
2
5
4
A
的端口地址的问题
详细的计算出下图中8254的四个端口地址为多少?
答案 :
A
0
H
,
A
2
H
,
A
4
H
,
A
6
H
A0H, A2H, A4H, A6H
A
0
H
,
A
2
H
,
A
4
H
,
A
6
H
解析: 四个端口地址分别为计数器0, 计数器1, 计数器2, 控制字寄存器的端口地址
而他们的端口地址取决于与CPU相连的地址总线, 根据图所示, 即
A
0
,
A
1
,
A
2
,
A
3
,
A
4
,
A
5
,
A
6
,
A
7
,
A
8
A0, A1, A2, A3, A4, A5, A6, A7, A8
A
0
,
A
1
,
A
2
,
A
3
,
A
4
,
A
5
,
A
6
,
A
7
,
A
8
据上图所示, 三八译码器所对的A5, A4 ,A3 分别为100
该图对应着三八译码器的转换值, 其中
Y
4
Y4
Y
4
就是相当于上图的
D
4
D4
D
4
, 即
Y
4
Y4
Y
4
该位有效;所以对应的
C
B
A
CBA
C
B
A
分别为100.
8254
A
8254A
8
2
5
4
A
中内部的
A
0
,
A
1
A0,A1
A
0
,
A
1
分别表示选择不同的计数器(或寄存器), 所以外部的
A
1
,
A
2
A1,A2
A
1
,
A
2
分别对应着00, 01, 10, 11
A
7
A7
A
7
默认高电平有效即为1
综上所述:
计数器0: 00
1010
0000
即
0
A
0
H
0A0H
0
A
0
H
计数器1: 00
1010
0010
即
0
A
2
H
0A2H
0
A
2
H
计数器2: 00
1010
0100
即
0
A
4
H
0A4H
0
A
4
H
控制字寄存器: 00
1010
1100
即
0
A
6
H
0A6H
0
A
6
H
BCD码的用法
BCD码表示的是十进制
一个字节 = 8位
组合BCD码(压缩BCD码)
一个字节包含两位BCD码; 每4位为一个BCD码; 每4位以二进制的形式计算所表示的是十进制的位数. 比如二进制:1000; 十进制是8.
e.g.
1001
0011
表示十进制的93
未组合BCD码(非压缩BCD码)
一个字节包含一个BCD码; 前4位都为0, 后4位表示一位BCD码
e.g.
0000
1001
和
0000
0011
一起来表示十进制93
8254A/8253A编程题
假设在一个8086系统中,使用8253控制一个LED的点亮或熄灭。四个端口地址分别是
81H
,
83
H
,
85
H
,
87
H
,
C
L
K
81H,83H,85H,87H, CLK
8
1
H
,
8
3
H
,
8
5
H
,
8
7
H
,
C
L
K
端输入的是时钟频率为
2M
H
z
2MHz
2
M
H
z
,LED点亮和熄灭均为10s。设计硬件电路和驱动程序。
解答:
8254A
8254A
8
2
5
4
A
计数初值 :
N=
f
c
l
k
÷
f
o
u
t
N = f_{clk} \div f_{out}
N
=
f
c
l
k
÷
f
o
u
t
, 其中
fc
l
k
f_{clk}
f
c
l
k
表示的是输入频率,
fo
u
t
f_{out}
f
o
u
t
为输出频率。周期与频率之间的转换:
f×
T
=
1
f \times T = 1
f
×
T
=
1
即
f=
1
T
f = \frac{1}{T}
f
=
T
1
; 其中T的单位是s(秒)单位间的转换 : 1
MH
z
=
1
×
1
0
3
K
H
z
=
1
×
1
0
6
H
z
MHz = 1\times 10^3 KHz = 1 \times 10^6 Hz
M
H
z
=
1
×
1
0
3
K
H
z
=
1
×
1
0
6
H
z
因此输入的频率为
f
c
l
k
=
2
×
1
0
6
H
z
f_{clk} = 2 \times 10^6 Hz
f
c
l
k
=
2
×
1
0
6
H
z
; 输出周期为
T
=
20
s
T = 20s
T
=
2
0
s
,所以频率
f
o
u
t
=
1
T
=
1
20
=
0.05
H
z
f_{out} = \frac{1}{T}=\frac{1}{20} = 0.05Hz
f
o
u
t
=
T
1
=
2
0
1
=
0
.
0
5
H
z
初步计算计数初值为
N
=
f
c
l
k
÷
f
o
u
t
=
2
×
1
0
6
÷
0.05
=
4
×
1
0
8
N = f_{clk} \div f_{out} = 2 \times 10^6 \div 0.05 = 4\times10^8
N
=
f
c
l
k
÷
f
o
u
t
=
2
×
1
0
6
÷
0
.
0
5
=
4
×
1
0
8
因为二进制计数最大初值为65536; BCD码计数初值最大为10000
所以得分步计数
根据上图, 使用到
C
L
K
0
CLK_0
C
L
K
0
和
C
L
K
1
CLK_1
C
L
K
1
即使用的是计数器0和计数器1
因此思路为先让计数器0计数一部分,再将输出频率传到计数器1进行计数,这样就可以减小计数初值.
先让计数器0计数5000, 输出的频率为
f
o
u
t
0
=
f
c
l
k
0
÷
5000
=
2
×
1
0
6
÷
5000
=
400
f_{out_0} = f_{clk_0} \div 5000 =2\times 10^6 \div 5000 = 400
f
o
u
t
0
=
f
c
l
k
0
÷
5
0
0
0
=
2
×
1
0
6
÷
5
0
0
0
=
4
0
0
, 再将
f
o
u
t
0
f_{out_0}
f
o
u
t
0
传入
f
c
l
k
1
f_{clk_1}
f
c
l
k
1
,即
f
o
u
t
0
=
f
c
l
k
1
f_{out_0}=f_{clk_1}
f
o
u
t
0
=
f
c
l
k
1
, 计数器1计数8000, 最后输出频率为
f
o
u
t
1
=
f
c
l
k
1
÷
8000
=
400
÷
8000
=
0.05
f_{out_1} = f_{clk_1} \div 8000 = 400 \div 8000 = 0.05
f
o
u
t
1
=
f
c
l
k
1
÷
8
0
0
0
=
4
0
0
÷
8
0
0
0
=
0
.
0
5
,因此最终输出频率为0.05 ,也就是周期为
20
s
20s
2
0
s
代码段:
MOV AL,00110101B
OUT 87H,AL
MOV AL, 00H
OUT 81H, AL
MOV AL,50H
OUT 81H, AL
MOV AL, 01110111B
OUT 87H,AL
MOV AL,00H
OUT 83H,AL
MOV AL,80H
OUT 83H,AL
题目1: 若加到8254上的时钟频率为
1M
H
z
1MHz
1
M
H
z
,则一个计数器的最长定时时间是(
65.536m
s
65.536ms
6
5
.
5
3
6
m
s
)
解答 : 因为
8254
A
8254A
8
2
5
4
A
最大的计数初值是65536, 所以
N
M
A
X
=
65536
N_{MAX} = 65536
N
M
A
X
=
6
5
5
3
6
,
f
o
u
t
=
f
c
l
k
÷
N
M
A
X
=
1
×
1
0
6
÷
65536
f_{out} = f_{clk} \div N_{MAX} = 1\times 10^6 \div 65536
f
o
u
t
=
f
c
l
k
÷
N
M
A
X
=
1
×
1
0
6
÷
6
5
5
3
6
,
T
=
1
÷
f
o
u
t
=
65536
×
1
0
−
6
s
=
65.536
m
s
T = 1\div f_{out} = 65536 \times 10^{-6} s = 65.536ms
T
=
1
÷
f
o
u
t
=
6
5
5
3
6
×
1
0
−
6
s
=
6
5
.
5
3
6
m
s
题目2:若加到8254上的时钟频率为
2M
H
z
2MHz
2
M
H
z
,则一个计数器的最长定时时间是(
32.768m
s
32.768ms
3
2
.
7
6
8
m
s
)
解答:因为
8254
A
8254A
8
2
5
4
A
最大的计数初值是65536, 所以
N
M
A
X
=
65536
N_{MAX} = 65536
N
M
A
X
=
6
5
5
3
6
,
f
o
u
t
=
f
c
l
k
÷
N
M
A
X
=
2
×
1
0
6
÷
65536
,
T
=
1
÷
f
o
u
t
=
32786
×
1
0
−
6
s
=
32.786
m
s
f_{out} = f_{clk} \div N_{MAX} = 2\times 10^6 \div 65536 , T = 1\div f_{out} = 32786\times 10^{-6} s = 32.786ms
f
o
u
t
=
f
c
l
k
÷
N
M
A
X
=
2
×
1
0
6
÷
6
5
5
3
6
,
T
=
1
÷
f
o
u
t
=
3
2
7
8
6
×
1
0
−
6
s
=
3
2
.
7
8
6
m
s
N
M
A
X
=
65536
N_{MAX} = 65536
N
M
A
X
=
6
5
5
3
6
,
f
o
u
t
=
f
c
l
k
÷
N
M
A
X
=
2
×
1
0
6
÷
65536
f_{out} = f_{clk} \div N_{MAX} = 2\times 10^6 \div 65536
f
o
u
t
=
f
c
l
k
÷
N
M
A
X
=
2
×
1
0
6
÷
6
5
5
3
6
,
T
=
1
÷
f
o
u
t
=
32786
×
1
0
−
6
s
=
32.786
m
s
T = 1\div f_{out} = 32786\times 10^{-6} s = 32.786ms
T
=
1
÷
f
o
u
t
=
3
2
7
8
6
×
1
0
−
6
s
=
3
2
.
7
8
6
m
s