当前课程知识点:微机原理与接口技术 > 第14周 系统综合设计示例详解 > 第56讲 综合设计示例详解II > 综合设计示例详解II_01
大家好 这一讲我们继续来
通过示例给大家展示
如何设计I/O接口控制系统
就是通过两个综合的示例
在学习这个之前
我们回忆一下我们在上一周最后那一讲里头
就是介绍A/D转换器的时候
在最后一页PPT上 我们曾经给出了
我们利用ADC0809
实现循环采集8路模拟量
数据的这样的一个控制流程
我们并没有给出大家的
我们并没有给出
具体的程序代码
在这一讲里头我们也不再针对那个示例
来继续完成这个工作了
因为那个相应的程序代码
我们教材上已经有过完整的提示
一个描述
也就说如果大家根据那样的一个控制流程
自己没有办法设计出具体的程序代码的话
请你们去看一下书
这个教材第八章最后
给出了整个基于那样一个控制流程
一个完整的程序代码
那么在今天这一讲里头
我们同样 我们照样会通过示例
来帮助大家理解
怎么样实现数据采集以及
不仅仅是采集而且是控制这样子的一个应用
也就说在这一讲里头我们通过两个示例来
综合一下我们可编程并行数字接口8255
以及我们的A/D转换器 大家结合在一起
实现一个稍微有
一定应用场景或者有一个实际控制
实际的工业控制这样子的一个背景的
这种控制系统的设计方法
好 下边我们先来看第一个示例
这个例子是这样
是一个
温度控制系统
那么它是具体的是一个炉温控制电路
它的原理图就在这个下边
在这个图里头
8位A/D转换器的输入模拟量的范围是0到5伏
这是给定的
那么要求将炉温控制在允许的范围内
我们假设它的上限
和下限分别是MAX和MIN
如果低于下限或者高于上限
也就是我们说的超出阈值的话
那么就调用控制算法子程序F(X)
这里也假设
这个控制子程序是已经事先编好的
就相当于我们已经
它已经在函数库里头
可以拿来用的一个现成的子函数一样
那么将子程序的运算结果
这个运算结果我们也假设在AL中
从8255的PB口输出
对炉温进行调节
否则就继续执行以上操作直到有键按下为止
这个题目呢它实际上
可以应用有很多的
实际的应用背景
也就说它可以用于比如锅炉的温度控制
比如应用于其他的各种温度控制
有温度控制需求这样的场合
温度控制我们想
首先要知道现在的温度是什么
所以它一定要有温度检测
我们从前面学
上一周学的那些内容里我们已经知道
一个
温度的采集或者温度的检测是通过
是需要通过传感器的
那么传感器的输出经过那么
那么一个一个若干个环节最后就
进入到A/D转换器
所以我们现在对于现场温度的采集
通过那样一个
前面的那些过程我们在这里就把
因为不是我们这个课的主要内容
我们就把它忽略了
我们只认为它来到了A/D转换器的门口
那么A/D转换器的目标或者它的功能
就是把这个输入的连续变化的温度值
转换成数字信号进入到系统
所以它的总体的工作过程是这样
就说我们去采集现场的温度值
然后把它转换成数字信号进入到系统
系统拿到这个数字信号以后通常会和它自己
本身的设定值进行比较
在这个题目里它的设定值就是在MAX和MIN之间
这是我们称为阈值
那么如果在这样一个阈值范围内
那么就OK 也就说一切正常
那么超出了阈值 就说有可能它大于
最高温 或者低于低温
那么这个时候我们必须要进行处理
那么我们可以很
简单的假设一下
高于最高温度我们可能就要降温
低于低温了我们可能要加温
就是这么一个工作
那么这个题目就是
我们现场采集的这个温度
所对应的这个模拟信号
通过转换之后
我们通过8255这个可编程接口
进入到系统
系统然后对你转换过收到的
读进来的这个数字信号
进行对比
然后如果在这个阈值范围内
就OK就不理睬它了
如果要是当然就还继续检测
不是完全就退出
那么如果是超出了这个阈值范围
那么它就要根据它是大于还是小于
发出相应的控制
也就说它把它
这个F(X)输出的这个值
也就是它的控制值 也就说AL里面的值
通过D/A转换器转换成相应的模拟信号
然后去控制现场的调节机构
比如说电磁阀 让它加温或者降温
这就是这样子的一个
工业过程控制的一个应用场景
我们把它
抽象出来
仿真在这里
给大家来看一下
当然实际的工业
控制过程 我们
到底是不是一直不停的在检测炉温呢?
你有可能一直 对吧
但是我们必须要让它有一个停止的环节
一般可以是一个开关或者是什么啊
在这里我们在仿真环境下我们同样的
跟之前的那些 上一讲的案例一样
就是直到有任意键按下就退出
完成这样一个工作也
同样牵扯到软件设计和硬件设计两部分
硬件设计呢
刚才题目里已经给出来
8255的接口地址范围是这样一个范围
这个范围里头大家可以看到
最高这一位是A11
我们已经知道 这个在8088
或者8086整个这个系统中间
我们能够管理的端口地址最多是64K个
也就是说它的端口地址码的长度是16位
但是在这里呢 只给出了11位
意味着它的高4位没有给出来
没有给出来意味着高4位是可以是任意值
也就说你这高4位根本就没接
没接你就不能够在这里直接把它接成0或者设成1
这一点我们在前面讲部分地址译码的时候
实际上已经给大家提示过
所以在这里呢我们要设计这个硬件线路
我们只能采用部分地址译码
有关这个设计的过程
因为译码电路的设计讲了很多遍
我们这里不再重复了
这就是我们最终设计出来的一个原理示意图
有了这样一个示意图如果你有了芯片具体的引脚图
那么我们就
可以很方便的就把它直接转译成
转换成原理图了
具体的原理图
好了 这个是硬件的设计
下面我们主要来介绍一下
如何实现它的软件的控制程序的编写
我们来分析一下
首先这个A/D转换器
我们没有题目没有告诉你必须用ADC0809 对吧
我们假设这就是一个可能是某个型号的A/D转换器
它这是一个单路模拟量输入
而它的工作时序是这样
从这个时序上我们也
很容易能够看出来 它肯定不是0809
从这个工作时序 我们就应该能够得出
它的工作流程
因为时序本身反映着这个集成电路芯片
它的工作原理
第一 它要启动变换
而且它的启动变换的信号是一个下降沿有效的
也就是它的START信号
启动以后它也
所有的A/D转换 它都有一个转换的时间
所以也就说它需要一个转换过程
在这个转换过程里头 它的
它是不能让你读结果的
所以大家看到这个时序里头
EOC在高电平的时候
对应到的是它启动的过程中
所以EOC为0的时候表示转换结束
那么转换结束以后
看来这个A/D转换器的内部也有
三态门的控制信号
也就是它有开门信号 就是OE信号
OE信号和0809一样
是高电平有效
那么在它有效期间
我们的数字信号也就是转换结果就读取出来了
因此从这个时序里我们就可以看出来
数据采集程序的核心流程
就是首先启动变换
然后去判断EOC端的状态
如果这个是0 表示转换结束
如果EOC是1 表示它还正在转换过程中
因为这个EOC端是
低电平表示转换结束
所以如果你打算采用
中断控制方式
来获取EOC的状态的话
你必须把它的输出再取反
如果用查询工作方式的话
那么你就可以直接去读EOC端的状态了
等你读到了低电平
那么这个时候我们就可以去读取转换结果了
怎么读呢?
必须要把OE要送上1 也就是说
要使得它内部的三态门开门
然后就读取过来
这就是我们数据采集程序的核心流程
就这四个步骤
相对于我们在前面讲0809的时候我们已经发现
这里要少一些事情
因为它这是单路模拟量输入
首先不需要去设置它的通道地址
当然也就没有地址锁存
就少了这样两步
因此 它的控制流程
如果我们用流程图来描述的话可以是这样
首先要初始化
当然在这里的初始化部分
包括了8255的初始化
然后呢 就是我们刚才说的
核心流程送启动变换的信号
判断EOC端的状态
然后看看EOC端是不是0
如果不是0
那么OK
就表示它没有转换结束继续去读
这是显然很标准的查询工作方式的控制流程
或者说控制方式
那么EOC端如果是1了
如果是0了
那么就说明它转换结束 这个时候送OE信号
读转换结果
那么一次就做完了
按照刚才的题目要求
我们对读取出来的结果
要判断下
它是不是在我们设定的阈值范围内
如果超出了这个阈值我们就要调用
调节子程序
调节完了以后 我们再去判断有没有键按下
那么如果说它没有超出这个阈值
说明它一切正常
我们就直接去判断有没有键按下
如果有键按下 那这个就结束了就退出了
如果没有键按下呢?
按照题目刚才的要求要重新开始
就继续刚才这个过程
也就说我们再重新开始启动变换
也就说我们去启动下一次数据采集的这个过程
大家看这个流程跟我们前面讲AD
就上一周讲A/D转换器最后那个
控制流程比较起来
它的差别或者说它的不同点
一个是在这里多出了要对阈值的检查
和
调节子程序的调用
它少了就是我们的通道地址以及地址锁存信号
所以把这个例子看完了
我们其实前面那个0809的那个循环
8路模拟量采集 循环采集的那个程序
大家也很容易就自己能够编出来
当然因为我们已经给了大家很详细的控制流程
好了基于这个流程 我们现在来看程序
这就是8255的初始化程序
我们编写成了子程序的结构
这里我不再详细的去解释了
就是提醒大家一下 子程序
它的定义方式
以及里边的参数保护方式
还有最后一条指令一定是RET
它用来负责返回断点
在这个子程序里头
我们方式控制字选择91H为什么?
因为方式控制字的最高位是1
另外呢
它的A端口 B端口 C口低位和C口高位
都被用到了
A口作为输入 刚才我们看到那个图里头
它是用来读入它的
温度值的
然后它的B口是输出
用来控制现场的执行机构的
那么C口的
低位是输入 用来读EOC端的状态的
C口的输出
是用来去控制产生相应的START和OE信号的
所以它就这个方式控制字91H是个唯一值
那么底下呢
09H和0AH这是两个位控制字
一个是我们看到 根据前面那个图
C4位是要连接到START端的
所以START呢 根据时序图它的初始状态一定是高电平
因为它必须要用下降沿来启动
所以我们初始它为高
然后OE端呢 因为它高电平是开门
所以初始情况下它一定要是低
这就是两个控制字的来源
下边我们就开始来看它的控制程序
首先这里我们定义了一个在
把阈值的上限和下限定义在数据段里
也就是它的MAX和MIN
我们这里因为这是一个示意性的程序了
就说它的MAX到底等于几
MIN到底等于几
我们在这里没有给出一个具体的数字
我们用问号来代表它可能是一个某个值
当然你具体自己做系统的时候
这个MAX值和MIN值肯定要设定为一个具体的值
这是初始化部分
好了 整个按照我们刚才的控制流程
初始化结束之后
下边就是启动变换
对吧 启动完了以后
然后就是去读取
它的这个EOC端的值
因为刚才EOC端的这个状态是通过C0位进来的
所以底下就是测试一下
C0位的状态
然后
如果它的这个是C0位
也就是说EOC端是低电平的话
那么现在就输出OE的信号并且读转换结果
唯一跟之前我们其他的工作过程不一样的地方是
读取了转换结果之后
数据采集程序本身应该是差不多了就完成了
对这个具体的题目是
读完了这个读取了这个结果之后
我们要去看一下它的阈值是不是在
允许的范围内
我们这里用了JA和JB这两条
条件转移指令
也就说你读取的值
在AL里头和
刚才我们在这个
MAX里的值和MIN里边的值
进行比较
如果这个读取的值大于这个MAX值
那就说明它大了
那么这个时候我们就要转移到
去调用这个子程序
如果小于下限
同样的也就要去转向这个FIN
就是去调用那个调节子程序
如果它既不大于上限也不小于下限
也就说它在阈值范围内的话
那么它就直接转到GOON
GOON这个地方是什么?
就是我们前面已经讲过
它是有判断有没有任意键按下
如果没有任意键按下
那么就直接又回去了 又到AGAIN这个地方
再次启动变换
也就说再次去实现数据采集
那么如果是
有键按下那就退出
这个就是我们
整个实现锅炉温度控制
或者说任何一个温度控制系统
它的一个程序就是这样 控制程序就是这样
对于具体的这个程序来讲
跟一般的A/D转换器芯片的应用
或者一般的数据采集程序比较起来
它就是多了一个阈值的比较
第二个示例呢我们同样有一定的应用背景
这个应用背景是这个题目是
设计一个水库水位的监视系统
我们知道每年像这种夏季呢
它可能就尤其是南方就特别容易发洪水
那么这个洪水
怎么样 我们怎么样知道要发呢?
我们实际上是不停的在去检测
比如江面的水位的高低
或者水库水位的高低
通过它 如果超出了某一个
我们的极限值 我们必须要报警或者比如泄洪
或者什么样
采取一些手段
那么在这个题目 我们就把这样子的一个
实际的应用场景我们做简单的一个抽象
我们把它变成一道题目来给大家讲
题目要求是这样
通过ADC0809的IN0端监测水位的高低
这里给出了具体的A/D转换器的型号了
系统始终监测水位的高低变化
水位到达最高点的90%的时候开始报警
也就一般我们不会要求它到百分之百
就到最高位了
这时候害怕就来不及
那么到90%就要报警
扬声器发出0.5秒500Hz
和0.5秒1KHz交替变化的声音
然后报警灯要点亮
这个和我们之前的这个应用
或者之前讲的示例有一点不同的是
这个时候要发出两种不同频率
交替发出两种不同频率的声音
因为这样子的很可能它的震撼效果很会更好一点
那么水位恢复正常以后系统不再报警
当然要
一旦报警了 到了90%了你开始报警了
但是过一会可能水又下去了
那么这个时候报警就要自动要关掉了
这个地方唯一的注意的地方
就是
扬声器要发出两种频率交替变化的声音
我们看一下怎么来实现这件事情
我们
利用8253来产生音频报警信号
假设这个8253的地址范围是
F804H到F807H
利用8255来控制ADC0809的A/D转换和报警控制
也就说我们用8255来接收A/D转换器
输出的这个水位信息
然后呢 用它再来控制报警
我们同时同样也假设
这个8255的地址范围是F800H到F803H
从这两个地址范围大家可以很清楚的看出来
这个显然都是采用的是全地址译码的方法
-第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讲 结束语
--结束语