新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)流水燈設(shè)計(jì)方法

單片機(jī)流水燈設(shè)計(jì)方法

作者: 時(shí)間:2013-01-15 來(lái)源:網(wǎng)絡(luò) 收藏
點(diǎn)擊瀏覽下一頁(yè)
圖4: ISP編程器燒寫目標(biāo)文件liu01.hex

  到此,我們做的已成功,工作原理也清楚啦,若你完全掌握了上面程序,那么你就可以將“”的流向改變一下,可以將從"左向右流"改為從"右向左流",也可以改為"兩邊向內(nèi)流"、"內(nèi)部向外流"......,我想你一定能用前面學(xué)到的方法實(shí)現(xiàn)這些功能。可能有些高手說(shuō),前面的編程方法是最最笨的!不錯(cuò)!但初學(xué)初期可以不必講究語(yǔ)言的簡(jiǎn)練,只要能實(shí)現(xiàn)預(yù)先要求就好,最主要的是學(xué)好基本指令(111條)的用法,清楚各個(gè)指令的功能,這是初學(xué)者要知道的。那么還有更好的編程思路嗎?當(dāng)然有!請(qǐng)跟隨站長(zhǎng)繼續(xù)學(xué)習(xí)下面的內(nèi)容。

  在前面學(xué)習(xí)的程序中我們讓LED流水是去逐個(gè)控制P1端口的每個(gè)位來(lái)實(shí)現(xiàn)的,因此程序顯得有點(diǎn)復(fù)雜,下面我們就采用新的思路來(lái)編程。新的編程思路如下:我們?cè)诔绦蛞婚_(kāi)始就給P1口送一個(gè)數(shù),這個(gè)數(shù)本身就讓P1.0先低,其他位為高,然后讓這個(gè)數(shù)據(jù)向高位移動(dòng)不就實(shí)現(xiàn)“流水”效果啦?的確如此!8051指令中沒(méi)有讓P1數(shù)據(jù)移動(dòng)的指令,但有對(duì)累加器ACC中數(shù)據(jù)左移或右移的指令,ACC在指令中常寫為A,累加器A數(shù)據(jù)左移指令為"RL A",累加器數(shù)據(jù)右移指令為"RR A",累加器在數(shù)據(jù)傳輸和數(shù)據(jù)處理過(guò)程中作用十分重要,累加器ACC為8位。他可與片內(nèi)所有單字節(jié)寄存器交換數(shù)據(jù),實(shí)際上P1和其他端口在中也是一個(gè)寄存器。這樣我們可以將需移動(dòng)的數(shù)據(jù)先放到ACC中,讓其移動(dòng),然后將ACC移動(dòng)后的數(shù)據(jù)再轉(zhuǎn)送到P1口,這樣同樣可以實(shí)現(xiàn)“流水”效果。下面程序就是采用新的編程思路源程序liu02.asm。

實(shí)現(xiàn)8個(gè)LED程序 liu02.asm

    ;----- 主程序開(kāi)始 -----
START: MOV   ACC,#0FEH   ;ACC中先裝入LED1亮的數(shù)據(jù)(二進(jìn)制的11111110)
    MOV   P1,ACC     ;將ACC的數(shù)據(jù)送P1口
    MOV   R0,#7     ;將數(shù)據(jù)再移動(dòng)7次就完成一個(gè)8位流水過(guò)程
LOOP:  RL   A       ;將ACC中的數(shù)據(jù)左移一位
    MOV   P1,A      ;把ACC移動(dòng)過(guò)的數(shù)據(jù)送p1口顯示
    ACALL  DELAY     ;調(diào)用延時(shí)子程序
    DJNZ  R0,LOOP    ;沒(méi)有移動(dòng)夠7次繼續(xù)移動(dòng)
    AJMP  START     ;移動(dòng)完7次后跳到開(kāi)始重來(lái),以達(dá)到循環(huán)流動(dòng)效果

    ;----- 延時(shí)子程序 -----
