51單片機(jī)容易忽略的東西
P0口將作為總線的低8位地址線和8位數(shù)據(jù)線使用
P2口將作為總線的高8位地址線使用
如果十六進(jìn)制數(shù)以字母ABCDEF中的某一個(gè)開(kāi)頭,必須在前面加一個(gè)0.譬如,MOV P1, #0BFH
ORG 00H 表示的是偽指令,作用幫助匯編器匯編指令,并不是單片機(jī)指令的一部分,因此偽指令不占用存儲(chǔ)器空間。這段代碼的含義是從程序存儲(chǔ)器的00H開(kāi)始執(zhí)行程序。
一段小程序,循環(huán)閃爍小燈
ORG 00H
START:
MOV P1, #00H
CALL DELAY
MOV P1, #0FFH
CALL DELAY
JMP START
DELAY: MOV R3, #50
D1: MOV R4, #20
D2: MOV R5, #248
DJNZ R5, $
DJNZ R4, D2
DJNZ R3, D1
RET ;返回主程序
END ;匯編程序結(jié)束
按鍵開(kāi)關(guān)控制P1.0上的發(fā)光二極管閃爍5次
ORG 00H
START:
MOV R0, #05 ;R0作為計(jì)數(shù)器
LOOP:
MOV P1, #00H
CALL DELAY
MOV P1, #0FFH
CALL DELAY
DJNZ R0, LOOP ;R0減一,不等于0就跳到loop處
JB P2.0, $ ;如果P2.0為高電平則循環(huán)執(zhí)行本行
JMP START
DELAY: MOV R3, #50
D1: MOV R4, #20
D2: MOV R5, #248
DJNZ R5, $ ;R5的值減1,不等于0則循環(huán)執(zhí)行本行
DJNZ R4, D2
DJNZ R3, D1
RET ;返回主程序
END ;匯編程序結(jié)束
中斷方式
ORG 00H
JMP START
ORG 03H
JMP EXT0
START: ;主程序
MOV IE, #10000001B ;外部中斷0使能
MOV IP, #00000001B ;外部中斷0中斷優(yōu)先
MOV TCON, #00000001B ;外部中斷0為電平觸發(fā)
SHINE:
MOV P1, #0FEH
JMP SHINE
EXT0:
MOV R2, #5
LOOP:
MOV P0, #0FEH
CALL DELAY
MOV P0, #0FFH
CALL DELAY
DJNZ R2, LOOP ;R2減一,不等于0就跳到loop處
RETI ;中斷服務(wù)子程序結(jié)束標(biāo)志
DELAY: MOV R3, #20 ;這一段200ms
D1: MOV R4, #20 ;這一段延時(shí)10ms
D2: MOV R5, #248
DJNZ R5, $
DJNZ R4, D2
DJNZ R3, D1
RET ;返回主程序
END ;匯編程序結(jié)束
PSEN(program store enable) - 片外程序存儲(chǔ)使能,需要和存儲(chǔ)器的輸出端端OE相連。
ALE(address latch enable) - 地址鎖存使能,當(dāng)單片機(jī)與片外存儲(chǔ)器相連時(shí),P0既可以送出數(shù)據(jù)也可以送出地址,如何區(qū)分到底是地址還是數(shù)據(jù)呢?
ALE為0,表示送出的是數(shù)據(jù),當(dāng)ALE為1表示送出的是地址。(P0送出的低8位地址,配合P2口的高八位地址,片外存儲(chǔ)器便可以尋到16位地址)
注意51單片機(jī)的P0口是需要加上拉的!
51作為輸入,必須先自己置1!
P0輸入,P1輸出
MOV A, #0FFH
MOV P0, A
LOOP:
MOV A, P0
MOV P1, A
JMP LOOP
片內(nèi)片外程序存儲(chǔ)器統(tǒng)一編址,訪問(wèn)指令使用MOVC,通過(guò)PC來(lái)指定地址。
外部數(shù)據(jù)存儲(chǔ)器與外部IO端口實(shí)行統(tǒng)一編址,并使用相同的選通控制信號(hào),相同的訪問(wèn)指令MOVX,相同的寄存器間接尋址。類似程序存儲(chǔ)器的PC訪問(wèn)數(shù)據(jù)存儲(chǔ)器用DPTR。
數(shù)據(jù)指針DPTR和程序計(jì)數(shù)器PC