摘要: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:JB 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:JB 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: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.