用微控制器控制的LED流水燈設計(電路、程式全部給出)
1。引言
當今時代是一個新技術層出不窮的時代,在電子領域尤其是自動化智慧控制領域,傳統的
分立元件
或數字邏輯電路構成的控制系統,正以前所未見的速度被微控制器智慧控制系統所取代。微控制器具有體積小、功能強、成本低、應用面廣等優點,可以說,智慧控制與自動控制的核心就是微控制器。目前,一個學習與應用微控制器的高潮正在工廠、學校及企事業單位大規模地興起。學習微控制器的最有效方法就是理論與實踐並重,本文筆者用AT89C51微控制器自制了一款簡易的流水燈,重點介紹了其軟體程式設計方法,以期給微控制器初學者以啟發,更快地成為微控制器領域的優秀人才。
2。硬體組成
按照微控制器系統擴充套件與系統配置狀況,微控制器應用系統可分為最小系統、最小功耗系統及典型系統等。AT89C51微控制器是
美國ATME
L公司生產的低電壓、高效能CMOS 8位微控制器,具有豐富的內部資源:4kB快閃記憶體、128BRAM、32根I/O口線、2個16位定時/計數器、5個向量兩級中斷結構、2個全雙工的序列口,具有4。25~5。50V的電壓工作範圍和0~24MHz工作頻率,使用AT89C51微控制器時無須外擴儲存器。因此,本流水燈實際上就是一個帶有八個
發光二極體
的微控制器最小應用系統,即為由發光二極體、晶振、復位、電源等電路和必要的軟體組成的單個微控制器。其具體硬體組成如圖1所示。
圖1 流水燈硬體原理圖
從原理圖中可以看出,如果要讓接在P1。0口的LED1亮起來,那麼只要把P1。0口的電平變為
低電平
就可以了;相反, 如果要接在P1。0口的LED1熄滅,就要把P1。0口的電平變為
高電平
;同理,接在P1。1~P1。7口的其他7個LED的點亮和熄滅的方法同LED1。因此,要實現流水燈功能,我們只要將
發光二極體LED
1~LED8依次點亮、熄滅,8只LED燈便會一亮一暗的做流水燈了。在此我們還應注意一點,由於人眼的視覺暫留效應以及微控制器執行每條指令的時間很短,我們在控制
二極體
亮滅的時候應該延時一段時間,否則我們就看不到“流水”效果了。
3。軟體程式設計
微控制器的應用系統由硬體和軟體組成,上述硬體原理圖搭建完成上電之後,我們還不能看到流水燈迴圈點亮的現象,我們還需要告訴微控制器怎麼來進行工作,即編寫程式控制微控制器管腳電平的高低變化,來實現發光二極體的一亮一滅。軟體程式設計是微控制器應用系統中的一個重要的組成部分,是微控制器學習的重點和難點。下面我們以最簡單的流水燈控制功能即實現8個LED燈的迴圈點亮,來介紹實現流水燈控制的幾種軟體程式設計方法。
3。1位控法
這是一種比較笨但又最易理解的方法,採用
順序程式結構
,用位指令控制P1口的每一個位輸出高低電平,從而來控制相應LED燈的亮滅。程式如下:
ORG 0000H ;微控制器上電後從0000H地址執行
AJMP START ;跳轉到主程式存放地址處
ORG 0030H ;設定主程式開始地址
START:MOV SP,#60H ;設定堆疊起始地址為60H
CLR P1。0 ;P1。0輸出低電平,使LED1點亮
ACALL DELAY ;呼叫延時子程式
SETB P1。0 ;P1。0輸出高電平,使LED1熄滅
CLR P1。1 ;P1。1輸出低電平,使LED2點亮
ACALL DELAY ;呼叫延時子程式
SETB P1。1 ;P1。1輸出高電平,使LED2熄滅
CLR P1。2 ;P1。2輸出低電平,使LED3點亮
ACALL DELAY ;呼叫延時子程式
SETB P1。2 ;P1。2輸出高電平,使LED3熄滅
CLR P1。3 ;P1。3輸出低電平,使LED4點亮
ACALL DELAY ;呼叫延時子程式
SETB P1。3 ;P1。3輸出高電平,使LED4熄滅
CLR P1。4 ;P1。4輸出低電平,使LED5點亮
ACALL DELAY ;呼叫延時子程式
SETB P1。4 ;P1。4輸出高電平,使LED5熄滅
CLR P1。5 ;P1。5輸出低電平,使LED6點亮
ACALL DELAY ;呼叫延時子程式
SETB P1。5 ;P1。5輸出高電平,使LED6熄滅
CLR P1。6 ;P1。6輸出低電平,使LED7點亮
ACALL DELAY ;呼叫延時子程式
SETB P1。6 ;P1。6輸出高電平,使LED7熄滅
CLR P1。7 ;P1。7輸出低電平,使LED8點亮
ACALL DELAY ;呼叫延時子程式
SETB P1。7 ;P1。7輸出高電平,使LED8熄滅
ACALL DELAY ;呼叫延時子程式
AJMP START ;8個LED流了一遍後返回到標號START處再迴圈
DELAY: ;延時子程式
MOV R0,#255;延時一段時間
D1: MOV R1,#255
DJNZ R1,$
DJNZ R0,D1
RET ;子程式返回
END ;程式結束
3。2迴圈移位法
在上個程式中我們是逐個控制P1埠的每個位來實現的,因此程式顯得有點複雜,下面我們利用迴圈移位指令,採用迴圈程式結構進行程式設計。我們在程式一開始就給P1口送一個數,這個數本身就讓P1。0先低,其他位為高,然後延時一段時間,再讓這個資料向高位移動,然後再輸出至P1口,這樣就實現“流水”效果啦。由於8051系列微控制器的指令中只有對
累加器AC
C中資料左移或右移的指令,因此實際程式設計中我們應把需移動的資料先放到ACC中,讓其移動,然後將ACC移動後的資料再轉送到P1口,這樣同樣可以實現“流水”效果。具體程式設計如下所示,程式結構確實簡單了很多。
ORG 0000H ;微控制器上電後從0000H地址執行
AJMP START ;跳轉到主程式存放地址處
ORG 0030H ;設定主程式開始地址
START:MOV SP,#60H ;設定堆疊起始地址為60H
MOV A,#0FEH ;ACC中先裝入LED1亮的資料(
二進位制
的11111110)
MOV P1,A ;將ACC的資料送P1口
MOV R0,#7 ;將資料再移動7次就完成一個8位流水過程
LOOP: RL A ;將ACC中的資料左移一位
MOV P1,A ;把ACC移動過的資料送p1口顯示
ACALL DELAY ;呼叫延時子程式
DJNZ R0,LOOP ;沒有移動夠7次繼續移動
AJMP START ;移動完7次後跳到開始重來,以達到迴圈流動效果
DELAY: ;延時子程式
MOV R0,#255;延時一段時間
D1: MOV R1,#255
DJNZ R1,$
DJNZ R0,D1
RET ;子程式返回
END ;程式結束
3。3查表法
上面的兩個程式都是比較簡單的流水燈程式,“流水”花樣只能實現單一的“從左到右”流方式。運用查表法所編寫的流水燈程式,能夠實現任意方式流水,而且流水花樣無限,只要更改流水花樣資料表的流水資料就可以隨意新增或改變流水花樣,真正實現隨心所欲的流水燈效果。我們首先把要顯示流水花樣的資料建在一個以TAB為標號的資料表中,然後透過查表指令“MOVC A,@A+DPTR”把資料取到
累加器
A中,然後再送到P1口進行顯示。具體源程式如下,TAB標號處的資料表可以根據實現效果的要求任意修改。
ORG 0000H ;微控制器上電後從0000H地址執行
AJMP START ;跳轉到主程式存放地址處
ORG 0030H ;設定主程式開始地址
START:MOV SP,#60H ;設定堆疊起始地址為60H
MOV DPTR,# TAB ;流水花樣表首地址送DPTR
LOOP: CLR A ;累加器清零
MOVC A,@A+DPTR ;取資料表中的值
CJNE A,#0FFH,SHOW;檢查流水結束標誌
AJMP START ;所有花樣流完,則從頭開始重複流
SHOW: MOV P1,A ;將資料送到P1口
ACALL DELAY ;呼叫延時子程式
INC DPTR ;取資料表指標指向下一資料
AJMP LOOP ;繼續查表取資料
DELAY: ;延時子程式
MOV R0,#255 ;延時一段時間
D1: MOV R1,#255
DJNZ R1,$
DJNZ R0,D1
RET ;子程式返回
TAB: ;下面是流水花樣
資料表
,使用者可據要求任意編寫
DB 11111110B ;二進位制表示的流水花樣資料,從低到高左移
DB 11111101B
DB 11111011B
DB 11110111B
DB 11101111B
DB 11011111B
DB 10111111B
DB 01111111B
DB 01111111B ;二進位制表示的流水花樣資料,從高到低右移
DB 10111111B
DB 11011111B
DB 11101111B
DB 11110111B
DB 11111011B
DB 11111101B
DB 11111110B
DB 0FEH,0FDH,0FBH,0F7H ;
十六進位制
表示的流水花樣資料
DB 0EFH,0DFH,0BFH,7FH
DB 7FH,0BFH,0DFH,0EFH
DB 0F7H,0FBH,0FDH,0FEH
……
DB 0FFH ;流水花樣結束標誌0FFH
END ;程式結束
4。結語
當上述程式之一編寫好以後,我們需要使用編譯軟體對其編譯,得到微控制器所能識別的
二進位制程式碼
,然後再用程式設計器將二進位制程式碼燒寫到AT89C51微控制器中,最後連線好電路通電,我們就看到LED1~LED8的“流水”效果了。本文所給程式實現的功能比較簡單,旨在拋磚引玉,使用者可以自己在此基礎上擴充套件更復雜的流水燈控制,比如鍵盤控制流水花樣、控制流水燈顯示數字或圖案等等。