节省AT89C2051有限资源进行I/O接口扩展的几个设计

时间:2022-07-28 02:29:43

节省AT89C2051有限资源进行I/O接口扩展的几个设计

摘要:AT89C2051是一种精简型单片机,因其I/O接口有限,应用时必须进行扩展,文章通过5个设计说明如何在耗用较少I/O资源下,实现尽可能多的按键输入。

关键词:AT89C2051;74LS164;按键;设计;I/O接口

中图分类号:TP368文献标识码:A文章编号:1009-3044(2008)27-2094-05

AT89C2051 Save Limited Resources to Conduct I/O Interfaces Expand Several Designs

LIU Jin-ping, YE Sai-feng

(Fujian Electric Power Occupation Technical College,Quanzhou 362000, China)

Abstract: AT89C2051 is a streamlining of Singlechip, is limited because of it's I/O port,must carry out expansion when applying. the article passes 5 designs specification , how to import in the button consuming with being as far as possible more than stopping coming true under I/O resource.

Key words: AT89C2051; 74LS164; button; design; I/O port

1 引言

AT89C2051是一种精简型单片机芯片,20脚封装,体积小。它的价格比同类产品便宜一半。 AT89C2051的驱动能力较强,P1和P3上可以有20mA左右驱动电流,对一般数字电路芯片等器件,这样驱动电流足够了。这些是AT89C2051的优点,但它只有两个并行接口,并行口线只有15根,可利用资源有限。

输入和显示是单片机的电路,同时也是人机交互的重要接口。在实际应用中,几乎离不开这两个部分,其中输入主要是按键、键盘等器件,显示主要为数码管和发光二极管。

随着智能电子产品的功能越来越强,按键个数也越来越多。AT89C2051要应用于这些产品,就必须进行I/O接口扩展。扩展I/O的途径较多,这里就不一一叙述。按照减少成本的原则以及在不动用P3口(具有第二功能)的前提下,有没有什么办法在耗用P1口较少资源的情况下,实现尽可能多的按键输入?下面5个设计回答了这个问题。

2 应用设计

2.1 占用5条I/O线,实现9个按键输入

2.1.1 硬件电路设计

本电路由AT89C2051单片机、移位寄存器74LS164、LED及9个按键等组成,电路原理图如图1所示。这个电路比起单片机教科书中所介绍的矩阵按键知识――5条口线,可实现3行2列的6键――多了3 个键。

2.1.2 程序设计思想与程序代码

首先检查P1.0~P1.2是否出现低电平,若出现,则说明#6,#7,#8中有一键按下,这时只要分别对P1.0、P1.1、P1.2进行判零,就可以具体确定哪个按键;若都没有低电平出现,则进行以下操作:先在P1.0上输出低电平,分别判断P1.3及P1.4是否出现低电平,若有,就可以分别确定为#0和#1键;若没有,接着在P1.1上输出低电平,然后分别判断P1.3及P1.4,若出现,则不是#2就是#3键;若还是没有,就在P1.2上输出低电平,然后分别判断P1.3及P1.4,若有,则分别为#4及#5键,循环往复。

LED显示采用P1.5及P1.6分别外接串入并出转换芯片164的数据输入端及移位脉冲输入端。

程序代码如下:

ORG 0

BEGIN: MOV P1,#0FFH

MOV A,P1

XRL A,#0FFH

JZ START

JB P1.0,ABC

MOV R2,#6

ACALL DSP

SJMP BEGIN

ABC:P1.1,ABC1

MOV R2,#7

ACALL DSP

SJMP BEGIN

ABC1: MOV R2,#8

ACALL DSP

SJMP BEGIN

START: MOV R7,#3

MOV DPTR,#TABLE

CLR A

LOOP: MOV 30H,A

MOV B,#2

MUL AB

MOV 40H,A

MOV A,30H

MOVC A,@A+DPTR

MOV P1,A

JB P1.3,NEXT

MOV R2,40H

ACALL DSP

SJMP DONE

NEXT:P1.4,DONE

MOV R2,40H

INC R2

ACALL DSP

DONE: MOV A,30H

INC A

DJNZ R7,LOOP

SJMP BEGIN

DSP: PUSH DPH

PUSH DPL

MOV A,R2

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV R6,#8

LP: RRC A

MOV P1.5,C

CLR P1.6

SETB P1.6

