51單片機(jī)的數(shù)碼管循環(huán)顯示編程實(shí)例

發(fā)布時(shí)間:2024-03-08
要求在數(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)。
(3)短跳轉(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ò)。
(4)變址尋址轉(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
(5)減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單元置初值a0h~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范圍
(2)子程序返回:
指令: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)流程圖一般如下圖所示:
上一個(gè):停業(yè)整頓屬于什么處罰
下一個(gè):騰訊云域名費(fèi)用和服務(wù)器費(fèi)用

熱電制冷
水養(yǎng)水仙的關(guān)鍵措施 水仙的水養(yǎng)殖方法介紹
金花茶怎樣繁殖?
產(chǎn)權(quán)人死亡怎么更名
防治黃櫨脛跳甲 敲震法也可以
手機(jī)怎么掃描身份證(手機(jī)上怎么掃描身份證)
二審民事判決書(shū)生效時(shí)間怎么計(jì)算
離婚時(shí)保險(xiǎn)可以分割嗎
蘆薈怎么澆水?
欠款起訴要找律師嗎
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos