如何在 51 單片機(jī)系統(tǒng)中使用 8155?
單片機(jī)自身的?RAM?存儲(chǔ)空間和引腳數(shù)目往往有些不足,當(dāng)需要在外部拓展不太多的時(shí)候,8155?芯片就是首選了。
一片?8155,可以提供?256?字節(jié)的?RAM,3?個(gè)并行?IO?接口和一個(gè)?14?位的定時(shí)器。
8155?的內(nèi)部還集成了地址鎖存器,如果只是需要擴(kuò)展?8155,就可以省去常用的地址鎖存器?74LS373。
下面,先寫(xiě)一個(gè)使用單片機(jī)自身資源來(lái)驅(qū)動(dòng)?16?個(gè)?LED?進(jìn)行流水的程序。
然后,再把它改造為利用?8155?來(lái)驅(qū)動(dòng)。
利用?51?單片機(jī)驅(qū)動(dòng)?16?個(gè)?LED?流水燈的匯編語(yǔ)言程序如下。
;=========================================================
;?16?個(gè)?LED?接到?P0,?P2。
????ORG???0000H
START:
????MOV???30H,?#254???;片內(nèi)?RAM
????MOV???31H,?#255???;30H?31H?中僅有一個(gè)低電平
;-------------------------------------
????MOV???R2,?#16?????;循環(huán)?16?遍
LOOP:
????MOV???P0,?30H?????;輸出到?LED?
????MOV???P2,?31H
????CALL??DLY200MS????;延時(shí)
????CALL??SHIFT_L?????;移位
????DJNZ??R2,?LOOP????;循環(huán)?16?遍
????SJMP??START???????;再?gòu)念^開(kāi)始
;-------------------------------------
SHIFT_L:??????????????;16位數(shù)左移一位
????MOV???A,?30H
????RLC???A???????????;高位移入Cy
????MOV???30H,?A
;---------------
????MOV???A,?31H
????RLC???A???????????;Cy移入低位,且高位移入Cy
????MOV???31H,?A
;---------------
????MOV???A,?30H
????MOV???ACC.0,?C????;把Cy(高位)寫(xiě)入低位
????MOV???30H,?A
;---------------
RET
;-------------------------------------
DLY200MS:?????????????;延時(shí)200ms,誤差0us
????MOV???R6,?#197????;
DL0:
????MOV???R7,?#250????;1
????DJNZ??R7,?$???????;2?*?250?=?500
????DJNZ??R7,?$???????;2?*?256?=?512
????DJNZ??R6,?DL0?????;(1?+?500?+?512?+?2)?*?197?=?199955
????MOV???R7,?#19?????;1
????DJNZ??R7,?$???????;2?*?19?=?38
????NOP???????????????;1
RET???????????????????;1?+?199955?+?1?+?38?+?1?+?2?=?199998
;-------------------------------------
END?
;=========================================================
上述程序所對(duì)應(yīng)的電路,太簡(jiǎn)單了,就不在這里顯示插圖了,讀者可自行畫(huà)圖。
當(dāng)在電路中加入了一片?8155,電路可以如下連接:
圖片鏈接:http://xiangce.baidu.com/picture/detail/077253d8ef5443cc7ce6c5e5461a899e2034497a
圖中,由于使用了?P2.7?和?P2.0?連接到?CS?和?IO/M,所以,8155?的接口地址、存儲(chǔ)器地址分別為:
;I/O?地址:
COMMAND??EQU??7F00H
??PORTA??EQU??7F01H???????
??PORTB??EQU??7F02H???????
??PORTC??EQU??7F03H
TIMER_L??EQU??7F04H
TIMER_H??EQU??7F05H
;MEM?地址:
;7E00H?~?7EFFH
因此,前面的流水燈程序,就要如下修改:
;=========================================================
;51單片機(jī)流水燈(16個(gè)燈)
;P0,?P2?外接?16?個(gè)?LED--改為?PA,?PB
;30H,?31H?片內(nèi)RAM?----改為?片外
????ORG???0000H
START:
????MOV???DPTR,?#COMMAND
????MOV???A,?#00000011B;PA方式0輸出,PB方式0輸出
????MOVX??@DPTR,?A
????INC???DPTR????????;轉(zhuǎn)到PA
????MOV???A,?#00110011B;測(cè)試共陽(yáng)極7段數(shù)碼管
????MOVX??@DPTR,?A
????INC???DPTR????????;轉(zhuǎn)到PB
????MOV???A,?#00001111B
????MOVX??@DPTR,?A
;????MOV???30H,?#254???;--改為?7E30H
;????MOV???31H,?#255???;--改為?7E31H
????MOV???DPTR,?#7E30H
????MOV???A,?#254
????MOVX??@DPTR,?A
????MOV???DPTR,?#7E31H?;片外?RAM?7E30H?7E31H
????MOV???A,?#255??????;中僅有一個(gè)低電平
????MOVX??@DPTR,?A
;-------------------------------------
????MOV???R2,?#16?????;循環(huán)?16?遍
LOOP:
;????MOV???P0,?30H?????;輸出到?LED?
;????MOV???P2,?31H
????MOV???DPTR,?#7E30H
????MOVX??A,?@DPTR
????MOV???DPTR,?#PORTA
????MOVX??@DPTR,?A
????MOV???DPTR,?#7E31H
????MOVX??A,?@DPTR
????MOV???DPTR,?#PORTB
????MOVX??@DPTR,?A
????CALL??DLY200MS????;延時(shí)
????CALL??SHIFT_L?????;移位
????DJNZ??R2,?LOOP????;循環(huán)?16?遍
????SJMP??START???????;再?gòu)念^開(kāi)始
;-------------------------------------
SHIFT_L:??????????????;16位數(shù)左移一位
;????MOV???A,?30H
????MOV???DPTR,?#7E30H
????MOVX??A,?@DPTR
????RLC???A???????????;高位移入Cy
;????MOV???30H,?A
????MOVX??@DPTR,?A
;---------------
;????MOV???A,?31H
????MOV???DPTR,?#7E31H
????MOVX??A,?@DPTR
????RLC???A???????????;Cy移入低位,且高位移入Cy
;????MOV???31H,?A
????MOVX??@DPTR,?A
;---------------
;????MOV???A,?30H
????MOV???DPTR,?#7E30H
????MOVX??A,?@DPTR
????MOV???ACC.0,?C????;把Cy(高位)寫(xiě)入低位
;????MOV???30H,?A
????MOVX??@DPTR,?A
;---------------
RET
;-------------------------------------
DLY200MS:?????????????;延時(shí)200ms,誤差0us
????MOV???R6,?#197????;
DL0:
????MOV???R7,?#250????;1
????DJNZ??R7,?$???????;2?*?250?=?500
????DJNZ??R7,?$???????;2?*?256?=?512
????DJNZ??R6,?DL0?????;(1?+?500?+?512?+?2)?*?197?=?199955
????MOV???R7,?#19?????;1
????DJNZ??R7,?$???????;2?*?19?=?38
????NOP???????????????;1
????RET???????????????;1?+?199955?+?1?+?38?+?1?+?2?=?199998
;-------------------------------------
END?
;=========================================================
原來(lái)程序中,凡是對(duì)?30H、31H?讀寫(xiě)的指令,都改成對(duì)片外?RAM?讀寫(xiě)。
凡是對(duì)?P0、P2?輸出的指令,都改成對(duì)片外?PA、PB?輸出。
這樣寫(xiě),程序的長(zhǎng)度,將近增加了一倍。呵呵,沒(méi)有辦法,只能這樣。
經(jīng)過(guò)修改,即可利用?8155?的資源,進(jìn)行流水燈的實(shí)驗(yàn)了。
顯示的效果,是只有一個(gè)?LED?流動(dòng)發(fā)光,比較簡(jiǎn)單,就不在這里插圖了。