專利名稱:一種流水燈的編程方法
技術(shù)領(lǐng)域:
本發(fā)明涉及自動化智能控制領(lǐng)域,具體涉及一種流水燈的編程方法。
背景技術(shù):
按照單片機系統(tǒng)擴展與系統(tǒng)配置狀況,單片機應(yīng)用系統(tǒng)可分為最小系統(tǒng)、最小功耗系統(tǒng)及典型系統(tǒng)等。AT89C51單片機是美國ATMEL公司生產(chǎn)的低電壓、高性能CMOS 8位單片機,具有豐富的內(nèi)部資源4kB閃存、U8BRAM、32根I/O 口線、2個16位定時/計數(shù)器、 5個向量兩級中斷結(jié)構(gòu)、2個全雙工的串行口,具有4. 25 5. 50V的電壓工作范圍和0 24MHz工作頻率,使用AT89C51單片機時無須外擴存儲器。因此,本流水燈實際上就是一個帶有八個發(fā)光二極管的單片機最小應(yīng)用系統(tǒng),即為由發(fā)光二極管、晶振、復(fù)位、電源等電路和必要的軟件組成的單個單片機。其原理圖已是公知技術(shù),我們不難想象出,如果要讓接在 P1.0 口的LEDl亮起來,那么只要把P1.0 口的電平變?yōu)榈碗娖骄涂梢粤?;相反,如果要接在 Pl. 0 口的LEDl熄滅,就要把P1.0 口的電平變?yōu)楦唠娖?;同理,接在Pl. 1 Pl. 7 口的其他 7個LED的點亮和熄滅的方法同LED1。因此,要實現(xiàn)流水燈功能,我們只要將發(fā)光二極管 LEDl LED8依次點亮、熄滅,8只LED燈便會一亮一暗的做流水燈了。采用順序程序結(jié)構(gòu),用位指令控制Pl 口的每一個位輸出高低電平,從而來控制相應(yīng)LED燈的亮滅。程序如下ORG 0000H;單片機上電后從OOOOH地址執(zhí)行
AJMP START;跳轉(zhuǎn)到主程序存放地址處
ORG 0030H;設(shè)置主程序開始地址
START =MOV SP, #60H ;設(shè)置堆棧起始地址為60H
CLR Pl. 0;Pl. 0輸出低電平,使LEDl點亮
ACALL DELAY;調(diào)用延時子程序
SETB PL 0;Pl. 0輸出高電平,使LEDl熄滅
CLR PL 1;Pl. 1輸出低電平,使LED2點亮
ACALL DELAY;調(diào)用延時子程序
SETB PL 1;Pl. 1輸出高電平,使LED2熄滅
CLR PL 2;Pl. 2輸出低電平,使LED3點亮
ACALL DELAY調(diào)用延時子程序
SETB PL 2Pl. 2輸出高電平,使LED3熄滅
CLR PL 3Pl. 3輸出低電平,使LED4點亮
ACALL DELAY調(diào)用延時子程序
SETB PL 3Pl. 3輸出高電平,使LED4熄滅
CLR PL 4卩1.4輸出低電平,使1^05點亮
ACALL DELAY調(diào)用延時子程序
SETB PL 4Pl. 4輸出高電平,使LED5熄滅
CLR Pl. 5;Pl. 5輸出低電平,使LED6點亮
ACALL DELAY;調(diào)用延時子程序
SETB Pl. 5;Pl. 5輸出高電平,使LED6熄滅
CLR Pl. 6;卩1.6輸出低電平,使1^07點亮
ACALL DELAY;調(diào)用延時子程序
SETB PL 6;Pl. 6輸出高電平,使LED7熄滅
CLR PL 7;Pl. 7輸出低電平,使LED8點亮
ACALL DELAY;調(diào)用延時子程序
SETB PL 7;Pl. 7輸出高電平,使LED8熄滅
ACALL DELAY;調(diào)用延時子程序
AJMP START;8個LED流了一遍后返回到標號START處再循環(huán)
DELAY ;延時子程序
MOV R0, #255;延時一段時間
Dl MOVRl, #255
DJNZ Rl,$
DJNZ R0, Dl
RET;子程序返回
END;程序結(jié)束
2、循環(huán)移位法
在上個程序中我們是逐個控制Pl端口的每個位來實現(xiàn)的,因此程序顯得有點復(fù)
雜,下面我們利用循環(huán)移位指令,采用循環(huán)程序結(jié)構(gòu)進行編程。我們在程序一開始就給Pi 口送一個數(shù),這個數(shù)本身就讓Pi. O先低,其他位為高,然后延時一段時間,再讓這個數(shù)據(jù)向高位移動,然后再輸出至Pl 口,這樣就實現(xiàn)“流水”效果啦。由于8051系列單片機的指令中只有對累加器ACC中數(shù)據(jù)左移或右移的指令,因此實際編程中我們應(yīng)把需移動的數(shù)據(jù)先放到ACC中,讓其移動,然后將ACC移動后的數(shù)據(jù)再轉(zhuǎn)送到Pl 口,這樣同樣可以實現(xiàn)“流水” 效果。具體編程如下所示,程序結(jié)構(gòu)確實簡單了很多。ORG 0000H;單片機上電后從OOOOH地址執(zhí)行
AJMP START;跳轉(zhuǎn)到主程序存放地址處
ORG 0030H;設(shè)置主程序開始地址
START :M0V SP, #60H;設(shè)置堆棧起始地址為60H
MOV A, #0FEH;ACC中先裝入LEDl亮的數(shù)據(jù)(二進制的11111110)
MOV PI,A;將ACC的數(shù)據(jù)送Pl 口
MOV R0, #7;將數(shù)據(jù)再移動7次就完成一個8位流水過程
LOOP :RL A;將ACC中的數(shù)據(jù)左移一位
MOV PI,A;把ACC移動過的數(shù)據(jù)送pi 口顯示
ACALL DELAY;調(diào)用延時子程序
DJNZ R0, LOOP;沒有移動夠7次繼續(xù)移動
AJMP START;移動完7次后跳到開始重來,以達到循環(huán)流動效果
DELAY ;延時子程序
MOVR0, #255;延時一段時間Dl:MOV Rl, #255DJNZRl, $DJNZR0, DlRET;子程序返回END;程序結(jié)束上面的兩個程序都是比較簡單的流水燈程序,“流水”花樣只能實現(xiàn)單一的“從左 到右”流方式。
發(fā)明內(nèi)容
本發(fā)明的目的的提供一種流水燈的編程方法,運用查表法所編寫的流水燈程序, 能夠?qū)崿F(xiàn)任意方式流水,而且流水花樣無限,只要更改流水花樣數(shù)據(jù)表的流水數(shù)據(jù)就可以隨意添加或改變流水花樣,真正實現(xiàn)隨心所欲的流水燈效果。我們首先把要顯示流水花樣的數(shù)據(jù)建在一個以TAB為標號的數(shù)據(jù)表中,然后通過查表指令“MOVC A,@A+DPTR”把數(shù)據(jù)取到累加器A中,然后再送到Pl 口進行顯示。具體源程序如下,TAB標號處的數(shù)據(jù)表可以根據(jù)實現(xiàn)效果的要求任意修改。具體方案如下ORG 0000H;單片機上電后從0000H地址執(zhí)行
AJMP START;跳轉(zhuǎn)到主程序存放地址處
ORG 0030H;設(shè)置主程序開始地址
START :M0V SP, #60H;設(shè)置堆棧起始地址為60H
MOV DPTR, #TAB;流水花樣表首地址送DPTR
LOOP :CLR A;累加器清零
MOVC A, iA+DPTR;取數(shù)據(jù)表中的值
CJNE A, #0FFH,SHOW;檢查流水結(jié)束標志
AJMP START;所有花樣流完,則從頭開始重復(fù)流
SHOW :M0V PI, A;將數(shù)據(jù)送到Pl 口
ACALL DELAY;調(diào)用延時子程序
INC DPTR;取數(shù)據(jù)表指針指向下一數(shù)據(jù)
AJMP LOOP;繼續(xù)查表取數(shù)據(jù)
DELAY ;延時子程序
MOV R0, #255;延時一段時間
Dl: MOV Rl,#255
DJNZ Rl,$
DJNZ R0, Dl
RET;子程序返回
TAB ;下面是流水花樣數(shù)據(jù)表,
用戶可據(jù)要求任意編寫
DB 11111110B;二進制表示的流水花樣數(shù)據(jù),從低到高左移
DB 11111101B進制表示的流水花樣數(shù)據(jù),從高到低右移
......DB OFFH ;流水花樣結(jié)束標志OFFHEND;程序結(jié)束當上述程序編寫好以后,我們需要使用編譯軟件對其編譯,得到單片機所能識別的二進制代碼,然后再用編程器將二進制代碼燒寫到AT89C51單片機中,最后連接好電路通電,我們就看到LEDl LED8的“流水”效果了以下是流水燈的c源程序
DB11111011BDB11110111BDB11101111BDB11011111BDB10111111BDB01111111BDB01111111B ;二進制DB10111111BDB11011111BDB11101111BDB11110111BDB11111011BDB11111101BDB11111110BDB0FEH,0FDH,0FBH,0F7HDB0EFH,0DFH,0BFH,7FHDB7FH,0BFH,0DFH,OEFHDB0F7H,0FBH,0FDH, OFEH
;十六進制表示的流水花樣數(shù)據(jù)
#include<reg51. h> #include<intrins. h>
void delayms (unsigned char ms),
{
unsigned char i ;
while(ms—)
{
for(i = 0 ;i < 120 ;i++);
main ()
{
unsigned char LED LED = Oxfe ; PO = LED ;
延時子程序
while (1){delayms(250);LED = _crol_(LED, 1) -J/ 循環(huán)右移 1 位,點亮下一個 LEDPO = LED;}用本發(fā)明所編寫的流水燈程序,實用性更強,能夠?qū)崿F(xiàn)任意方式流水,而且流水花樣無限,只要更改流水花樣數(shù)據(jù)表的流水數(shù)據(jù)就可以隨意添加或改變流水花樣,真正實現(xiàn)隨心所欲的流水燈效果。
具體實施例方式如同上述內(nèi)容。
權(quán)利要求
1. 一種流水燈的編程方法,其特征在于,首先把要顯示流水花樣的數(shù)據(jù)建在一個以 TAB為標號的數(shù)據(jù)表中,然后通過查表指令“MOVC A,0A+DPTR”把數(shù)據(jù)取到累加器A中,然后再送到Pl 口進行顯示,TAB標號處的數(shù)據(jù)表可以根據(jù)實現(xiàn)效果的要求任意修改。
全文摘要
本發(fā)明公開了一種流水燈的編程方法,它克服了應(yīng)用順序程序結(jié)構(gòu)、循環(huán)移位指令的“流水”花樣只能實現(xiàn)單一的“從左到右”流方式。運用此法所編寫的流水燈程序,能夠?qū)崿F(xiàn)任意方式流水,而且流水花樣無限,只要更改流水花樣數(shù)據(jù)表的流水數(shù)據(jù)就可以隨意添加或改變流水花樣,真正實現(xiàn)隨心所欲的流水燈效果。
文檔編號G05B19/042GK102289213SQ201010204339
公開日2011年12月21日 申請日期2010年6月21日 優(yōu)先權(quán)日2010年6月21日
發(fā)明者周法慶 申請人:周法慶