DJNZ R6,LP

MOV R5,#80H

LP1: MOV R6,#0

DJNZ R6,$

DJNZ R5,LP1

POP DPL

POP DPH

RET

TABLE: DB 0FEH,0FDH,0FBH

TABLE1: DB 3FH,06H,5BH,4FH

DB 66H,6DH,7DH,07H,7FH

END

2.1.3 性能分析

本设计电路不复杂,程序执行时间也较短,适合按键不太多的场合,如应用于电饭煲、早期的电磁炉等家电。

2.2 占用5条I/O线,实现10个按键输入

2.2.1 硬件电路设计

本电路由AT89C2051单片机、移位寄存器74LS164、LED及10个按键等组成,电路原理图如图2所示。这个电路比起上一个设计,10个按键排列采用数学中的上三角矩阵排列。

2.2.2 程序设计思想与程序代码

在P1.0上输出低电平(其它为高电平,以下相同),若P1.1,P1.2,P1.3及P1.4有一为低电平,则可以确定按键为#0,#1,#2,#3中的一个。同样,在P1.1上输出低电平,分别对P1.2,P1.3及P1.4判零,则可以确定按键为#4,#5,#6中的一个。接着在P1.2上输出低电平,分别对P1.3及P1.4判零,则可以确定按键为#7,#8中的一个。最后在P1.3上输出低电平,对P1.4进行判零,就能确定按键#9是否按下,循环反复。LED显示同上。

程序代码如下:

ORG 0

BEGIN: MOV P1,#0FFH

MOV P1,#11111110B

JB P1.1,L1

MOV R2,#0

ACALL DSP

SJMP BEGIN

L1:P1.2,L2

MOV R2,#1

ACALL DSP

SJMP BEGIN

L2:P1.3,L3

MOV R2,#2

ACALL DSP

SJMP BEGIN

L3:P1.4,L4

MOV R2,#3

ACALL DSP

SJMP BEGIN

L4: MOV P1,#11111101B

JB P1.2,L5

MOV R2,#4

ACALL DSP

SJMP BEGIN

L5:P1.3,L6

MOV R2,#5

ACALL DSP

SJMP BEGIN

L6:P1.4,L7

MOV R2,#6

ACALL DSP

SJMP BEGIN

L7: MOV P1,#11111011B

JB P1.3,L8

MOV R2,#7

ACALL DSP

SJMP BEGIN

L8:P1.4,L9

MOV R2,#8

ACALL DSP

SJMP BEGIN

L9: MOV P1,#11110111B

JB P1.4,BEGIN

MOV R2,#9

ACALL DSP

SJMP BEGIN

DSP: MOV A,R2

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV R6,#8

LP: RRC A

MOV P1.5,C

CLR P1.6

SETB P1.6

DJNZ R6,LP

MOV R5,#80H

LP1: MOV R6,#0

DJNZ R6,$

DJNZ R5,LP1

RET

TABLE1:DB 3FH,06H,5BH,4FH,66H

DB 6DH ,7DH,07H,7FH,6FH

END

2.2.3 性能分析

本设计性能与上一个差不多,但凭巧妙的设计,硬是多了一个按键。

2.3 占用4条I/O线,实现12个按键输入

2.3.1 硬件电路设计

本电路由AT89C2051单片机、移位寄存器74LS164、LED、12个按键、4个常用的廉价二极管,以及对P1.0及P1.1的上拉电阻,还有一个12V电源等组成,电路原理图如图3所示。

2.3.2 程序设计思想与程序代码

