当前课程知识点:微机原理与接口技术 > 第12周 可编程并行数字接口 > 第49讲 可编程定时计数器 > 可编程定时计数器8253_03
第4点我们来大家
给大家解释一下这个
所谓的命令字或者控制字它的格式
不管是命令字也好控制字也好
它主要是用来设定各个计数器的
工作方式
也就是说我们要设定它
到底工作在哪一种方式下
然后到底是哪一个计数器工作
因为它内部有三个
对吧
那么现在我们每一个一个命令字的格式
我们会发现
它实际上适用于三个计数器
只不过是你要让计数器0工作
你就必须给它发一个命令字
你接着还要让计数器1工作
你又要给计数器1发命令字
这就是命令字的格式
这个格式里面最高两位
表示你现在这个控制字
到底针对的是哪一个计数器
0 0就表示计数器0
0 1计数器1
1 0计数器2
因为我们只有三个计数器没有计数器3
所以最高两位绝对不可能是1 1
次高两位昵
我们要取决于你的计数初值的长度
如果我们计算出来
计数初值是8位有效值长
就像我们刚开篇举的那个例子
我们要觉得CLK周期是一秒钟
那么我们要定时100秒
所以这个初值就是100
那么这100显然是8位值长
那么如果你算下来
是8位值长的计数初值
那么这两位可以是0 1或者1 0
1 0 0 1昵就表示这个初值
写入了它16位寄存器的第8位
那么1 0昵就表示
写入到里面的高8位
没关系每个都可以
但是如果说
我们刚才还是那个CLK周期是1秒
但是我们不是定时100秒
而是要定时1000秒昵
那么这个时候初值就是1000
那么显然它就是16位值长
这个16位值长昵
这两位就必须要选1 1
这个1 1请大家注意一下
1 1昵因为8253计数器
它的对外数的据通道只有8位
你的16位初值
虽然硬指令OUT指令可以允许
一次传输16位数
但是对于这个具体的这个接口芯片来讲
它的路只有8位这么宽
也就是它的通道只有8位
所以你的16位初值实际上要写两次
所以这里要求你
必须先写低8位
再写高8位
没有任何道理这就是人家规定的
我解释一下这前面这两位
当这两位是0 0的时候
表示不是写操作
而是读操作
读什么昵
读现在你指定的这个计数器
也就说最高这两位所指定的计数器
它里面的计数寄存器
目前的状态就是会被读进来
就说它现在
你比如初值是100
好 它经过来一个CLK脉冲就减一减一
那么现在到底减到几了昵
你设置这两位是0 0
选择计数器0
好 你接着做了一个硬的操作
就把当前计数寄存器里的值就读出来
就看可以观察到它目前减到几了
下面的这3位昵
表示你现在选择的这工作方式
方式0方式1方式4方式5都没问题
就是方式2和方式3昵
你可以选择010 011
也可以选择1 1 0
或者1 1 1
也就说这这2位
这个打叉叉的这2位
表示你可以任意就0和1都行
最低这一位
我解释一下
这一位昵叫计数制选择
也就说如果是1
表示你的计数值
是按BCD来计数的
如果是0
那么就选择按2进制计数
它们的区别在哪里昵
首先
最大的因为我们的计数器
里面的寄存器都是16位的
所以我们的最大的初值
实际上可以有16位值长
那么最大的16位的BCD数是多少昵
是9999
因为BCD数我们前面讲过
因为它实际上是10进制的一个描述
所提它就是0 0 0到1 0 0 1
0 0 0 0到1 0 0 1
最大是9
所以昵最大的16位BCD数
就是9999
但是最大的2进制数
如果我们用16进制来表示的话
16位1就是FFFF
所以显然
16位选择2进制计数
它的计数范围会比较大
就是计数初值可以选择比较大
这个是最大的BCD数
这个是最大的16位2进制数
但是我们8253是减法计数器
所以它的计数初值
不论你选择BCD计数
还是2进制计数
这两个都不是它们的最大计数值
它的最大初值是多少昵
是0
因为如果你选择BCD数
那么0减1等于多少
就是9999
如果你选择2进制计数
那么0减1等于多少
就是FFFF
我们在8253中
最大计数初值我们都是0
所以这个0实际上是个虚的
就说对于2进制计数
实际上相当于是1 0 0 0 0这样子
这是一个计数值
好 在我们这些准备工作做完了
我们下面就要来开始来学习8253的应用
8253的应用昵
作为一个接口昵
显然它就是软硬件两个方面的设计
那么对于硬件设计
就是我们要实现
将这个芯片连接到系统中
作为软件设计昵
因为这个芯片本身
它是一个非通道的接口
所以比如说一旦设计好它的初值
给它写入了命令字
启动了它的计数
它就开始工作了
由它去控制外部设备
我们就不管了
所以它的软件设计
相对是比较简单的
就是按照我们刚才6种工作方式
它的工作时序
就是要写命令字写初值
其实就是这样的一个工作
这个工作我们叫初始化程序
这个初始化程序
就是写控制字写初值
这样两件事
所以这个程序昵
有时候说它简直类似于一个八股文章
所以很简单
我们下面先来看一下这个它的硬件设计
也就是这个芯片和系统的连接
我们用一个示意图来描述它
这假设这个是8253
我们假设里面用一个计数器来做例子来说
它上3个都是一样的
对吧
那么它的8位数据通道
可以和系统的数据通过数据总线
和系统连接
它的读和写信号
可以和系统这边的LW和LR信号
分别去连接
它的片内地址跟我们前面一样
也分别跟系统这边的低2位地址
对应连接
也就是说当你选中这个芯片之后
由这2位地址信号的编码方式
来决定你选中里面的哪一个端口
它的片选信号
当然无疑就是连接到我们移码器的输出端
而移码器的输入就是这个高位地址
那么它的外部昵
CLK端刚才我们说了
它是和外部时钟信号的输入端
也就说由外部晶振电路
会产生一个时钟电路
它的输出会接到这里的CLK
那么GATE端无论是软启动也好
硬启动也好
都是由外部来控制的
只有OUT端会输出连接到外部设备
这个就是这个芯片
在系统硬件设计上
它的一个示意示意图吧
请大家注意在应用的时候
我再次强调它的应用要注意的点
就是每一次的启动计数
都需要两次写操作
不再练经了
如果是初值是8位的话
那么写一次初值就可以了
如果是16位初值的话
因为这个芯片的数据通道只有8位
所以它必须要写两次
而且按照刚才控制字的格式
它必须先写入低8位初值
再写高8位初值
请大家注意它的控制命令字
一定写入的是控制寄存器
无论针对的是哪一个计数器的控制字
都写入到控制寄存器中
而它们的初值
则是写到相应各自的计数器中
而计数器
或者控制寄存器
它们怎么区分
就是看A1A0的状态
我们下面来看一下初始化程序的编写
按照我们刚才的时序流程
首先写控制字
接着写初值
如果初值只有8位就写完了
如果初值有16位
那么写完低8位
我们还要再写高8位
当有2个以上的计数器在工作的时候
也就说我们说这个芯片内部有3个计数器
我们如果只有一个计数器工作
刚才那一段程序那个初始化就完了
那么如果有2个或者3个都要工作昵
那么我们就需要每一个都要初始化
我们可以先初始化计数器0
写入它的控制字
写入它的初值
然后接着我们按部就班
再初始化计数器1
接着再初始化通道2
把这3个都完了
这3个计数器开始工作了
这是一种初始化的方式
还有一种初始化的方式
也就是说我可以把3个计数器
也就说如果3个都用到的话
3个计数器的所有的控制字
都依次写入
然后分别写入它们的初值
也是可以的
就说这2种初始化的模式都没有问题
但是原则性大家一定要注意
就是一定是要先写命令字或者控制字
再写初值
这个不能改
因为人家的工作时序这样规定好了
我们最后用这样一个例子
来结束这个芯片的学习
这个例子是这样这个例子很简单
就没有任何的工程背景
我们在这章学完了后
我们会用一些综合的练习来帮助大家
理解这2个
可编程并行接口芯片的应用
所以现在我们先讲
一个非常简单的应用例
这个应用例是这样
要采用这个8253做定时计数器
它的接口地址已经告诉你
0120H到0123H
大家看这个接口地址范围
显然只有4个编码
所以它是一个全地址移码的方式
那么输入8253的时钟频率是2MH
现在要求你干什么昵
要求计数器0每10毫秒输出
一个CLK周期宽的负脉冲
计数器1输出10KHz的连续方波信号
计数器2在定时5毫秒以后
产生输出高电频
那么我们从这个要求里头
我们可以要得出哪些这些信息昵
我们来看一下
首先我们从这些要求里
我们要得出来
这个8253这个接口有几个计数器工作
现在我们看
已经告诉你计数器0应该怎么样
计数器1应该怎么样
计数器2该怎么样
也就是显然它的3个通道
或者3个计数器都是要工作的
第二我们要知道
每一个计数器它的工作方式
我们现在来分析一下这个题目
计数器0要求每10毫秒
输出一个CLK周期宽的负脉冲
这个每字实际上就隐含了一种循环
就连续的意思
所以它显然不可能
是方式0方式1方式4方式5
只能是方式2和方式3
那么这个方式3是连续方波信号
这里头这个后面的描述
显然它非常符合方式2波形的特点
所以它是工作在方式2的
那么计数器1要求
输出10KHz的连续方波信号
非常明显它就是方式3
那么计数器2要求
定时5毫秒之后产生输出高电频
定时时间到输出高电频
可以是方式0可以是方式1
那么你选择哪一种
要根据具体题目的要求
这个题目里头没有任何其他
更高的一些就是它的控制节点之类的要求
我们这些我们后面通过事例来给大家解释
所以我们首先选择软件启动
这样就会显得线路比较简单
所以这里我们可以确定它工作在方式0
那么第3个信息
把这些方式都确定以后
我们从它这个题目要求里
我们还要能够得出
它每一个计数器的初值是多少
我们现在看
8253能够提供的
就是外部时钟能够提供的
工作频率是2MK
那么这个是每10毫秒
输出一个CLK周期宽的负脉冲
这个就意味着计数器0
它的一个周期是10毫秒
那么现在的时钟频率2MH
这个频率的周期是多少昵
2MH分之一
就是0.5个微秒
那么意味着我们要数多少个0.5微秒
才能输出10毫秒来
才能达到一个10毫秒的周期
所以这个也就能算出它的初值
依此类推就都可以算出来
第4点我们要知道
它的计数脉冲频率
这个是题目已经得到了
这没有问题
所以把这些要求都得以后
我们现在就成这个题目的信息里
我们就要能够看出这些要求
好最后这个题目要求
大家要设计线路图
以及编写相应的初始化程序
我们由刚才这样的一个分析
我们很容易就能够得出
它们3个计数器的初值
比如计数器0
它是这样子算出来
计数器1计数器2
我们可以看一下这些初值
这每一个初值都是小于65535
或者说65536
也就说它的
16位的计数寄存器
和16位的初值寄存器
都可以放得下这些初值
那么这就没有问题了
如果初值更大超出了16位寄存器
能够放得这样的一个范围
也就是说超出了65536
那怎么办
那我们后面用事例来给大家解释
然后昵我们根据刚才对工作方式的分析
我们可以得出
这3个计数器它们的控制字
因为计数器0工作在方式2
而且它是16位的计数初值
所以我们很容易得出
它的控制字应该是这样的格式
可以是这样的3234H
当然也可以是3CH
因为这个第3位可以是0
也可以选择1
当然选010显得更像2
对吧所以它应该更好
对于计数器1昵工作在方式3
所以它是一个8位的计数初值
只有200
所以我们选择第8位放初值的话
它的控制字就是这样的格式
依此的计数器2是这样子的格式
把这些准备工作做完了
我们下面就可以开始硬件设计
和软件设计
我们先来看一下它的异联逻辑
就那个硬件电路的一个设计方法
现在3个计数器都要工作
而且计时器刚才我们说
计数器2采用的是方式0
所以软件启动
计数器0和计数器1
一个是方式2一个是方式3
方式2和方式3
都可以软起动硬启动都行
那么这种情况下我们
现在这个题目又没有更多的辅助的要求
所以我们都选软起动
那么都选软起动
我们3个GATE端都可以接到电源上
就显得比较简单
那么我们刚才算了所有的初值
都在16位有效值长里允许范围内
所以它们的CLK信号
也都可以直接连接到外部的时钟源
就是2MH的这样的一个频率
那么OUT就可分别的输出了
所以下面的这些
我们就不在解释了
可都是一一对应的这种连接了
移码电路的设计
我们在这里也不要再涉及了
因为我们都学了那么多的例子了
有兴趣的同学可以自己来设计
根据刚才的题目来设计它的移码电路
那么外面这个连接
像我们刚才分析
所有的GATE端我们接到电源
所有的CLK端
都接到2MH的外部时钟输出
所有的OUT端
分别连接到3个控制对象的外部设备中
好那么我们看它的初始化程序
我们就用计数器0来作一个例子来解释了
计数器1和计数器2的初始化是类似的
只是它的通道地址有点不一样而已
这个留给大家自己做练习
计数器0它的初始化
根据刚才我们看到的
那些时序也好
它的控制流程
就是初始化程序的流程也好
都是要先写控制字
再写初值
而控制字写入的地址
是控制寄存器的地址
初值写入的地址
在这里就是计数器0的地址
那么怎么知道刚才那个
0123到0120到0123
哪一个是计数器0的地址
哪一个是控制寄存器的地址昵
就是看最低2位的状态
我们刚才前面已经讲了
最低2位是1 1
就表示控制寄存器最低2位是0 0
就表示计数器0
所以0123
就一定是控制寄存器的地址
刚才我们说了
它的计数T0的控制字得出来是34H
所以这3行指令
就把控制计数器T0的控制字
写入到控制寄存器里了
下面我们要给它写初值
所以初值的写入地址必须是计数器0
所以0120的最低2位是0 0
这就是计数器0的地址
刚才我们已经算出来
它的初值是20000
很长 对吧
所以我们先给它送到AX里
但是昵我们说
16位初值根据控制字格式的要求
16位初值必须先写低8位
后写高8位
所以我们先把第8位写进去
写到计数器0
那么高8位昵
因为我们OUT指令不允许
这个累加器这个操作数值AH
所以我们必须把AH
送到AL里头再输出
这样的话
通道0的初始化就结束了
好通道1和通道2的初始化工作
就留给同学们自己来练习了
有关8253
我们就介绍这么多
最后我们做一个简单的回顾
首先8253是一个
可编程的8位并行接口
但是它的内部3个计数器
全部是16位的
这句话没写在这里
但是这一点再次强调啊
所以它能够接收的最大计数初值
都是16位值长的
它可以实现对
外部设备的定时计数控制
不是一个通道型的
而是一个控制型的接口
它的计数或者定时的方式
是采用减法计数器的
所以8253通过
你送不同的计数初值
可以实现比较长时间的
这种定时或者计数
所以有时候简单的说
它也属于一种硬件定时器
好有关8253的学习
我们就解释到这里
下一讲我们将来给大家介绍
另外一片可编程的并行接口
是一个通道型的接口8255
好 今天就到这里
-第1讲 关于本课程
--关于本课程
-第2讲 微型计算机系统
--微机系统_01
--微机系统_02
-第3讲 微型计算机一般工作过程
-第4讲 数制与编码
--计算机中的编码
-第5讲 计算机中数的表示与运算
--数的表示
--符号数的表示
--数的表示与运算
-第6讲 基本逻辑运算与逻辑电路
-第7讲 本周小结
--本周小结
-第1周 微型计算机基础概论--第一周单元测验
-第8讲 8088微处理器
-第9讲 8088 CPU主要引线及机构
-第2周 8088微处理器--第二周单元测验
-第10讲 实模式存储器寻址
-第11讲 8088系统总线
--8088系统总线
-第12讲 微处理器小结
--微处理器小结
-单元测验--作业
-第13讲 指令概述
--指令概述
-第14讲 寻址方式
--寻址方式
-第15讲 通用数据传送指令
-第16讲 地址传送指令
--地址传送指令
-第17讲 输入输出指令
--输入输出指令
-第4周 数据传送指令--第四周单元测验
-第18讲 算术运算指令
--加法运算指令
--减法指令
--乘除运算指令
-第19讲 逻辑运算指令
-第20讲 移位操作指令
--移位操作指令
-第5周 算术运算、逻辑运算与移位操作指令--第五周单元测验
-第21讲 关于串操作指令的说明
--串操作指令说明
-第22讲 串传送与串比较
--串传送与串比较
-第23讲 串扫描指令
--串扫描指令
-第24讲 串装入与串存储指令
-第六周单元测验--作业
-第25讲 程序控制指令说明
-第26讲 转移类指令
--无条件转移指令
--条件转移指令
-第27讲 循环控制指令
--循环控制指令
-第28讲 过程调用指令
--过程调用指令
-第29讲 中断指令
--中断指令
-第30讲 处理器控制指令
--处理器控制指令
-第31讲 指令系统小结
--指令系统小结
-第7周 程序与处理器控制--第七周单元测验
-第7周 程序与处理器控制--第七周作业
-第32讲 汇编语言源程序
-- 汇编语言源程序_01
-- 汇编语言源程序_02
-第33讲 伪指令
--数据定义伪指令
--其它伪指令
-第34讲 系统功能调用
-第35讲 汇编语言程序设计示例详解
--程序设计示例1
-第36讲 汇编语言程序设计小结
-第8周 汇编语言程序设计--第八周单元测验
-第8周 汇编语言程序设计--第八周作业
-第37讲 半导体存储器概述
--半导体存储器概述
-第38讲 内存单元编址
--存储单元编址
-第39讲 随机存取存储器RAM
-- RAM_01
--RAM_02
-第40讲 只读存储器ROM
--ROM_01
--ROM_02
-第九周单元测验--作业
-第41讲 半导体存储器扩展
--存储器扩展_2
-第42讲 半导体存储器小结
--半导体存储器小结
-第十周单元测验--作业
-第十周作业--作业
-第43讲 基本I/O接口
-第44讲 简单接口芯片
--简单接口芯片
-第45讲 基本输入输出方法
--基本I/O方法
-第46讲 简单I/O控制系统设计
-第47讲 中断技术
--中断技术1
--中断技术2
-第48讲 输入输出与中断技术小结
--本周小结
-第十一周单元测验--作业
-第49讲 可编程定时计数器
-第50讲 可编程并行接口
-第51讲 可编程接口小结
--本周小结_01
--本周小结_02
-第十二周单元测验
-第52讲 模拟量的输入输出
--模拟量的输入输出
-第53讲 D/A转换器
-第54讲 A/D转换器
-- A/D转换器_01
-第十三周单元测验--作业
-第55讲 I/O接口系统综合设计示例详解I
-第56讲 综合设计示例详解II
-第57讲 结束语
--结束语