❶ 如何用單片機做流水燈
因為電路用單片機控制,所以電路非常簡潔。其電路原理圖見下圖,印製板圖如下圖所示。
電路的核心部分是AT89C2051單片機,前面提到它有Pl和P3兩組I/O口,我們這里只用到Pl口,共8個引腳。圖中Cl、R9組成典型的上電復位(即在加電時單片機復位)電路,XTAL、C2、C3與AT89C2051片內振盪電路組成時鍾振盪器。值得注意的是,C2、C3的容量不能與圖中數值偏差太大,否則可能引起不起振或振盪不穩定。XTAL的頻率可以在4-20MHz之間,不過,頻率的變化會導致程序運行速度的變化,這樣就需要調整延時子函數的參數。事實上,不調整參數亦可,只是此時延遲時間不再是1秒,其延遲時間會隨著XTAL頻率的降低而增加。
二、軟體部分
本程序包含兩個函數,一個是主函數,另一個是延時子函數。源程序如下(為了便於講解,我們為每行程序加上了編號):
程序各行作用如下:
00行:把AT89C2051的頭文件「AT89x051.H」包含進來。
01行:聲明Delay()延時子函數,該函數有一個無符號整型參數k,同時函數前面的void表明函數不返回函數值。
02行:延時子函數的開始,同時聲明兩個無符號整型變數i和j。
不過請注意,這里沒有象上期的程序一樣,把表示函數開始的「{」單獨成行,而是把下一行寫在一起了。事實上,寫C程序的時候,可以把多行寫作一行,C編譯器只要遇到分號就認為是一行語句的結束。
當然,我們不能因為C程序有這個特點,就隨意把多行合作一行書寫,實際書寫C程序的時候,還是要養成良好的程序書寫習慣,按照約定俗成的原則來書寫。
03行:聲明for()循環。這個循環的初始條件是i=0,終止條件是i<k,循環計數是每循環一次,用手計數的變數i加1。因此,這個循環的循環次數就是k次。這樣,只要改變k的值(即改變Delay()延時子函數的參數k的值),就可以很容易地控制循環次數,從而獲得不同的延時時間。
04行:聲明嵌套在03循環中的一個新的for()循環,這個循環與上一個循環相似,其循環次數是120次。本循環與上一個循環嵌套後,使得總的循環次數達120×k次。
05行:第一個分號,表示L條空語句,佔用一個機器時間,以實現延時的目的。後面的兩個「}」中,第一個「}」是04行for()循環的結束標志,程序遇到它時,將自動返回04行,使用於循環計數的變數j加1,同時判斷j是否小於120,如果否,則轉入05行;第二個是03行for()循環的結束標志,程序遇到它則會返回03行
❷ 學習單片機流水燈的步驟
學習單片機的第一個程序就是流水燈實驗學習單片機的第一個程序就是流水燈實驗學習單片機的第一個程序就是流水燈實驗學習單片機的第一個程序就是流水燈實驗!!!!學習語言的輸出學習語言的輸出學習語言的輸出學習語言的輸出的第一個程序就是的第一個程序就是的第一個程序就是的第一個程序就是 hello word! 這都是一個過程這都是一個過程這都是一個過程這都是一個過程!!!! 我們知道單片機執行的機器語言我們知道單片機執行的機器語言我們知道單片機執行的機器語言我們知道單片機執行的機器語言!!!!匯編就是其執行的根本的語言匯編就是其執行的根本的語言匯編就是其執行的根本的語言匯編就是其執行的根本的語言,,,,任任任任何程序的編譯最終還是要生成何程序的編譯最終還是要生成何程序的編譯最終還是要生成何程序的編譯最終還是要生成HEX語言語言語言語言,,,,匯編語言匯編語言匯編語言匯編語言~~!!!! 來回顯示來回顯示來回顯示來回顯示,,,,並且顯示時還會發出蜂嚀聲並且顯示時還會發出蜂嚀聲並且顯示時還會發出蜂嚀聲並且顯示時還會發出蜂嚀聲!!!! P1口接八個發光二極體口接八個發光二極體口接八個發光二極體口接八個發光二極體,,,,P2.3接一個蜂嚀器接一個蜂嚀器接一個蜂嚀器接一個蜂嚀器!!!! 一一一一....匯編語言匯編語言匯編語言匯編語言 mov r7,#8 main:mov r0,#8 ;一個循環需要移動一個循環需要移動一個循環需要移動一個循環需要移動8位位位位 mov p1,#01111111b ;初始為初始為初始為初始為P0.7燈點亮燈點亮燈點亮燈點亮 loop: clr p2.3 acall ds1ms ;延時延時延時延時,,,,以便人眼可以觀察到以便人眼可以觀察到以便人眼可以觀察到以便人眼可以觀察到 setb p2.3 acall ds1ms mov a,p1 ;讀讀讀讀P0口當前顯示的數據送到口當前顯示的數據送到口當前顯示的數據送到口當前顯示的數據送到A rr a ;將將將將A中的數據循環右移中的數據循環右移中的數據循環右移中的數據循環右移1位位位位 mov p1,a ;再將再將再將再將A中右移過的數據送到中右移過的數據送到中右移過的數據送到中右移過的數據送到P0 djnz r0,loop djnz r7,main ;移動不夠移動不夠移動不夠移動不夠8位位位位,,,,跳到跳到跳到跳到LOOP處循環處循環處循環處循環, ljmp rel ;流動流動流動流動1遍跳轉到遍跳轉到遍跳轉到遍跳轉到MAIN處循環流處循環流處循環流處循環流。。。。 ;---顯示延時顯示延時顯示延時顯示延時---------- ds1ms: mov r1,#1 ds1lo: mov r2,#200 ds2lo: mov r3,#200 djnz r3,$ djnz r2,ds2lo djnz r1,ds1lo ret ;延時返回延時返回延時返回延時返回 rel:end 二二二二.C語言語言語言語言 #include<reg52.h> unsigned char i; unsigned char temp; unsigned char a,b; void delay(void) //延時子程序延時子程序延時子程序延時子程序 { unsigned char m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); } void main(void) //主程序主程序主程序主程序 { while(1) //循環條件永遠為真循環條件永遠為真循環條件永遠為真循環條件永遠為真,,,,以下程序一直執行下去以下程序一直執行下去以下程序一直執行下去以下程序一直執行下去。。。。 { temp=0xfe; P1=temp; //直接對直接對直接對直接對I/O口口口口P1賦值賦值賦值賦值,,,,使使使使P1.0輸出低點平輸出低點平輸出低點平輸出低點平。。。。 delay(); //延時延時延時延時 for(i=1;i<8;i++) //實現廣告燈的移動實現廣告燈的移動實現廣告燈的移動實現廣告燈的移動 { a=temp<<i; b=temp>>(8-i); P1=a|b; delay(); } for(i=1;i<8;i++) //實現廣告燈的反方向移動實現廣告燈的反方向移動實現廣告燈的反方向移動實現廣告燈的反方向移動 { a=temp>>i; b=temp<<(8-i); P1=a|b; delay(); } } } 實驗很簡單實驗很簡單實驗很簡單實驗很簡單!!!!懂的朋友完全可以在此基礎上開發懂的朋友完全可以在此基礎上開發懂的朋友完全可以在此基礎上開發懂的朋友完全可以在此基礎上開發!!!!比如一個愛心的流比如一個愛心的流比如一個愛心的流比如一個愛心的流水燈水燈水燈水燈。。。。如果你看懂了這兩個程序如果你看懂了這兩個程序如果你看懂了這兩個程序如果你看懂了這兩個程序!!!!恭喜你恭喜你恭喜你恭喜你,,,,你已經入門你已經入門你已經入門你已經入門!!!!
❸ 單片機實驗流水燈
ProteUS模擬通過
要ProteUS文件的話,留言
; 四個按鍵控制八個LED燈,
; 按鍵接p1,燈接p0口,
; 要求按1號鍵八個燈循環亮,跟流水燈樣的,
; 按下2號鍵燈先從左亮到右,然後從右亮到左,這樣一次循環,
; 按下3號鍵,先兩端兩個燈亮,兩端滅,然後次兩端的亮,直到中間兩個亮,
; 然後高低四位交替亮一次,再奇偶亮一次,一次循環;
; 按下4號鍵就各位棒棒忙想出一個方案。
; 頭疼啊,誰能搞出來呀。。
ORG 00H
AJMP _INIT_SYS
_INIT_SYS:
MOV SP,#80H
_MAIN_LOOP:
_WAY0: ;{
MOV A,#0FEH
_WAY0_LOOP:
RR A
MOV P0,A
LCALL _DELAY500MS
AJMP _WAY0_LOOP ;}
_WAY1: ;{
CLR C
MOV A,#0FFH
_WAY1_LOOP0:
RRC A
_WAY1_LOOP:
RRC A
MOV P0,A
JNC _WAY1_LOOP11
LCALL _DELAY500MS
AJMP _WAY1_LOOP
_WAY1_LOOP11:
RLC A
_WAY1_LOOP1:
RLC A
MOV P0,A
JNC _WAY1_LOOP0
LCALL _DELAY500MS
AJMP _WAY1_LOOP1 ;}
_DELAY500MS: ;{
PUSH 0
PUSH 1
PUSH 2
MOV R0,#50
_DEL0:
MOV R1,#100
_DEL1:
MOV P1,#0FFH
JNB P1.0, _WAY0
JNB P1.1, _WAY1
JNB P1.2, _WAY2
JNB P1.3, _WAY3
MOV R2,#100
DJNZ R2,$
DJNZ R1, _DEL1
DJNZ R0, _DEL0
POP 2
POP 1
POP 0
RET
;}
_WAY2: ;{
MOV P0,#7EH
LCALL _DELAY500MS
MOV P0,#10111101B
LCALL _DELAY500MS
MOV P0,#11011011B
LCALL _DELAY500MS
MOV P0,#11100111B
LCALL _DELAY500MS
MOV P0,#0F0H
LCALL _DELAY500MS
MOV P0,#0FH
LCALL _DELAY500MS
MOV P0,#055H
LCALL _DELAY500MS
MOV P0,#0AAH
LCALL _DELAY500MS
AJMP _WAY2
;}
_WAY3: ;{
MOV P0,#0FFH
LCALL _DELAY500MS
MOV P0,#0FEH
LCALL _DELAY500MS
MOV P0,#0FCH
LCALL _DELAY500MS
MOV P0,#0F8H
LCALL _DELAY500MS
MOV P0,#0F0H
LCALL _DELAY500MS
MOV P0,#0E0H
LCALL _DELAY500MS
MOV P0,#0C0H
LCALL _DELAY500MS
MOV P0,#080H
LCALL _DELAY500MS
MOV P0,#000H
LCALL _DELAY500MS
AJMP _WAY3 ;}
END
❹ 單片機實驗板流水燈
安裝個控制器就是了。
❺ 單片機c語言流水燈的實驗報告
這個怎麼寫??X個發光二極體連續依次閃爍,往復不斷。能夠成功正確地完成編寫的程序。體現了單片機工作正常,語句使用得當,試驗完美成功。
❻ 單片機流水燈實驗原理
上一節我們介紹了什麼是匯流排的方法,以及如何通過十六進制來控制IO口。並把我們的之前單點操作的流水燈進行了改進,成為了一個新的更加簡潔的程序。這回,就再用匯流排方法,來實現流水燈的更加多樣化的操作。
這次,我們要實現正向流水結束後再反過來流水,如此循環。然後再間隔閃爍。然後再累積流水,最後結束。
正向流水結束,再反過來。這個如何實現呢,我們需要使用到一些運算方法。
第一個是移位指令<<。
由於數字對比不強,看的不是很清晰,所以把數字給換成紅色了。
<<這個標志符的意思是,向左移動一位,就像下邊這樣:
1111 1111》1111 111_
移動完成後,會發現,最低位空出來了,此時程序會自動去填補一個0。於是就成了:
1111 1111》1111 111_》1111 1110
第一次移位1111 1110,第二次在第一次基礎上移位1111 1100,第三次在第二次基礎上移位1111 1000,如此循環,就可以一直把所有位都變成0。
我們在看下一句"|",這個符號是或的意思,我們知道,邏輯中的或,是說只要有其一為一,結果就是一。所以,我們把1100|0001,結果就是頭兩個一和最後一個一留下來,第三位因為都是0,所以就是0.結果就是1101了。當再次移位後,數據就變成1010了,我們再次跟0001取或,最後一位就再次置1,結果就是1011,從結果上看,1110》1101》1011……就是0在不斷的左移。
通過這個方法,可以讓每一位都會單獨置零。然後再給以一定時間的延時,就會看到流水燈了。
如果我們不賦初值0xfe會出現什麼情況?
就會出現,移位產生一個0,在或運算時就會被重新置1,如此循環,就進入不到第二個LED,也就不會出現流水燈了。可以自己嘗試下。
向右流水,效果是一樣的,需要注意的是初值更改為左側為0,就是0x7f,0111 1111,然後移位符號>>,還有取或的語句需要用0x80,1000 0000.
基本上是在左移位的基礎上稍作修改即可。
接下來是閃爍的。
閃爍,我們用的是間隔LED的方法,就是隔一個亮一個,埠輸出是1010 1010。翻譯成十六進制就是0xaa。這次用到的是一個取反的運算,就是把每一位的0變成1,1變成0,然後延時一段時間,再次取反,循環幾個周期,就看起來像是不斷閃爍。取反的操作相對好理解一些,就是這一位,現在是1,那麼取反後就是0,就是0和1的變換。
最後是一個累積點亮LED。
這個程序就是把第一個我們向左移位的函數,進行了更改,取消了賦初值,不用取或了,這樣就可以對比著理解,各個語句的作用,如果不使用,會產生什麼結果。如果我們的第一個函數不用取或這一步,那最終輸出結果就和這個現象一樣了。
所以,我們在寫程序時,需要認真,仔細分析自己需要的結果,然後對照程序進行簡單的演算。保證每一段都是可以輸出想要的結果,不然累積到最終,幾百行的代碼,看起來就會頭疼的,尤其是在沒有標注釋的情況下,有時就會忘記自己為什麼要寫這一句。
好的,這篇先說到這里,有問題或建議可以留言或私信給我。
想了解更多精彩內容,快來關注小亮談電氣
更多多內容,歡迎關注百家號:小亮談電氣。微信公眾號:電氣學苑。
❼ 單片機流水燈試驗
#include<AT89X51.H>//預處理文件裡面定義了特殊寄存器的名稱如P1口定義為P1
voidmain(void)
{
//定義數據
constunsignedchardesign[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,
0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,
0xE7,0xDB,0xBD,0x7E,0xFF};
unsignedinta;//定義循環用的變數
unsignedcharb;//在C51編程中因內存有限盡可能注意變數類型的使用
//
do{
for(b=0;b<32;b++)
{
for(a=0;a<30000;a++);//延時一段時間
P1=design[b];//讀已定義的花樣數據並寫花樣數據到P1口
}
}while(1);
}
C語言寫的流水燈,而且用查表程序。
剛試了一下通過,
電路圖如附圖,
想要你的分還真不容易呀!呵呵
❽ 單片機流水燈實驗
ORG
OOOOH
LJMP
MAIN
ORG
1000H
MAIN:MOV
A,#OFEH
AGAIN:MOV
P1,A
RL
A
LCALL
DELAY
JNB
P1.7,TWO//這里判斷P1.7是否為低電平,如果是就轉到TWO
SJMP
AGAIN
TWO:MOV
A,#OFFH
MOV
P1,A
PP:MOV
A,#OFEH
MOV
P2,A
RL
A
LCALL
DELAY
JNB
P2.7,MAIN//同理判斷P2.7
SJMP
PP
DELAY:MOV
R6,#OFFH
L1:
MOV
R7,#OFFH
DJNZ
R7,$
DJNZ
R6,L1
RET
END沒有執行過,應該可行講下思路,P1,P2是接16個LED就在P1最高位的燈亮時,這時轉到TWO中執行,從P2的最低位開始,到最高位即P2.7為低電平時,等挻時完後又轉回P1,如此循環(這里一開始P2埠不用都置1是因為單片機上電時P2埠都為高電平)
❾ 單片機led流水燈實驗步驟
一個小的程序是不需要專門繪制流程圖的。其實在初學階段,畫好流程圖能幫助我們整理好程序設計的脈絡,讓程序變得有條理。在編程的時候,流程圖像一個指路明燈引領著程序的走向,所以應該養成良好的習慣,在編寫程序之前,繪制一份流程圖。
流程圖的繪制方法很簡單,一些編程類書籍有過專門的介紹,在本書就不再講述了。怎樣才能達到我們演示的流水燈的效果,就是讓P1埠在間隔一段時間後,輸出不同的值?假設我們想要的效果是某一時刻,只有一個LED小燈亮,而間隔的時間是一秒,當I/O埠輸出高電平的時候,LED小燈是不亮的,當I/O埠輸出低電平的時候,LED小燈才亮。如圖所示,P1的值用十六進制可以表示為FEH,因為四位二進制數可以表示一位十六進制數。我們得出在不同LED小燈被點亮的時候,P1埠輸出的狀態程序流程圖還是比較簡單的,P1口在間隔一段時間之後,輸出不同的值,然後返回到程序執行的起點,重新開始執行,這樣就會循環往復不斷地出現流水的效果。
❿ 單片機原理流水燈實驗
單片機流水的實質是單片機各引腳在規定的時間逐個上電,使LED燈能逐個亮起來但過了該引腳通電的時間後便滅燈的過程,實驗中使用了單片機的P2埠, 對8個LED燈進行控制,要實現逐個亮燈即將P2的各埠逐一置零,中間使用時間間隔隔開各燈的亮滅。使用r1或rra實現位的轉換。