在很多实际场合,输入单片机的信号是不规范的,例如高低电平电压不够准确,或输入脉冲的波形不是矩形,前后沿不够陡峭,或含有杂波等。这时就需要对输入信号进行整形以便使单片机得到正确的开关信号。若开关信号电平(电压等级)与单片机不一致,则需要先进行电平转换,然后再输入单片机。因此开关信号的输入处理,主要涉及两个问题:一是输入信号的整形问题;二是电平转换问题。 一、开关信号的输入与整形: 1.开关信号的抖动与消抖电路: 图2-1给出了一个最简单的按键时的抖动现象,当机械式按键未被按下时,P1.0应为高电平,当按键按下后,P1.0应变为低电平。但是由于机械触点的弹性作用,当按键闭合时,电路不会立即稳定地接通;当按键释放时,电路也不会立即完全断开。于是,P1.0口线上的电平就出现抖动现象,抖动延续时间由按键结构决定,一般为5~10ms。
按键动作引起的电平抖动现象是难以避免的,它会造成单片机将一次按键动作误读为按下多次,而控制失误。为此必须设法消除开关信号的抖动,可以通过硬件和软件两种方法消除抖动现象。另外,输入单片机的脉冲信号或传感器产生的周期性信号波形往往是不规则的,也需要将它们整理成规则的矩形脉冲,这就需要整形电路。
用硬件方法消除抖动,相应的电路称为整形电路或“消抖”电路。以双稳态的RS触发器来说明消抖作用,如图2-2所示。图中,两个与非门构成了RS触发器。开关触点有两个位置:未按下时接触上端1,按下后接触下端2。在开关未按下时,与非门A因输入端1接地,其输出应为1,即P1.0电平为1。当按键按下时,开关下端2接地,与非门B因此输出必为1,此时与非门A因两个输入端都是1,其输出必为0,即引起P1.0电平翻转。在开关按下期间,即使开关有瞬间弹跳,下端2的电平不稳定,但只要按键不返回上端1,就不会
引起双稳态电路输出状态的多次翻转。
常用的整形或消抖电路除了双稳态触发器外,还有单稳态触发器(如74LS121)等。键盘的按键比较多,常使用带有消抖功能的接口芯片(如8279)。
如果开关或按钮比较多,采用硬件消抖的方法就会使电路比较复杂,这时常用软件消抖方法。当检测到有按钮按下后,即执行一段延时子程序产生5~10ms的延时,待抖动消失后,再检测一次按钮状态,若仍保持闭合状态的电平,则可确认按钮按下。同样当检测到按钮释放时,也要执行5~10ms的延时子程序,待抖动消失后,再检测一次按钮状态,以确认按钮确实释放。
2.不规则周期信号的整形:
输入单片机的开关信号应是规范的高低电平信号,对周期性连续变化的开关信号波形最好是规范的矩形。但实际上输入的脉冲信号、频率信号或来自传感器的周期性变化信号往往是不规则的,在输入单片机之前,需要做整形处理。例如汽车点火控制系统中常常使用磁脉冲式曲轴位置传感器,其输出信号在整形之前的波形为不规则的周期波形,为了将其转换为脉冲信号,就需要通过整形电路,如图2-3所示。
施密特触发器( Schmitt Trigger)是应用十分普遍的整形电路,市场上常见的芯片型号有74LS132(或74HC132)、CD4093等。它是一种电平触发器,能把周期性变化的非矩形
输入信号整形为适合于数字电路需要的矩形脉冲,抗干扰能力较强。施密特触发器可以由反相器或与非门构成,并有同相输出和反相输出两种。下面以反相输出的施密特触发器为例,简单介绍其工作原理和应用。
二、输入开关量的电平变换。
输入单片机的开关信号,应是合乎标准的高、低电平。但实际上不同电路或芯片产生的开关信号电平并不一定符合这一要求。这主要是因为电源电压不同(某些电路电源电压是+12V、+24V等规格),或由于器件本身的原因(TTL与CMOS门电路输入、输出特性不同),使得电路芯片彼此连接时,或输入单片机前需要进行电平调整(高电平足够高、低电平足够低)或转换开关信号电平转换电路如图2-5所示。图2-5(a)是利用晶体管进行电平转换。晶体管基极的输入信号来自非标准电压(12V、24V等)产生的非标准电平信号,集电极接入十5V电源,利用晶体管的开关特性,就可以输出标准的TTL电平信号。图2-5(b)是利用
光耦合器进行电平转换。光耦合器( Optical Coupler,OC)亦称光隔离器,简称光耦,是将发光二极管和一个光敏晶体管封装在一个外壳里的器件。光敏晶体管的基极受光照射而触发。当有输入信号使发光二极管正向导通而发光时,光敏晶体管就因二极管的光照而导通。
光耦合器是一种信号耦合、电气隔离的器件,既完成了开关信号的传输,又实现了电气上的隔离,提高了电路的抗干扰能力,所以在控制系统中应用非常广泛。将发光二极管接入非标准电源的电路内,而将光敏晶体管接入+5V电源电路内,输出信号就变成标准的TTL电平,从而达到电平变换的目的。
三、键盘工作原理:
键盘是按键的组合。若每个按键都接到一位1/O口线上,就称为独立式键盘,每个按键相当于一个开关,如图2-6(a)所示。不过当按键数量较多时,这种接线方法会占用较多的I/O口线,是不太方便的。这时可以采用矩阵式键盘,而且通常采用专门的键盘接口,如图2-6(b)所示即为一个简单的矩阵式键盘电路的原理图。电路上有若干行线和列线,彼此交叉而不连接,每个按键位于行列线的交点附近,按键的两端分别接到行线与列线上。图中画出4条行线(接至D0~D3)和4条列线(接至D4~D7),可构成4×4=16个按键。各条行线通过上拉电阻接到+5V电压上。在无键按下时,各行线均被拉至高电平。
为了识别某个按键是否被按下,将行线作为输入口线,列线作为输出口线,然后按照下面的键盘扫描程序判断按键状态。
①先通过软件使所有列线全部输出低电平,然后从输入口D0~D3读入所有行线状态。
若所有行线均输入高电平,则说明无键按下;否则若有行线是低电平,则表明有键按下,使行列线被短接。例如,若D1=0,则表明D1所接行线上有某个按键被按下。
②进一步判断按键的具体位置。此时需要使列线从低位(D4)到高位(D7)逐位输出低电平,每次都要读入行线状态。这样就可以由行列线的状态具体判断哪个键被按下。例如当D6=0时,也有D1=0,则可以判断D6与D1交点的按键被按下了。实际的控制系统中,单片机的CPU有很多检测和控制工作,按键也不是频繁操作,所以不需要始终盯住键盘。
为此可以采用定时扫描方式,每隔一段时间(例如10ms)产生一次定时中断,CPU就扫描次键盘,检査有无按键操作,若有键按下则具体判断哪个按键被按下,然后进行相应的处理。或采用中断扫描方式,即每当有按键闭合就引起CPU中断,在中断服务程序中进行按键的判断和处理工作。