论文部分内容阅读
摘要: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键,循环往复。
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: JB P1.2,L2
MOV R2,#1
ACALL DSP
SJMP BEGIN
L2: JB P1.3,L3
MOV R2,#2
ACALL DSP
SJMP BEGIN
L3: JB 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: JB P1.3,L6
MOV R2,#5
ACALL DSP
SJMP BEGIN
L6: JB 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: JB 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.
关键词: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键,循环往复。
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: JB P1.2,L2
MOV R2,#1
ACALL DSP
SJMP BEGIN
L2: JB P1.3,L3
MOV R2,#2
ACALL DSP
SJMP BEGIN
L3: JB 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: JB P1.3,L6
MOV R2,#5
ACALL DSP
SJMP BEGIN
L6: JB 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: JB 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.