在 51 單片機(jī)系統(tǒng)中使用 8155
單片機(jī)自身的RAM存儲空間和引腳數(shù)目往往有些不足,當(dāng)需要在外部拓展不太多的時(shí)候,8155芯片就是首選了。
一片8155,可以提供256字節(jié)的RAM,3個(gè)并行IO接口和一個(gè)14位的定時(shí)器。
8155的內(nèi)部還集成了地址鎖存器,如果只是需要擴(kuò)展8155,就可以省去常用的地址鎖存器74LS373。
下面,先寫一個(gè)使用單片機(jī)自身資源來驅(qū)動16個(gè)LED進(jìn)行流水的程序。
然后,再把它改造為利用8155來驅(qū)動。
利用51單片機(jī)驅(qū)動16個(gè)LED流水燈的匯編語言程序如下。
;=========================================================
;16個(gè)LED接到P0,P2。
ORG0000H
START:
MOV30H,#254;片內(nèi)RAM
MOV31H,#255;30H31H中僅有一個(gè)低電平
;-------------------------------------
MOVR2,#16;循環(huán)16遍
LOOP:
MOVP0,30H;輸出到LED
MOVP2,31H
CALLDLY200MS;延時(shí)
CALLSHIFT_L;移位
DJNZR2,LOOP;循環(huán)16遍
SJMPSTART;再從頭開始
;-------------------------------------
SHIFT_L:;16位數(shù)左移一位
MOVA,30H
RLCA;高位移入Cy
MOV30H,A
;---------------
MOVA,31H
RLCA;Cy移入低位,且高位移入Cy
MOV31H,A
;---------------
MOVA,30H
MOVACC.0,C;把Cy(高位)寫入低位
MOV30H,A
;---------------
RET
;-------------------------------------
DLY200MS:;延時(shí)200ms,誤差0us
MOVR6,#197;
DL0:
MOVR7,#250;1
DJNZR7,$;2*250=500
DJNZR7,$;2*256=512
DJNZR6,DL0;(1+500+512+2)*197=199955
MOVR7,#19;1
DJNZR7,$;2*19=38
NOP;1
RET;1+199955+1+38+1+2=199998
;-------------------------------------
END
;=========================================================
上述程序所對應(yīng)的電路,太簡單了,就不在這里顯示插圖了,讀者可自行畫圖。
當(dāng)在電路中加入了一片8155,電路可以如下連接:
圖片鏈接:http://xiangce.baidu.com/picture/detail/077253d8ef5443cc7ce6c5e5461a899e2034497a
圖中,由于使用了P2.7和P2.0連接到CS和IO/M,所以,8155的接口地址、存儲器地址分別為:
;I/O地址:
COMMANDEQU7F00H
PORTAEQU7F01H
PORTBEQU7F02H
PORTCEQU7F03H
TIMER_LEQU7F04H
TIMER_HEQU7F05H
;MEM地址:
;7E00H~7EFFH
因此,前面的流水燈程序,就要如下修改:
;=========================================================
;51單片機(jī)流水燈(16個(gè)燈)
;P0,P2外接16個(gè)LED--改為PA,PB
;30H,31H片內(nèi)RAM----改為片外
ORG0000H
START:
MOVDPTR,#COMMAND
MOVA,#00000011B;PA方式0輸出,PB方式0輸出
MOVX@DPTR,A
INCDPTR;轉(zhuǎn)到PA
MOVA,#00110011B;測試共陽極7段數(shù)碼管
MOVX@DPTR,A
INCDPTR;轉(zhuǎn)到PB
MOVA,#00001111B
MOVX@DPTR,A
;MOV30H,#254;--改為7E30H
;MOV31H,#255;--改為7E31H
MOVDPTR,#7E30H
MOVA,#254
MOVX@DPTR,A
MOVDPTR,#7E31H;片外RAM7E30H7E31H
MOVA,#255;中僅有一個(gè)低電平
MOVX@DPTR,A
;-------------------------------------
MOVR2,#16;循環(huán)16遍
LOOP:
;MOVP0,30H;輸出到LED
;MOVP2,31H
MOVDPTR,#7E30H
MOVXA,@DPTR
MOVDPTR,#PORTA
MOVX@DPTR,A
MOVDPTR,#7E31H
MOVXA,@DPTR
MOVDPTR,#PORTB
MOVX@DPTR,A
CALLDLY200MS;延時(shí)
CALLSHIFT_L;移位
DJNZR2,LOOP;循環(huán)16遍
SJMPSTART;再從頭開始
;-------------------------------------
SHIFT_L:;16位數(shù)左移一位
;MOVA,30H
MOVDPTR,#7E30H
MOVXA,@DPTR
RLCA;高位移入Cy
;MOV30H,A
MOVX@DPTR,A
;---------------
;MOVA,31H
MOVDPTR,#7E31H
MOVXA,@DPTR
RLCA;Cy移入低位,且高位移入Cy
;MOV31H,A
MOVX@DPTR,A
;---------------
;MOVA,30H
MOVDPTR,#7E30H
MOVXA,@DPTR
MOVACC.0,C;把Cy(高位)寫入低位
;MOV30H,A
MOVX@DPTR,A
;---------------
RET
;-------------------------------------
DLY200MS:;延時(shí)200ms,誤差0us
MOVR6,#197;
DL0:
MOVR7,#250;1
DJNZR7,$;2*250=500
DJNZR7,$;2*256=512
DJNZR6,DL0;(1+500+512+2)*197=199955
MOV R7, #19 ;1