先验知识回顾:知识点不清晰的时候可以查询相关知识点。
https://blog.csdn.net/qq_42604176/article/details/105810973
需掌握的主要知识点
1、译码电路设计
2、初始化编程
例题1
在以 8086构成的最大方式系统中,有一片8254的端口地址分别为301H、303H、305H和307H,给定的外部时钟为512kHz。 要求:、
(1)利用计数器0产生周期为1ms的周期信号,请编写初始化程序;利用这一计数器能产生的最低信号频率为_______, 这时的时常数CR。=________;
思路:
1、分析采用哪种方式
根据要求产生周期信号,采用方式2/3:分频器/周期性方波输出;
2、计算时常数CR0
CR0=输出信号周期/外部时钟周期=1ms/(1/512k)=512
3、了解该计数器的最大分频次数,计算最大分频次数
最大分频次数是62256次,这样可以获取最低频率:512k/62256=8.22Hz
MOV DX,307H;DX指向控制寄存器
MOV AL,0011 0110B;配置字:选择通道0, CR/OL使用16位,方式3,2进制计数
OUT DX,AL; 字配置完成
MOV DX,301H;DX指向通道0
MOV AX,512;设置时常数
OUT DX,AL;
XCHG AL,AH;
OUT DX,AL; 配置完成
(2)利用计数器1和2产生如图9. 17所示的周期信号,并编写初始化程序;
产生这种非方波的周期信号,使用方式2,但是在方式2下,低电平时间仅为一个时钟周期。因此,利用一个计数通道无法实现。现在采用计数器1和计数器2联合,先利用计数器1产生周期为1.5ms的周期信号,然后将输出OUT1信号作为计数器2的时钟输入CLK2。
对于计数器1,工作方式可以选择方式2/3,一般选择方式3,这样可以使产生的信号近似对称,其时常数CR1=1.5ms/(1/512k)=768,采用16位的时常数表示。
对于计数器2,工作方式只能选择方式2,其时间常数CR2=(3s+1.5ms)/1.5ms=2001,所以也需要16位时常数表示。
;配置计数器1
MOV DX,307H;DX指向控制寄存器
MOV AL,0111 0110B;配置字:选择通道1, CR/OL使用16位,方式3,2进制计数
OUT DX,AL; 字配置完成
MOV DX,303H;DX指向通道1
MOV AX,768;设置时常数
OUT DX,AL;
XCHG AL,AH;
OUT DX,AL; 配置完成;配置计数器2
MOV DX,307H;DX指向控制寄存器
MOV AL,1011 0100B;配置字:选择通道2, CR/OL使用16位,方式2,2进制计数
OUT DX,AL; 字配置完成
MOV DX,305H;DX指向通道2
MOV AX,2001;设置时常数
OUT DX,AL;
XCHG AL,AH;
OUT DX,AL; 配置完成
(3)画出8253的端口译码电路(地址线只使用Ao~Ag)及其连接图。
译码电路地址要求:
A2A1 | ADDR(二进制) | ADDR(16进制) |
---|---|---|
00 | 11,0000,0001 | 301H |
01 | 11,0000,0011 | 303H |
10 | 11,0000,0101 | 305H |
11 | 11,0000,0111 | 307H |
注意由于是奇地址,数据线和A0所做出的的更改:
例题2
设8253的端口地址为260H ~ 263H,外部时钟信号为1MHz,要求产生如图所示的周期波形,画出8253的连接图,并编写初始化程序段。
分析:
产生的信号低电平时间比高电平宽的多,所以不能直接采用方式2实现。如果可以增加外部器件,则可以在上一题的基础上,将OUT端信号非门取反。
1、由于要采用方式3,产生周期:1s+12ms=1012ms的方波信号,题目给定的外部时钟周期为1MHz,这时候需要的分频系数(时常数)为:1012ms/1us=1012000,显然这个超过了65536(2^16),所以通过一个计数通道无法实现,所以采用计数器0和计数器1联合产生。CR0=1000,CR1=1012,这样OUT0周期为1ms。
2、利用计数器2的方式1(可编程单稳脉冲)实现单脉冲形成一次作为要求产生信号的低电平,时常数CR2=1s/1ms-1=1000-1=999,计数器0 的OUT0信号作为计数器2的时钟输入信号,OUT1作为计数器2的硬件触发信号,确保周期为1012ms。这里注意,计数器的方式1的时常数确定的是输出低电平的时长,也就是所谓的单脉冲宽度.
MOV DX,263H;写计数器0方式控制字
MOV AL, 0011 0110B;计数器0,16位,方式三,二进制
OUT DX,AL;
MOV DX,260H;写计数器0的时常数
MOV AX,1000;
OUT DX,AL;
XCHG AL,AH;
OUT DX,AL;
MOV DX,263H;写计数器1方式控制字
MOV AL,0111 0110B;计数器1,16位,方式三,二进制
OUT DX,AL;
MOV DX,261H;写计数器1时常数
MOV AX,1012;
OUT DX,AL;
XCHG AL,AH;
OUT DX,AL;
MOV DX,263H;写计数器2方式控制字
MOV AL,1011 0010B;计数器2,16位,方式1,二进制
OUT DX,AL;
MOV DX,262H;写计数器2时常数
MOV AX,999;
OUT DX,AL;
XCHG AL,AH;
OUT DX,AL;
OUT0:输出的是周期为1ms的方波
OUT1:输出的是周期为1012ms的方波,也就是说每1012ms产生一个上升沿,这确定了计数器2的方式1一个周期宽度
OUT2:输出的是周期为1012ms,低电平时长为1000ms的脉冲。
我觉得最需要关注的两个连接点就是:OUT0->CLK1,OUT1->GATE2
例题3
在8088最小系统中,8253 的端口地址为284H~287H.系统提供的时钟为IMHz,要求在OUT0输出周期为20微秒的方波,在OUTI输出周期为200微秒,其中每周期为负的时间是180微秒的信号。请编写8253的初始化程序。
分析:这一题和上一题的思路很相似,主要的就是不需要联合。
通道0产生方波,可以使用方式3产生。
时常数CR0=输出信号周期/外部时钟周期=20us/(1/1M)=20;
通道2产生方波,可以使用方式3产生。
时常数CR2=输出信号周期/外部时钟周期=200us/(1/1M)=200;
通道1,采用方式1,时常数,CR1=180/20-1=8;
;配置计数器0
MOV DX,287H;DX指向控制寄存器
MOV AL,0001 0110B;配置字:选择通道0, CR/OL使用低8位,方式3,2进制计数
OUT DX,AL; 字配置完成
MOV DX,284H;DX指向通道0
MOV AL,20;设置时常数
OUT DX,AL;配置完成
MOV DX,287H;写计数器2控制方式字
MOV AL,1001 0110B;
OUT DX,AL;
MOV DX,286H;写计数器2时常数
MOV AL,200;
OUT DX,AL;
MOV DX,287H;
MOV AL,0101 0010B;
OUT DX,AL;
MOV DX,285H;
MOV AL,8;
OUT DX,AL;