微机接口端口计算问题
关于 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 1001 和0000 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×10−6s=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×10−6s=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×10−6s=32.786ms