关于微机接口的端口地址计算问题

微机接口端口计算问题

关于 8254 A 8254A 8254A的端口地址的问题

详细的计算出下图中8254的四个端口地址为多少?

在这里插入图片描述

答案 : A 0 H , A 2 H , A 4 H , A 6 H A0H, A2H, A4H, A6H A0H,A2H,A4H,A6H

解析: 四个端口地址分别为计数器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 A0,A1,A2,A3,A4,A5,A6,A7,A8

在这里插入图片描述

据上图所示, 三八译码器所对的A5, A4 ,A3 分别为100

在这里插入图片描述

该图对应着三八译码器的转换值, 其中 Y 4 Y4 Y4就是相当于上图的 D 4 D4 D4, 即 Y 4 Y4 Y4该位有效;所以对应的 C B A CBA CBA分别为100.

在这里插入图片描述

8254 A 8254A 8254A中内部的 A 0 , A 1 A0,A1 A0,A1分别表示选择不同的计数器(或寄存器), 所以外部的 A 1 , A 2 A1,A2 A1,A2分别对应着00, 01, 10, 11

A 7 A7 A7默认高电平有效即为1

综上所述:

计数器0: 00 1010 0000 0 A 0 H 0A0H 0A0H

计数器1: 00 1010 0010 0 A 2 H 0A2H 0A2H

计数器2: 00 1010 0100 0 A 4 H 0A4H 0A4H

控制字寄存器: 00 1010 1100 0 A 6 H 0A6H 0A6H

在这里插入图片描述


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 10010000 0011 一起来表示十进制93


8254A/8253A编程题

假设在一个8086系统中,使用8253控制一个LED的点亮或熄灭。四个端口地址分别是 81 H , 83 H , 85 H , 87 H , C L K 81H,83H,85H,87H, CLK 81H,83H,85H,87H,CLK端输入的是时钟频率为 2 M H z 2MHz 2MHz,LED点亮和熄灭均为10s。设计硬件电路和驱动程序。

在这里插入图片描述

解答:

8254 A 8254A 8254A 计数初值 : N = f c l k ÷ f o u t N = f_{clk} \div f_{out} N=fclk÷fout , 其中 f c l k f_{clk} fclk表示的是输入频率, f o u t f_{out} fout为输出频率。

周期与频率之间的转换: f × T = 1 f \times T = 1 f×T=1 f = 1 T f = \frac{1}{T} f=T1 ; 其中T的单位是s(秒)

单位间的转换 : 1 M H 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 MHz=1×103KHz=1×106Hz

因此输入的频率为 f c l k = 2 × 1 0 6 H z f_{clk} = 2 \times 10^6 Hz fclk=2×106Hz ; 输出周期为 T = 20 s T = 20s T=20s ,所以频率 f o u t = 1 T = 1 20 = 0.05 H z f_{out} = \frac{1}{T}=\frac{1}{20} = 0.05Hz fout=T1=201=0.05Hz

初步计算计数初值为 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=fclk÷fout=2×106÷0.05=4×108

因为二进制计数最大初值为65536; BCD码计数初值最大为10000

所以得分步计数

根据上图, 使用到 C L K 0 CLK_0 CLK0 C L K 1 CLK_1 CLK1即使用的是计数器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 fout0=fclk0÷5000=2×106÷5000=400, 再将 f o u t 0 f_{out_0} fout0传入 f c l k 1 f_{clk_1} fclk1 ,即 f o u t 0 = f c l k 1 f_{out_0}=f_{clk_1} fout0=fclk1 , 计数器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 fout1=fclk1÷8000=400÷8000=0.05 ,因此最终输出频率为0.05 ,也就是周期为 20 s 20s 20s

代码段:

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上的时钟频率为 1 M H z 1MHz 1MHz,则一个计数器的最长定时时间是( 65.536 m s 65.536ms 65.536ms

解答 : 因为 8254 A 8254A 8254A最大的计数初值是65536, 所以 N M A X = 65536 N_{MAX} = 65536 NMAX=65536 , 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 fout=fclk÷NMAX=1×106÷65536, 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÷fout=65536×106s=65.536ms

题目2:若加到8254上的时钟频率为 2 M H z 2MHz 2MHz,则一个计数器的最长定时时间是( 32.768 m s 32.768ms 32.768ms

解答:因为 8254 A 8254A 8254A最大的计数初值是65536, 所以 N M A X = 65536 N_{MAX} = 65536 NMAX=65536, 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 fout=fclk÷NMAX=2×106÷65536,T=1÷fout=32786×106s=32.786ms

N M A X = 65536 N_{MAX} = 65536 NMAX=65536, 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 fout=fclk÷NMAX=2×106÷65536, 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÷fout=32786×106s=32.786ms

  • 28
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值