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