DELAY: MOV   R0,#255    ;延時(shí)一段時(shí)間
D1:   MOV   R1,#255
    DJNZ  R1,$
    DJNZ  R0,D1
    RET          ;子程序返回

    END          ;程序結(jié)束

  接下來(lái),我們將上述程序編譯,并燒寫到實(shí)驗(yàn)芯片中,放到實(shí)驗(yàn)板上可以看到程序的"流水"效果是一樣的,但源程序看起來(lái)更加簡(jiǎn)潔,直觀。其實(shí)8051有111條指令,有的指令常用,有的指令不常用,只要遵守語(yǔ)法規(guī)則,你可以用這些指令“組合”成你想象到的任何程序。當(dāng)然,有時(shí)一條指令可以替代很多條指令,這樣會(huì)使程序簡(jiǎn)潔,程序代碼減少,在編寫較大程序時(shí)可以讓程序存儲(chǔ)器放得下你需要的代碼,這也是單片機(jī)高手所追求的“程序簡(jiǎn)潔高效”。當(dāng)然,初學(xué)者不必刻意去追求程序的簡(jiǎn)潔高效,主要是要全面地掌握各種指令的應(yīng)用,只要你對(duì)基本指令都熟悉了,那么你也就可以編出簡(jiǎn)潔高效的程序了,不過(guò)這編程“內(nèi)功”是需要你勤學(xué)苦練,日積月累的練習(xí)、實(shí)驗(yàn)才能達(dá)到的哦!馬上拿起你的實(shí)驗(yàn)板,現(xiàn)在就開(kāi)始動(dòng)手吧:)

  上面我們學(xué)習(xí)的兩個(gè)程序都是比較簡(jiǎn)單的流水燈程序,"流水"花樣只能實(shí)現(xiàn)單一的"從左到右"流方式。下面介紹一個(gè)實(shí)用的流水燈程序,程序能夠?qū)崿F(xiàn)任意方式流水,而且流水花樣無(wú)限,只要更改流水花樣數(shù)據(jù)表的流水?dāng)?shù)據(jù)就可以隨意添加或改變流水花樣,真正實(shí)現(xiàn)隨心所欲的流水。只要將下面的程序稍稍修改一下,通過(guò)S51增強(qiáng)型單片機(jī)實(shí)驗(yàn)板的擴(kuò)展接口連接到霓虹燈高壓驅(qū)動(dòng)接口板就可以驅(qū)動(dòng)真正的霓虹燈了。

實(shí)用的查表方式多功能流水燈程序 liu03.asm

    ;----- 主程序開(kāi)始 -----
    ORG   0000H       ;上電復(fù)位,程序從0000H開(kāi)始執(zhí)行
START: MOV   SP,#60H      ;堆棧初始化為60H
    MOV   DPTR,#LIU_TAB   ;流水花樣表首地址送DPTR
LOOP:  CLR   A
    MOVC  A,@A+DPTR
    CJNE  A,#0FFH,SHOW   ;檢查流水結(jié)束標(biāo)志
    AJMP  START       ;所有花樣流完,則從頭開(kāi)始重復(fù)流
SHOW:  MOV   P1,A       ;將數(shù)據(jù)送到P1口
    ACALL  DELAY
    INC   DPTR
    AJMP  LOOP

    ;----- 延時(shí)子程序 -----
DELAY: MOV   R0,#255     ;延時(shí)一段時(shí)間
D1:   MOV   R1,#255
    DJNZ  R1,$
    DJNZ  R0,D1
    RET            ;子程序返回

    ;----- 下面是流水花樣數(shù)據(jù)表 -----
LIU_TAB:
    DB 01111111B       ;二進(jìn)制表示的流水花樣數(shù)據(jù)
    DB 10111111B
    DB 11011111B
    DB 11101111B
    DB 11110111B
    DB 11111011B
    DB 11111101B
    DB 11111110B
    DB 11111110B
    DB 11111101B
    DB 11111011B
    DB 11110111B
    DB 11101111B
    DB 11011111B
    DB 10111111B
    DB 01111111B
    DB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH ;十六進(jìn)制表示
    DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
    DB 7EH,0BDH,0DBH,0E7H,0E7H,0DBH,0BDH,7EH
    DB 7FH,3FH,1FH,0FH,07H,03H,01H,00H
    DB 0FFH          ;流水花樣結(jié)束標(biāo)志0FFH

    END           ;程序結(jié)束


上一頁(yè) 1 2 3 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