当前课程知识点:微机原理与接口技术 > 第14周 系统综合设计示例详解 > 第56讲 综合设计示例详解II > 综合设计示例详解II_02
我们也分析一下
首先我们通过题目的这个给出的条件或者它的要求
我们可以看出来它是一个单路数据采集
所以它没有必要来设定通道地址
当然也就没有必要送地址锁存信号
因为ADC0809的输入为最大模拟量值的时候
它的输出的数字信号是FFH
为什么呢?
因为0809是个8位的AD转换器
那么相应的它的最小模拟量
输入最小模拟量值的时候 也就是它是0V的时候
那么输出的数字量就是0
因此 那么输入到最大值的百分之九十
它对应的数字量是多少呢?
就很容易的对应得出来了
那么也就是说我们要对读进来的AD转换器
输出的这个数字量我们读进来之后我们要去看一下
它到底是不是达到了230
也就是说16H 如果没有达到
那么就ok了 如果达到了那么就要报警
就是这么个意思
扬声器发出0.5秒的
500Hz和0.5秒的1KHz交替变换的声音
也就是来两种不同的频率
这两种不同的频率肯定要来自于
8253的两个通道
这个没有问题
而且是交替变化 连续变化的波形
我们在之前的例子我们讲过
要想控制这个扬声器通常我们用
方波信号或者正弦波信号
所以在这里我们用8253来控制的话
肯定就是连续的方波信号
所以这两个通道一定工作在方式3
但是产生的频率不一样
一个是500Hz 一个是1KHz
那么怎么样控制它们交替响呢?
用另外一个通道
产生这个周期为0.5秒的连续方波信号作为
对刚才前面两个通道的这种选通控制
因此分析到现在就是说我们要用一片8253的话
这个8253的内部的三个计数器通道
都要用到了
一个是产生500Hz的连续方波
一个是产生1KHz的连续方波
另外一个是产生0.5秒的连续方波
因此 如果刚才我们假设已经知道
它的输入的这个
时钟频率是50KHz的话
那么这三个通道的计数初值
我们就都可以算出来了
从算出来这个初值里我们可以看出来
三个通道的
这个初值都在我们允许的16位字长
最大值的范围内
所以这个就可以直接来利用了
然后我们自己设计
利用PC0来启动报警
这个就是我们的硬件系统的设计原理示意图
我们在这里不再跟大家解释这个译码电路的设计了
根据前面的介绍呢
大家以及根据我们这个题目给的条件
应该自己能够设计它相应的译码电路
在这里我们主要给大家解释一下这个
接口电路和它外部设备
之间怎么样子来连接的
我们看上面这个ADC0809 刚才我们说它是
通过IN0路来检测水位状态的
我们在这种仿真环境下
我们利用这样一个滑动电阻来模拟水位的高低
然后因为是从IN0进来 所以这个箭头画反了
大家要是从滑动电阻的角度这个箭头也就该这么画
那么这个时候ADDC ADDB和ADDA这三个
通道地址我们就直接接地了
也就是说不再需要了
那么我们主要来看这个
刚才说交替这个频率怎么样控制扬声器
能够来响
扬声器我们通过一个或门来驱动
那么或门的输入是两个与门
我们看与门其中有一个输入端
两个与门都有这么一个输入端连接到8255的PC0端
那么PC0端如果输出0的话
这两个与门就相当于都被关门了
也就是说这个时候与门的输出肯定是0
那么这个扬声器就不亮
就不响
所以我们要让扬声器不响
我们实际上只要在PC0端
输出一个0 这扬声器就肯定不响了
那么如果我们想让扬声器响
我们至少要让PC0端输出1
这个时候两个与门相当于被开门
那么到底是哪个与门
它的波形会输出呢?
因为上面这个与门是连接的OUT0
下面这个与门连接着OUT1
也就是说一个是500Hz 一个是1KHz
到底哪个输出呢?取决于这个OUT2
OUT2端当它输出
低电平的时候
这个与门
上面这个与门肯定被封门
因为它就输出0了
但是它如果输出低电平经过一个非门的话
相当于在下面这个与门的输入端
这个地方也变成1
如果这个时候PC0端输出1
这个非门输出也是1
那么底下这个与门相当于被打开
这个与门的另外一个输入端
也就是OUT1端的波形的状态就通过它输出了
那么这个时候扬声器会按1KHz的频率响
反过来如果OUT0端这个时候输出高电平
那么通过非门就变成0
那么下面这个与门就被封掉
那么上面这个与门就被开门
那么OUT0端输出的这个波形就会
通过或门输出来控制扬声器
那么这个时候扬声器就会按500Hz来响
那么这个OUT2 它的波形是这样
周期是0.5秒
也就是说它会让0.5秒去按500Hz响
0.5秒按1KHz响
这个就是我们实现频率交替
控制的这样一个电路
其余的跟我们前面的就没什么区别了
这里用PC0端除了控制这个扬声器之外
它同时控制这个报警灯
它没有在这里
用硬件来实现它的闪的问题
而只是让它亮
当然你如果要让它闪烁 你可以通过软件来实现
那么这个都是工作在方式3下
所以我们采用软件启动的方式
让GATE0到GATE2全部接+5V
刚才我们已经算了
它的初值都在允许的范围内
所以CLK0到CLK2这三个端都可以统一接上
接到50KHz这样的一个外部时钟电路上
那么在设计完了这个电路
下面要做的工作就是
这两个可编程接口芯片的初始化的工作
这个是8255的初始化
详细的注释都写在后边
我们就不再去详细的解释了
我们主要来 8253的初始化我这里就略掉了
我们来主要看一下控制程序该怎么编
这个是控制程序的流程
通道地址和启动变换这些工作
因为在这里实际上通道地址是不需要
已经都接死了
所以通道地址的锁存信号我们也就可以不用输入
如果一定要出去的话
直接就是让它是0就可以了
就等于把它锁掉
然后就
真正的程序开始实际上从启动变化开始
启动变换按照我们AD转换器的工作
统一的工作流程
一旦启动转换之后下边就要去
判断转换有没有结束
如果没有结束就要继续去判断
如果转换结束了
这个时候去读入水位值
也就是水位的转换的数字量
读入转换值之后
唯一的就是下边这个工作
这个跟我们上一个例子是一样的
也就是说通过要判断一下它的阈值
是不是超过了上限
在上一个示例里头
我们的阈值要判断它是不是大于高位
和低于低位
但是在这里不存在低位的问题
我们只需要去看一下它有没有高于
上限 也就是说达到了
最高位的百分之九十
如果达到了就去报警
如果没达到就不报警
不管是报警还是不报警
反正最后我们要循环完成这个
始终进行水位检测
因为题目告诉你要始终持续的对水位进行检测
这三行语句就是启动转换的过程
这里的F803实际上是控制寄存器的地址
我们在这里用了位控制字的方式
来使得PC1等于0
因为在前面初始化的时候我们已经设置PC1
等于高电平了
也就是说为产生启动信号做好准备了
现在我们再把它置成0
那么由高到低就有一个下降沿的跳变
这个下降沿就作为启动信号了
这几行语句就是
启动了之后我们当然就去判断它是不是转换结束
转换结束我们是通过读取EOC端的状态来判断的
EOC端的状态根据前面的连接图
我们是通过PC7位读进来的
所以这个时候我们只需要保留第七位
也就是与80H
把其他的低七位都给它屏蔽掉
最高位留下来
如果EOC端的状态是低电平的话
那么就表示没有转换结束
如果是高电平 那么这个时候就读转换结果
因为这里我们用了0809
所以它的工作时序我们不再打在这里了
我们之前已经很详细的介绍过了
读转换结果按照
硬件线路设计我们是通过a端口读进来的
所以现在我们设置了F800H 这是a端口的地址
顺便再次提醒一下
这个F800H前面那个0
是给编译器看的 也就是给汇编程序看的
让它知道这个F是数字
读进来水位值以后按照我们的控制流程
下边我们就要去判断它是不是高于最大值的90%
那么刚才我们已经算过
在最大值的90%对应的数字量就是230
所以下边我们跟230进行比较
如果大于230就报警
那么否则如果没有大于 那么就不报警
不报警我们大家看用这样几条语句
F803刚才我们讲过这是控制寄存器的地址
因为它最低两位是11
现在给AL赋值0
赋值0什么意思?实际上就是让PC0端置0
PC0端置0刚才我们已经说过
它就是把底下那个让
控制扬声器的那两个与门全部封死了
这样扬声器肯定不会响
然后无条件转向L
又重新开始继续启动转换
又继续读取水位的值
那么如果是超出报警的话
报警怎么办呢?
报警我们也用了这个
控制字的方式来报警
报警我们就是将PC0置成1
置成1就是将与门都开门了
那么这个具体怎么报警
实际上我们是通过8253的
这个因为我们事先肯定要对它进行初始化
所以一旦初始化之后
这个时候把PC0置成1
8253本身它就连续在不断的输出方波信号
一旦输出PC0置成1
相当于把两个与门都打开了
那么这个时候
它的通道0 通道1和通道2
原来输出的方波信号本来
因为PC0等于0
两个与门都被封掉
你刚才三个通道输出的方波信号都没有出去
也就是说让扬声器都响不起来
你现在PC0一旦变成1
那么相当于把两个与门都打开了
那么你刚才输出的这些方波信号
就交替的通过两个与门
再通过那个或门
控制扬声器响起来了
这个就是我们的核心控制程序
当然因为篇幅的原因我们在这个例子里
我们没有给出大家一个完整的汇编程序的结构
但是我们把核心程序都介绍完了
所以这些完了以后这里唯一漏掉的
就是唯一没有再拿出来的就是8253的初始化
实际上根据前面我们的分析
这个8253的初始化程序
大家是自己非常容易把它编出来的
所以我在这里也建议大家
在我们这个核心程序以及它的核心控制流程
和它的硬件设计都
基本完整的情况下
请大家自己补充
硬件线路里边的那个译码电路的设计
以及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讲 结束语
--结束语