在一条口线上(如P1.0)输出高电平,其它为低电平(这一点与前两个设计不同,所以电路中上拉电阻必不可少),然后对其它口线(P1.1~P1.3)进行高电平的判断,若在某一线上出现高电平,则对应按键(#3、#6、#9)按下。依次类推,分别在P1.1、P1.2、P1.3上输出高电平,就可以分别判断#0,#7,#A一组键、#1,#4,#B一组键、#2,#5,#8一组键是否有键按下。

程序代码如下:

ORG 0

BEGIN: ORL P1,#0FH

MOV P1,#01H

JNB P1.1,L1

MOV R2,#3

ACALL DSP

SJMP BEGIN

L1: JNB P1.2,L2

MOV R2,#6

ACALL DSP

SJMP BEGIN

L2: JNB P1.3,L3

MOV R2,#9

ACALL DSP

SJMP BEGIN

L3: ORL P1,#0FH

MOV P1,#02H

JNB P1.0,L4

MOV R2,#0

ACALL DSP

SJMP BEGIN

L4: JNB P1.2,L5

MOV R2,#7

ACALL DSP

SJMP BEGIN

L5: JNB P1.3,L6

MOV R2,#10

ACALL DSP

SJMP BEGIN

L6: ORL P1,#0FH

MOV P1,#04H

JNB P1.0,L7

MOV R2,#1

ACALL DSP

SJMP BEGIN

L7: JNB P1.1,L8

MOV R2,#4

ACALL DSP

SJMP BEGIN

L8: JNB P1.3,L9

MOV R2,#11

ACALL DSP

SJMP BEGIN

L9: ORL P1,#0FH

MOV P1,#08H

JNB P1.0,L10

MOV R2,#2

ACALL DSP

SJMP BEGIN

L10: JNB P1.1,L11

MOV R2,#5

ACALL DSP

SJMP BEGIN

L11: JNB P1.2,BEGIN

MOV R2,#8

ACALL DSP

AJMP BEGIN

DSP: MOV A,R2

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV R6,#8

LP: RRC A

MOV P1.4,C

CLR P1.5

SETB P1.5

DJNZ R6,LP

ACALL DELAY

RET

DELAY: MOV R4,#08H

MOV R5,#9AH

MOV R6,#7FH

AA: DJNZ R6,AA

DJNZ R5,AA

DJNZ R4,AA

RET

TABLE1: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H

DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H

END

2.3.3 性能分析

这一设计增加电路的复杂性,增大电路板的面积,但12个按键比较适合大多数微电脑控制的家电的应用。

2.4 占用4条I/O线,实现16个按键输入

2.4.1 硬件电路设计

本电路由AT89C2051单片机、移位寄存器74LS164、LED、16个按键、4个二极管,以及4个上拉电阻,还有一个12V电源等组成,电路原理图如图4所示。

2.4.2 程序设计思想与程序代码

在一条口线上(如P1.0)输出高电平,其它为低电平,立刻对该口线进行判零,若为低电平,则#C键按下;然后对其它口线(P1.1~P1.3)进行高电平的判断,若在某一线上出现高电平,则对应按键(#3、#6、#9)按下。依次类推。

本设计与上一个设计类似,只是多了判零这一操作,就增加了4 个按键。

程序代码如下:

ORG 0

BEGIN: ORL P1,#0FH

MOV P1,#01H

JB P1.0,NEX1

MOV R2,#0CH

ACALL DSP

SJMP BEGIN

NEX1: JNB P1.1,L1

MOV R2,#3

ACALL DSP

SJMP BEGIN

L1: JNB P1.2,L2

MOV R2,#6

ACALL DSP

SJMP BEGIN

L2: JNB P1.3,L3

MOV R2,#9

ACALL DSP

SJMP BEGIN

L3: ORL P1,#0FH

MOV P1,#02H

JB P1.1,NEX2

MOV R2,#0DH

ACALL DSP

SJMP BEGIN

NEX2: JNB P1.0,L4

MOV R2,#0

ACALL DSP

SJMP BEGIN

L4: JNB P1.2,L5

MOV R2,#7

ACALL DSP

SJMP BEGIN

L5: JNB P1.3,L6

MOV R2,#10

ACALL DSP

SJMP BEGIN

L6: ORL P1,#0FH

MOV P1,#04H

JB P1.2,NEX3

MOV R2,#0EH

ACALL DSP

AJMP BEGIN

NEX3: JNB P1.0,L7

MOV R2,#1

ACALL DSP

SJMP BEGIN

L7: JNB P1.1,L8

MOV R2,#4

ACALL DSP

AJMP BEGIN

L8: JNB P1.3,L9

MOV R2,#11

ACALL DSP

AJMP BEGIN

L9: ORL P1,#0FH

MOV P1,#08H

JB P1.3,NEX4

MOV R2,#0FH

ACALL DSP

AJMP BEGIN

NEX4: JNB P1.0,L10

MOV R2,#2

ACALL DSP

AJMP BEGIN

L10: JNB P1.1,L11

MOV R2,#5

ACALL DSP

AJMP BEGIN

L11: JNB P1.2,DONE

MOV R2,#8

ACALL DSP

DONE: AJMP BEGIN

DSP: MOV A,R2

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV R6,#8

LP: RRC A

MOV P1.4,C

CLR P1.5

SETB P1.5

DJNZ R6,LP

ACALL DELAY

RET

DELAY: MOV R4,#08H

MOV R5,#9AH

MOV R6,#7FH

AA: DJNZ R6,AA

DJNZ R5,AA

DJNZ R4,AA

RET

TABLE1: DB 3FH,06H,5BH,4FH,66H,6DH,7DH

DB 07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H

END

2.4.3 性能分析

本设计给电路增加一定复杂程度,生产成本有所增大。但16按键已经适合于绝大多数的智能家用电器。

2.5 占用4条I/O线,同时实现16个按键输入及LED输出

2.5.1 硬件电路设计

本电路由AT89C2051单片机、两片移位寄存器74LS164、LED、16个按键以及三极管等组成,电路原理图如图5所示。该电路特点是移位寄存器74LS164既控制按键的输入,又控制显示的输出。由于共有16个按键,所以需要2片74LS164。

2.5.2 程序设计思想与程序代码

由P1.6控制LED是否显示。将双字节数FFFEH逐位移入74LS164,对P1.7判零,若为低电平,则按下#0键;否则,将FFFEH左移一位,转换后为FFFDH并逐位移入74LS164,然后对P1.7判零,若为低电平,则是#1键按下,依此类推,共进行进行16次,就可以判断16个是否按下。

程序代码如下:

ORG 0

MOV DPTR,#TABLE

LOOP: MOV R2,#0

MOV R3,#16

MOV 20H,#0FEH

MOV 21H,#0FFH

LOOP2: ACALL SUB

JNB P1.7,NEXT

INC R2

ACALL LEFT

DJNZ R3,LOOP2

SJMP LOOP

NEXT: MOV A,R2

MOVC A,@A+DPTR

ACALL SUB1

CLR P1.6

ACALL DELAY

SETB P1.6

SJMP LOOP

LEFT: MOV C,0FH

MOV A,20H

RLC A

MOV 20H,A

MOV A,21H

RLC A

MOV 21H,A

RET

SUB: MOV R7,#8

MOV A,21H

LP1: RLC A

MOV P1.5,C

CLR P1.4

SETB P1.4

DJNZ R7,LP1

MOV R7,#8

MOV A,20H

LP2: RLC A

MOV P1.5,C

CLR P1.4

SETB P1.4

DJNZ R7,LP2

RET

SUB1: MOV R7,#8

LOOP1: RLC A

MOV P1.5,C

CLR P1.4

SETB P1.4

DJNZ R7,LOOP1

RET

DELAY: MOV R5,#40

D2: MOV R6,#40

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

DJNZ R5,D2

RET

TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H

DB7FH,6FH,77H,7CH,39H,5EH,79H,71H

END

2.5.3 性能分析

本设计从原理上讲,每增加一片74LS164就可以增多8个按键,但是以缓长程序执行时间为代价的,所以,虽然在这几个设计中最节省I/O资源,但只能适合实时性要求不高的场合。

3 结束语

通过以上5个设计,可以看出,尽管AT89C2051单片机的I/O口很紧张,但我们可以通过巧妙的软件设计和添加常用廉价的器件,占用较少的I/O资源,实现尽可能多的按键输入。在这些设计中,作者为了显示设计的结果,在用PROPTEUS软件仿真时采用LED显示键值。由于每个程序设计中键值都保存在R2中,所以完全可以根据具体功能的设计的需求,将显示七段代码部分改为以下程序段就可以了。

MOV A ,R2

MOV B, #2

MUL AB

MOV DPTR, #SUBTABLE

JMP @A+DPTR

SUBTABLE: ACALL SUB1

ACALL SUB2

以上5个设计为AT89C2051更广泛地应用于智能家用电器、工业生产控制等开发提供一些设计思想。

参考文献:

[1] 高卫东.51单片机原理与实践[M].北京:航空航天大学出版社,2008.

[2] 邹久明.80C51单片机实用技术[M].北京:航空航天大学出版社,2008.

[3] 周润景.基于PROTEUS的电路及单片机系统设计与仿真[M].北京:航空航天大学出版社,2006.

上一篇:利用执行计划调优ORACLE数据库 下一篇:基于Ad hoc网络的入侵检测技术