一种高效的单片机I/O端口扩展方法

🏠 首页 《无线电》杂志 2005年 🔗 第8期 🔗 第37页 分类:电脑·单片机·通信 🔗 常波 🔗

本文介绍一种高效的单片机I/O端口扩展电路,该电路不仅可实现开关量输入,还可控制发光二极管和八段数码管的输出显示,实现用较少的I/O端口接入多种多个I/O部件,有效地降低产品的成本。

一般扩展单片机端口的方法有三种形式:简单I/O扩展技术,可编程I/O接口扩展技术,特殊端口扩展电路。

这几种特殊的I/O端口扩展电路要么只能实现输入开关量扩展,要么只能实现输出端口的扩展。但在实际的单片机应用设计中,往往既需要扩展输入端口又需要扩展输出端口。本文将从硬件电路和软件编程两方面介绍一种高效的I/O端口扩展电路,既可实现输入开关量的扩展,又可实现控制发光二极管及数码管的输出扩展。

硬件电路工作原理

如图1所示,该电路以PIC16C74单片机为例,利用16条I/O口线实现了8个开关量输入、32个发光二极管及4个8段共阴极数码管输出,如此多的I/O部件如采用一般的端口扩展技术,或直接选用I/O端口多的单片机都将明显地增加系统的成本。该电路的工作原理简单分析如下:

图2
图2 🔍原图 (850×557)

1.因PIC16C74的I/O端口既可输入也可输出且驱动能力较强(单条I/O口线拉、灌电流均为25mA),故其端口可直接驱动发光二极管和八段数码管工作,同时端口作输入时其漏电流极小(小于1μA),允许端口对地接入较大的电阻而不影响其低电平状态的输入,故在电路中接入了10kΩ的对地电阻(由按键控制)和100kΩ的接电源电阻以减小开关量输入电路对发光二极管输出电路和数码管显示电路的影响。

2.在原理图中有4组电阻,R11~R18和R31~R38用于开关量输入,以形成合适的高低电平,R21~R28为LED发光二极管和数码管的限流电阻,R41~R48为VT1~VT8的驱动电阻。32个LED发光二极管每4个LED的阳极相连接到PIC16C74的C口的一根I/O线上(即每根I/O端口线分时驱动4个LED发光二极管),而每8个LED的阴极相连分别由VT1~VT4驱动,接入PIC16C74的B口, 0~RB3分时控制。4个数码管按常规连接成循环扫描显示形式,段码由PIC16C74的C口提供,而位码则由PIC16C74的B口RB4~RB7送出,由VT5~VT8驱动以控制4个数码管的分时显示。我们暂且把LED发光二极管、按键开关及数码管看作三种I/O设备,开关量输入未加任何控制,而LED发光二极管和数码管工作时除要将PIC16C74的C口置为输出外,还要由VT1~VT4、VT5~VT8八只NPN晶体管的导通来控制。当RBi输出高电平时,VTi导通,受该管驱动的I/O设备实现电气接入,该种I/O设备工作,否则,该种I/O设备不工作。

编程方法

程序采取分时处理的方法,其编程流程如图2所示。需要说明的是,为避免发光二极管和数码管显示时发生闪烁现象并防止开关量输入时产生延时感觉,应保证程序每秒钟执行的次数不少于50次(这在一般单片机控制系统中是很容易实现的)。这样,利用人眼的视觉暂留效应,人们实际上看到的是按键输入,发光二极管和数码管显示同时工作。

图1
图1 🔍原图 (142×469)

1.按键输入的编程方法。在本电路中,按键未按下时输入为高电平,按键按下时为输入低电平,编程时:①把RC0~RC7置为输入口。②把RB0~RB7置为输出口,并输出全零,使VT1~VT8全部截止,以关闭所有的LED发光二极管和数码管,切断其对按键输入的影响。③读入按键开关状态待处理。④再把RC0~RC7置为输出口。

2.数码管显示的编程方法。由于4个数码管是按常规的循环扫描方式连接,编程时:①将RC0~RC7,RB4~RB7置为输出口。②将RB0~RB3置为输出口,并输出全零,以关闭所有LED发光二极管,切断其对数码管工作的影响。③按常规的循环扫描法编程即可(即RC0~RC7输出段码,RB4~RB7输出位码)。④循环显示结束后使RB4~RB7输出全零,以关闭所有数码管显示。

3.LED发光二极管显示编程方法。本电路的32个LED发光二极管,每8个LED发光二极管的阴极接到一起,共分为4组,即: LED11、LED21、LED31、LED41、LED51、LED61、LED71、LED81为第一组;LED12、LED22、LED32、LED42、LED52、LED62、LED72、LED82为第二组;LED13、LED23、LED33、LED43、LED53、LED63、LED73、LED83为第三组;LED14、LED24、LED34、LED44、LED54、LED64、LED74、LED84为第四组。由VT1~VT4分时驱动控制,而每组的8个发光二极管的阳极分接在PIC16C74 的RC0~RC7上。这种接法实际上相当于LED发光二极管每8个一组,每组视同1个八段数码管使用。因此编程方法和数码管显示的编程基本相同,即①将RC0~RC7、RB0~RB7都置为输出口,再使RB4~RB7输出全零控制VT4~VT8截止以关闭所有的数码管,切断其对LED发光二极管工作的影响。②由RC0~RC7分时输出使LED发光的状态码,由RB0~RB3分时输出01H、02H、04H、08H的组码,使VT1~VT4分时驱动4组LED发光二极管工作。

4.当LED发光二极管输出完毕后,应使RB0~RB7输出全零,保证VT1~VT8全部截止,关闭所有的LED发光二极管和数码管,程序转入按键处理和系统的其他程序处理模块。如果用户需接入更多的按键开关,可再增加几条I/O口线将按键开关接成矩阵形式,按键输入采用扫描输入法编程即可(如图2流程所示)。

需说明的是,本电路充分利用了人眼的视觉暂留效应,分时控制发光二极管和数码管作输出状态显示,因此,该电路不能用来直接控制像继电器、蜂鸣器之类的不能分时处理的输出设备。若设计者还想在本电路的基础上实现继电器和蜂鸣器的控制,可在RC0~RC7上外接一个锁存器,并增加一根I/O口线,以控制锁存器的工作,用锁存器控制继电器和蜂鸣器。

本文电路结构高效、稳定,已成功地应用于某企业的跑步机健身产品,有效地降低了跑步机控制板的成本,对大批量生产的产品有一定推广价值。

文/常波