当前课程知识点:微机原理与接口技术 > 第14周 系统综合设计示例详解 > 第55讲 I/O接口系统综合设计示例详解I > 综合设计示例详解I_01
大家好
到现在为止我们已经
介绍完了我们这门课程
需要大家了解的所有的内容
也就是说我们的课程学习实际上
到这一会已经可以结束了
但是为了帮助大家能够对我们输入输出技术
以及输入输出接口系统它的一些
设计上能够有一些更深入的理解
我们在这一周里我们用一些示例
来帮助大家进一步的理解
这个I/O控制系统它的设计方法
这一周我们一共有三讲
其中两讲是我们一些输入输出数字接口
和模拟接口它的一些综合设计的
一些示例的详解
最后一讲是我们整个这门课程的结束语
也就是帮助大家把整个课程
所应该涉及的内容
或者应该希望大家理解的内容
我们做一个总结
好 现在我们在这一讲里头
我们先来给大家介绍两个示例
第一个例子是这样
假设某一片可编程定时计数器8253
它的端口地址范围是FFE8H到FFEBH
并且外部电路
能够给这个芯片提供的这个时钟频率是2MHz
那么这个题目的意思从这样一句话的描述里
我们可以看出来
这片8253的端口地址是
完整的四个端口地址
也就是说它的地址范围正好是4
那么现在 而且是全部的16位地址
所以如果要设计这个芯片和系统的连接的话
肯定采用的是全地址译码的方式
另外 外部时钟能够
外部时钟电路提供的时钟频率是2MHz
那么题目要求什么呢?
首先要求设计这个芯片和系统要实现它的连接
也就是说我们要完成它的硬件线路的设计
并且编写程序实现在OUT1端产生
周期为1秒的连续方波
这个要求里头我们可以看出来
它在8253这样一个
接口芯片里头本来应该有三个通道
但是它现在从这个题目的要求上
我们可以看出来它实际上只需要一个通道
也就是要求在通道1
它的输出端产生1秒的连续方波
因为8253我们知道它是一个非通道型的接口
所以它
对它的应用
一旦这个硬件线路设计完成
就只需要编写相应的初始化程序
也就是说把初始化程序编写完启动之后
这个芯片它就可以自己工作了
然后用它来控制外部设备
而不再需要通过它进行信息传输
因为它没有这个能力
好 我们现在看这样的一个题目要求
我们来分析一下
首先外部时钟频率是2MHz
这个8253的端口地址是这么样一个地址范围
从这个地址范围里
我们按照之前我们讲过的办法
直接把它用二进制码来写出来
那么最低这两位就是它的片内地址
我们现在题目要求从通道1输出一个
1秒钟的连续方波信号
那么这个通道1的片内地址是多少?
就是01 对吧?
最高这一位是A15
好 根据这样子的每一位的状态
我们能够设计出
相应的译码电路
也就是说能够实现这个芯片和系统的连接
这一点我们不在这里再详细讲了
因为有关这部分的内容
我们已经学习的非常多了
等下我们就直接把答案呈现给大家就可以了
另外的一个问题
也是我们这一个示例
看上去很简单
但是之前我们一直没有涉及过的一个问题
就是这个
题目要求在8253OUT1端
输出周期为1秒的连续方波
从这个要求上我们能够看出来
这个通道1一定工作在方式3下
因为只有方式3能够具备
输出连续方波信号这样的一个能力
但是外部时钟频率是2MHz
输出的连续方波要求是周期为1秒
那么也就是频率是1Hz
那么现在就是说我们需要通过通道1
把2MHz频率
降为1Hz的频率
我们回忆一下8253这个可编程定时计数器
因为它是一个减法计数器
我们说减法计数器就是说
事先我们一定要给它设定一个计数初值
然后每过一个CLK周期它那个初值减1
是这样一个过程
那么这个初值的设定它的原则是什么呢?
就是 第一要看它的外部时钟电路提供的条件
也就是它的频率是多少
现在是2MHz
第二 要看它的需求
就是它的OUT端要输出什么样频率的波形
现在我们需求是1Hz的连续方波
条件是2MHz的输入脉冲
那么现在我们的初值就很容易就计算出来了
如果按周期这样算下来的话
是这么样一个计数初值
这个计数初值我们看一下有多大
个 十 百 千 万 十万 百万 两百万
这个计数初值算下来这么大
那么我们现在回忆一下我们之前讲
8253的时候我们曾经讲过
8253它内部有三个独立的计数器
或者说独立的计数通道
它的每一个通道里头都包含了两个寄存器
一个是十六位的初值寄存器
一个是十六位的计数寄存器
那么不管是哪一个寄存器 它都是十六位的
它就意味着它能够存放的计数初值最大
只能是十六位字长
考虑到我们8253的三个计数通道
都是减法计数器
所以我们说它的最大计数初值是65536
也就是说10000H
那么能够看到的那个是0000H
也就是0
因为0减1就是FFFF
这一点我们在前面都已经介绍过了
那么不管怎么样
它就是说最大初值是六万多
至少数量级是这样
但是现在
按照这个题目的要求我们需要能够
需要的计数初值是两百万
那显然这一个计数器是放不下的
也就是说利用这个
通道1这样一个计数器没有办法实现
将2MHz的频率降为1Hz的频率
所以这个时候我们怎么解决这个问题呢?
我们需要借助另外一个
通道或者另外一个计数器
实现一个两级分频
这个两级分频怎么实现呢?
我们就是需要通过一个级联的方式
也就是说比如我们把2MHz的这个外部时钟频率
接入到我们里边
通道0也就是CLK0端
然后使得OUT0端输出一个
频率稍微低一点的
连续方波
这个低一点低到什么程度呢?
你可以去设置 比如我们低到1KHz
那么也就是说通道0可以实现
我们用通道0来实现将2MHz的频率
降成1KHz的频率
这个没有问题
对吧 因为这样的话它的初值很容易得出来
是2000
那么如果我们这个时候把
OUT0端输出的这个1KHz的频率来作为
CLK1的输入信号
也就是作为通道1的时钟脉冲的话
那么我们通道1的输出
也就是OUT1端就很容易能够实现
输出1Hz的方波信号了
这就是所谓的两级分频
两级分频的核心意思
就是将一个高频要直接转换成低频
因为我们实现不了
这个计数器达不到这样子的一个要求
所以我们先把一个高频
变成一个中间的频率
然后把这个中间的频率再变成更低的频率
这样子就叫两级
那么如果你是更高频率变成更低频率
甚至两级都达不到呢?
那就要三级
所以这种多级分频在整个
信号处理系统里头还是经常会用到的
因此我们可以选择将外部时钟信号接入
通道0的CLK0端
然后在OUT0端输出
一个低一点的频率
并且把它送到CLK1
那么现在显然
我们要让OUT0端的输出波形作为
一个CLK信号
显然OUT0端应该输出一个连续的波形
当然你输出一个
工作在方式2下输出一个
不对称的连续方波也可以
但是更好的来讲应该输出一个连续的对称方波
所以我们应该让通道0也工作在方式3下
那么OUT0端输出连续方波
它的工作频率设置为多少比较合适呢?
我们有一个原则
现在我们这里给出大家说设置成1KHz
实际上这个1KHz是不绝对的
它的原则到底是1K还是2K
原则就是
这两个通道 也就是说两级分频的两个分频器
它的通道的计数初值算下来它们的乘积
要等于我们刚才
计算出来的原始的两百万就可以了
这个什么意思我们可以继续来说一下
比如我们现在
CLK0是2MHz 对吧?
然后它的输出的OUT0端变成1KHz的话
那么这个通道0它的计数初值是多少呢?
或者说计数器0它的初值是多少呢?
从2MHz变成1KHz大家很容易得出来它是2000
那么如果我们现在把这个OUT0作为
计数器1的CLK信号 也就是说
把它作为CLK1的信号的话
也就是说CLK1就变成了1KHz了
那么OUT1端要求输出1Hz
好了 那么我们
计数器1或者通道1它的输出
它的计数初值是多少呢?
也就很容易得出来是1000
那么现在这个1000乘以2000是不是正好等于两百万
也就是说这两级分频下来以后每一级通道
它的初值
可以是2000 可以是1000 可以是500
但是两级通道它们的初值的乘积
要一定要等于原始算出来的这个两百万
这样的一个值就可以了
好了分析到这里呢
我们现在这个硬连线路的设计就很容易了
就可以直接给出这样子的一个结果
这就是我们整个
芯片和系统的连接
以及芯片本身它的这个
在外部这样子的一个连接的模式
就是这样的一个线路
还是那句话
这个图不是真实的原理图
它是原理示意图
因为我们在这里没有给出具体的管脚编号
硬连电路设计完了
我们下边无非就是软件的程序设计了
对于这个8253芯片来讲
它的程序就是它的初始化程序
因此我们下边就直接来给出这个8253的
初始化编程
刚才我们已经分析它的两个通道
都是要输出连续方波信号
所以它们都工作在方式3
因此我们就很容易来得出来它的
这个初始化程序了
这边是通道0它的初始化的程序
通道0这里的FFEBH
是整个控制寄存器的端口地址
因为它的最低两位是11
那么现在这个
通道0它的控制字为什么是36H呢?
我们可以很容易得出来
因为最高两位00表示现在是计数器0
然后刚才我们算出来的初值是2000
对于通道0来讲
所以次高两位是11
然后它们都工作在方式3
所以我们选011
最低两位我们按二进制计数
所以最低位就是0
因此 这个初始化程序我们就不再讲了
这是通道0的 这就是通道1的初始化编程
第一个例子我们就介绍到这里
从这个例子我们主要想给大家传达一个信息
就是8253这个计数器
可编程定时计数器芯片
它的内部有三个独立的计数器
每一个计数器可以独立的工作连接到
控制一个外部设备
它们也可以通过这样级联的方式
来实现一个两级甚至三级的分频
实现一个将更高频率
降成更低频率这样的一个工作
好 下边我们来看第二个示例
-第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讲 结束语
--结束语