第9章 应用系统配置及接口技术
若输入是非电的模拟信号,还需要通过传感器转换成电信号并加以放大,把模拟量转换成数字量。该过程称为“量化”,也称为模/数转换。
实现模/数转换的设备称为模/数转换器(A/D),将数字量转换成模拟量的设备称为数/模转换器(D/A)。
图9-1所示为具有模拟量输入、模拟量输出以及键盘、显示器、打印机等配置的89C51应用系统框图。为节省I/O口线,89C51片外扩展应尽量采用串行外设接口芯片。
图9-1 系统前向、后向人机通道配置框图
9.1 人机通道配置与接口技术
单片机应用系统通常都需要进行人机对话。这包括人对应用系统的状态干预与数据输入,还有应用系统向人显示运行状态与运行结果等。如键盘、 显示器就是用来完成人机对话活动的人机通道。
9.1.1 键盘接口及处理程序
键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件译码器实现,并产生键编号或键值的称为编码键盘,如BCD码键盘、ASCII码键盘等;靠软件识别的称为非编码键盘。
键盘中每个按键都是一个常开开关电路,如图9-2所示。
当按键K未被按下时,P1.0输入为高电平;当K闭合时,P1.0输入为低电平。
图9-2 按键电路
通常按键所用的开关为机械弹性开关,当机械触点断开、闭合时,电压信号波形如图9-3所示。
由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,如图9-3所示。抖动时间的长短由按键的机械特性决定,一般为5~10 ms。这是一个很重要的时间参数,在很多场合都要用到。
图9-3 按键时的抖动
键抖动会引起一次按键被误读多次。为了确保CPU对键的一次闭合仅做一次处理,必须去除键抖动。在键闭合稳定时,读取键的状态,并且必须判别;在键释放稳定后,再作处理。按
1
键的抖动,可用硬件或软件两种方法消除。
如果按键较多,常用软件方法去抖动,即检测出键闭合后执行一个延时程序,产生5~10 ms的延时;让前沿抖动消失后,再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5~10 ms的延时,待后沿抖动消失后,才能转入该键的处理程序。
1. 键盘结构
键盘可以分为独立连接式和行列式(矩阵式)两类,每一类按其译码方法又都可分为编码及非编码两种类型。这里只介绍非编码键盘。
1) 独立式非编码键盘接口及处理程序
独立式按键是指各按键相互独立地接通一条输入数据线,如图9-4所示。这是最简单的键盘结构,该电路为查询方式电路。
当任何一个键按下时,与之相连的输入数据线即被清0(低电平),而平时该线为1(高电平)。要判别是否有键按下,用单片机的位处理指令十分方便。
这种键盘结构的优点是电路简单;缺点是当键数较多时,要占用较多的I/O线。
图9-4 独立连接式非编码键盘
图9-4所示查询方式键盘的处理程序比较简单。程序中没有使用散转指令,并且省略了软件去抖动措施,只包括键查询、键功能程序转移。P0F~P7F为功能程序入口地址标号,其地址间隔应能容纳JMP指令字节;PROM0~PROM7分别为每个按键的功能程序。
程序清单(设I/O为P1口):
START: MOV A,#0FFH;输入时先置P1口为全1 MOV P1,A MOV A,P1;键状态输入 PL1: JNB ACC.0,P0F;0号键按下转P0F标号地址 JNB ACC.1,P1F;1号键按下转P1F标号地址 JNB ACC.2,P2F;2号键按下转P2F标号地址 JNB ACC.3,P3F;3号键按下转P3F标号地址 JNB ACC.4,P4F;4号键按下转P4F标号地址 JNB ACC.5,P5F;5号键按下转P5F标号地址 JNB ACC.6,P6F;6号键按下转P6F标号地址 JNBA CC.7,P7F;7号键按下转P7F标号地址 LJMP START;无键按下返回 P0F: LJMP PROM0 ┊ ┊
P1F: LJMP PROM1 ;入口地址表 P7F: LJMP PROM7 PROM0:? ;0号键功能程序 LJMP START ;0号键执行完返回
2
PROM1:? LJMP START ? ┊
PROM7:? LJMP START
由程序可以看出,各按键由软件设置了优先级,优先级顺序依次为0~7。 【例9-1】 设计一个有4个独立式按键的键盘接口,并编写键扫描程序。 解: 电路原理图如图9-5所示。
图9-5 键盘接口电路原理图
程序清单:
KEY: MOV P1,#0FFH;P1口为输入,各位应先置位为高电平 MOV A,P1;读取按键状态 CPL A;取正逻辑,高电平表示有键按下 ANL A,#0FH JZ KEY;A=0时无键按下,重新扫描键盘 LCALL D10 ms;有键按下延时去抖动 MOV A,P1;读取按键状态 CPL A;取正逻辑,高电平表示有键按下 ANL A,#0FH;再判别是否有键按下 JZ KEY;A=0时无键按下重新扫描键盘 MOV B,A;有键按下,键值送B暂存 MOV A,P1 CPL A ANL A,#0FH;判别按键释放 KEY1:JNZ KEY1;按键未释放,等待 LCALL D10ms;释放,延时去抖动 MOV A,B;取键值送A JB ACC.0,PKEY1;K1按下转PKEY1 JB ACC.1,PKEY2;K2按下转PKEY2 JB ACC.2,PKEY3;K3按下转PKEY3 JB ACC.3,PKEY4;K4按下转PKEY4 EKEY:RET
PKEY1:LCALL K1;K1命令处理程序 RET
PKEY2:LCALL K2;K2命令处理程序 RET
PKEY3:LCALL K3;K3命令处理程序 RET
PKEY4:LCALL K4;K4命令处理程序 RET
D10ms:MOV R7,#10H;10 ms延时子程序
3
DS1: MOV R6,#0FFH DS2: DJNZ R6,DS2 DJNZ R7,DS1 RET
2) 行列式键盘接口及工作原理
为了减少键盘与单片机接口时所占用I/O线的数目,在键数较多时,通常都将键盘排列成行列矩阵形式,如图9-6所示。
以图9-6所示的4×4键盘为例,说明行扫描法识别哪一个按键被按下的工作原理。
图9-6 4×4矩阵键盘接口图
首先判别键盘中有无键按下,由单片机I/O口向键盘送(输出)全扫描字,然后读入(输入)列线状态来判断。方法是: 向行线(图中水平线)输出全扫描字00H,把全部行线置为低电平,然后将列线的电平状态读入累加器A中。如果有按键按下,总会有一根列线电平被拉至低电平,从而使列输入不全为1。
判断键盘中哪一个键被按下是通过将行线逐行置低电平后,检查列输入状态实现的。方法是: 依次给行线送低电平,然后查所有列线状态,称行扫描。如果全为1,则所按下的键不在此行;如果不全为1,则所按下的键必在此行,而且是在与零电平列线相交的交点上的那个键。
(1) 行扫描法识别键号(值)的原理 行扫描法识别键号的工作原理如下:
将第0行变为低电平,其余行为高电平时,输出编码为1110。然后读取列的电平,判别第0行是否有键按下。在第0行上若有某一按键按下,则相应的列被拉到低电平,则表示第0行和此列相交的位置上有按键按下。若没有任一条列线为低电平,则说明0行上无键按下。
将第1行变为低电平,其余行为高电平时,输出编码为1101。然后通过输入口读取各列的电平。检测其中是否有变为低电平的列线。若有键按下,则进而判别哪一列有键按下,确定按键位置。
将第2行变为低电平,其余行为高电平时,输出编码为1011。判别是否有哪一列键按下的方法同上。
将第3行变为低电平,其余行为高电平时,输出编码为0111。判别是否有哪一列键按下的方法同上。
在扫描过程中,当发现某行有键按下,也就是输入的列线中有一位为0时,便可判别闭合按键所在列的位置,根据行线位置和列线位置就能判断按键在矩阵中的位置,知道是哪一个键按下。
(2) 键盘扫描工作过程 按键扫描的工作过程如下: ① 判断键盘中是否有键按下;
4
② 进行行扫描,判断是哪一个键按下,若有键按下,则调用延时子程序去抖动; ③ 读取按键的位置码;
④ 将按键的位置码转换为键值(键的顺序号)0、1、2?、F。 图9-7所示为4×4键盘扫描流程图。
图9-7 4×4键盘扫描流程图
键的位置码及键值的译码过程
上述行扫描过程结束后得到的行号存放在R0中,列号存放在R2中。
键值(号)的获得(译码)通常采用计数译码法。这种方法根据矩阵键盘的结构特点,每个按键的值=行号×每行的按键个数+列号,即键号(值)=行首键号+列号第0行的键值为: 0行×4+列号(0~3)为0、1、2、3;
第1行的键值为: 1行×4+列号(0~3)为4、5、6、7; 第2行的键值为: 2行×4+列号(0~3)为8、9、A、B; 第3行的键值为: 3行×4+列号(0~3)为C、D、E、F。 4×4键盘行首键号为0、4、8、C,列号为0,1,2,3。
所以键值译码子程序为DECODE,该子程序出口: 键值在A中。 (3) 键盘扫描子程序(参见图9-7)出口: 键值(键号)在A中 KEY: MOV P1,#0F0H;令所有行为低电平 KEY1: MOV R7,#0FFH ;设置计数常数 DJNZ R7,KEY1 ;延时 MOV A,P1;读取P1口的列值
ANL A,#0F0H;判别有键值按下吗? CPL A;求反后,有高电平就有键按下 JZ EKEY;无键按下时退出 LCALL DEL20 ms;延时20 ms去抖动 SKEY: MOV A,#00;下面进行行扫描,1行1行扫 MOV R0,A;R0作为行计数器,开始为0 MOV R1,A;R1作为列计数器,开始为0
MOV R3 #0FEH;R3为行扫描字暂存,低4位为行扫描字 SKEY2:MOV A,R3
MOV P1,A;输出行扫描字,高4位全1 NOP NOP
NOP;3个NOP操作使P1口输出稳定
5