51單片機(jī)的數(shù)碼管循環(huán)顯示編程實(shí)例
要求在數(shù)碼管上循環(huán)顯示數(shù)字 1~5。 范例分析:
1.1硬件分析
數(shù)碼管采用共陽(yáng)極結(jié)構(gòu)。
1.2軟件設(shè)計(jì)
設(shè)計(jì)中要求循環(huán)顯示1~5,很顯然應(yīng)采用循環(huán)的方法來(lái)實(shí)現(xiàn),最簡(jiǎn)單的方法是將1~5的段碼依次由P0口送出。
準(zhǔn)備程序
2、控制轉(zhuǎn)移類指令的特點(diǎn)及使用
(1)長(zhǎng)轉(zhuǎn)移指令
LJMP Addr16
功能:長(zhǎng)距離無(wú)條件轉(zhuǎn)移指令
說(shuō)明:三字節(jié)指令,它直接將指令中的16位常數(shù)裝入PC,使程序無(wú)條件轉(zhuǎn)移到指定的地址處執(zhí)行。目標(biāo)語(yǔ)句可以是程序存儲(chǔ)器64KB空間的任何地方。
(2)絕對(duì)轉(zhuǎn)移指令
AJMP addr11
例: 4002H AJMP MM
……
4600H MM: MOV A,#00H
注意:目標(biāo)語(yǔ)句必須和當(dāng)前語(yǔ)句同頁(yè)。在51單片機(jī)中,64KB程序存儲(chǔ)器分成32頁(yè),每頁(yè)2KB(7FFH)。
?。?)短跳轉(zhuǎn)指令
SJMP 目標(biāo)語(yǔ)句(rel)
例: 4060H SJMP LOOP
……
4090H LOOP:MOV A,#0FFH
……
注意:短跳轉(zhuǎn)的目標(biāo)語(yǔ)句地址必須在當(dāng)前語(yǔ)句向前127(7FH)字節(jié),向后128(80H)字節(jié),否則在進(jìn)行程序編譯時(shí)會(huì)出錯(cuò)。
?。?)變址尋址轉(zhuǎn)移指令
JMP @A+DPTR
該指令主要用于多分支的跳轉(zhuǎn)程序設(shè)計(jì)。跳轉(zhuǎn)的目標(biāo)地址是累加器A和數(shù)據(jù)指針DPTR之和,它可以是64KB存儲(chǔ)空間的任何地方。
例 根據(jù)標(biāo)志單元R2中的內(nèi)容,分別轉(zhuǎn)各個(gè)處理程序。
程序如下:
PJ1: MOV DPTR ,#TAB1
CLR C
MOV A,R2
ADD A,R2 ;(R2) ×2←A
JNC NADD
NC DPH ;(R2)×2>256時(shí),16位數(shù)據(jù)指針高8位加1
NADD:JMP @A+DPTR
TAB1:LJMP PRG0 ;轉(zhuǎn)處理程序0的首地址
LJMP RRG1
…
LJMP RRG n
?。?)減1條件轉(zhuǎn)移指令組
DJNZ Rn,目標(biāo)地址(rel);如果(Rn)-1≠0,則程序跳轉(zhuǎn)到目標(biāo)語(yǔ)句,否則順序執(zhí)行下一條語(yǔ)句。
DJNZ direct,目標(biāo)地址(rel);如果(direct)-1≠0,則程序跳轉(zhuǎn)到目標(biāo)語(yǔ)句,否則順序執(zhí)行下一條語(yǔ)句。
例 將8031內(nèi)部RAM的40H~4FH單元置初值A(chǔ)0H~AFH。程序?yàn)椋?
START:MOV RO,#40H ;RO賦值,指向數(shù)據(jù)單元
MOV R2,#10H ;R2賦值,為傳送字節(jié)數(shù),十六進(jìn)制數(shù)
MOV A,#0A0H ;給A賦值
LOOP: MOV @RO,A ;開(kāi)始傳送
INC,RO ;修改地址指針,準(zhǔn)備傳下一數(shù)地址
INC A ;修改傳送數(shù)據(jù)值
DJNZ R2,LOOP ;如果未傳送完,則繼續(xù)循環(huán)傳送
RET ;當(dāng)R2的值減為0時(shí),則傳送結(jié)束
3、延時(shí)程序的設(shè)計(jì)和延時(shí)時(shí)間的計(jì)算方法
延時(shí)程序是一種應(yīng)用較為廣泛的小程序,一般采用多條語(yǔ)句循環(huán)執(zhí)行來(lái)實(shí)現(xiàn)延時(shí)。
例1:設(shè)計(jì)一延時(shí)程序,延時(shí)時(shí)間為1ms(fosc=12MHz)。
例2:設(shè)計(jì)一延時(shí)250ms的程序
已有上例所舉延時(shí)1ms子程序,調(diào)用250次,即得延時(shí)250ms子程序
DELAY2:MOV R3,#FAH
DEL3:ACALL DELAY1
DEL2: NOP
NOP
DJNZ R3,DEL3
RET
本段程序延時(shí)的時(shí)間為:
1+(2+993+2)250+2=249253us
誤差不到1ms
思考:如何設(shè)計(jì)延時(shí)1s程序?
4、子程序的設(shè)計(jì)方法
4.1子程序:在程序中反復(fù)多次執(zhí)行的程序段,可編寫(xiě)為子程序,在使用時(shí)通過(guò)主程序調(diào)用就可以使用它。這樣不但可以減少編程工作量,也縮短了程序的長(zhǎng)度。
4.2子程序的使用:
(1)子程序調(diào)用:
指令:ACALL ××× ;絕對(duì)調(diào)用,2KB范圍
LCALL ××× ;長(zhǎng)調(diào)用,64KB范圍
?。?)子程序返回:
指令:RET ;子程序返回指令
RETI ;中斷子程序返回指令
ORG 2000H
MAIN: CLR P3.2
MOV P0,#0F9H
LCALL DEL
MOV P0,#0A4H
LCALL DEL
MOV P0,#0B0H
LCALL DEL
SJMP MAIN
DEL: MOV R7,#10
DEL1: MOV R6,#123
…………
DJNZ R7,DEL1
RET
END
5、循環(huán)程序設(shè)計(jì)的基本方法
循環(huán)程序:在程序中需要反復(fù)執(zhí)行的程序段,為了避免在程序中多次的編寫(xiě),可以通過(guò)利用條件轉(zhuǎn)移或無(wú)條件轉(zhuǎn)移指令來(lái)控制程序的執(zhí)行。結(jié)構(gòu)流程圖一般如下圖所示:
編輯:admin 最后修改時(shí)間:2018-05-08