新聞中心

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

單片機流水燈設計方法

作者: 時間:2013-01-15 來源:網(wǎng)絡 收藏
點擊瀏覽下一頁
圖4: ISP編程器燒寫目標文件liu01.hex

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

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

實現(xiàn)8個LED程序 liu02.asm

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

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

    END          ;程序結(jié)束

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

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

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

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

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

    ;----- 下面是流水花樣數(shù)據(jù)表 -----
LIU_TAB:
    DB 01111111B       ;二進制表示的流水花樣數(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 ;十六進制表示
    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é)束標志0FFH

    END           ;程序結(jié)束


上一頁 1 2 3 下一頁

評論


相關推薦

技術專區(qū)

關閉