A. 單片機流水燈全亮,我亦有同樣問題在看見最佳回答後仍不知如何解決,附網上搜索的最佳回答於問題補充中
單片機默認復位後或者上電後的所有引腳輸出都為高電平,這是為了方便讀取數據。所以,你的單片機在上電之後就是全亮,因為你的LED燈是正極接在了單片機的輸出口上了,LED的負級接的地。這樣晶元上電後,燈就全亮了。有可能你的晶元沒有設置上電復位電路,就是說程序並沒有在晶元上電之後就運行。所以就停在燈全亮這里了。單片機有上復位引腳,有的是上電後高電平脈沖復位,有的是低電平脈沖復,你用的時候要看一下對應型號的晶元手冊上是怎麼表示的。復位引腳的引腳名上有一個橫線說明是低電平復位,沒有橫線說明是高電平復位。電上復位就是加一個電容和阻組成,上電時的這個高電平或者低電平的脈沖時間的要求(一般是12個機器周期),讓晶元復位。這個時候單片機才完成開始硬體時鍾和寄存器初始化同步,接下來才能正常運行程序。
還有一種情況就是你用的是P0口,沒有接上拉電阻,P0口只有低電平沒有高電平。
B. 單片機流水燈實驗原理
上一節我們介紹了什麼是匯流排的方法,以及如何通過十六進制來控制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。
這個程序就是把第一個我們向左移位的函數,進行了更改,取消了賦初值,不用取或了,這樣就可以對比著理解,各個語句的作用,如果不使用,會產生什麼結果。如果我們的第一個函數不用取或這一步,那最終輸出結果就和這個現象一樣了。
所以,我們在寫程序時,需要認真,仔細分析自己需要的結果,然後對照程序進行簡單的演算。保證每一段都是可以輸出想要的結果,不然累積到最終,幾百行的代碼,看起來就會頭疼的,尤其是在沒有標注釋的情況下,有時就會忘記自己為什麼要寫這一句。
好的,這篇先說到這里,有問題或建議可以留言或私信給我。
想了解更多精彩內容,快來關注小亮談電氣
更多多內容,歡迎關注百家號:小亮談電氣。微信公眾號:電氣學苑。
C. 單片機蜂鳴器響三下停止,流水燈亮
單片機蜂鳴器響三下停止,流水燈亮,出現這樣的情況是系統出了問題,在預警報警,所以你要把機器關掉進行檢查維修。
D. 單片機流水燈全亮在滅在亮的程序怎麼寫
你流水燈都寫好了 全亮全滅還不簡單啊,設置 P0=0X00 (假設低電平亮,高電平滅) 在延遲一下 在P0=0XFF 在延時 不就OK了 把這幾個指令打包下放到一個子程序里 你用按鍵控制的時候就讓按鍵執行這個子程序 如果是 主程序循環的 話就放進主程序
E. 單片機流水燈
P0口控制,先奇數亮再偶數亮,循環三次;一個燈上下循環三次;兩個分別從兩邊往中間流動三次;再從中間往兩邊流動三次;不過這個程序實現的應該是這樣的
先奇數亮再偶數亮,循環三次;一個燈上下循環三次;兩個分別從兩邊往中間流動;再從中間往兩邊流動(延時0.1s)
#include< reg52.h>
#include< intrins.h>//頭文件
#define uint unsigned int
#define uchar unsigned char//聲明用unit代替unsigned int,下個同理
void delay();
void main()
{ uchar temp,temp1,temp2,a,b;
while(1)
{ for(b=3;b>0;b--)
{ temp=0xaa;
P0=temp;
delay();
temp=0x55;
P0=temp;
delay();//調用延時函數
}
for(a=3;a>0;a--)
{ temp=0xfe;
for(b=7;b>0;b--)
{ P0=temp;
temp=_crol_(temp,1);
delay();
P0=temp;
delay();
}
}
temp1=0xfe;
temp2=0x7f;
for(a=8;a>0;a--)
{
temp=temp1&temp2;
P0=temp;
delay();
temp1=_crol_(temp1,1);
temp2=_cror_(temp2,1);
}
}
}
void delay()
{ uint a,b;
for(a=100;a>0;a--)
for(b=100;b>0;b--);
} //延時函數
希望可以幫助到您
謝謝
F. 單片機8個流水燈從led8亮到led1每次亮一個並保存已亮燈狀態
摘要 這個流水燈是很普通的一種花樣,假設LED接P1口,程序如下:
G. 單片機點亮八位共陽極流水燈,陽極開路,燈也亮,但不是很亮,陽極接vcc後,就很亮了,什麼原因呢
正常,這是虛電多少伏,因為正極對車身沒有通路,量出來的都是懸空的虛電。
H. 51單片機通電後流水燈一直亮著,且一直響,這是為什麼
哥們描述清楚一點 晶元剛剛上電會留存原來的程序 可能原來晶元里就有流水燈和蜂鳴器的程序
I. 單片機 流水燈怎樣全部閃爍 五次之後停止
可以用for循環試試unsingned char i;for(i=0;i<5;i++)//流水燈閃爍程序。
若干個燈泡依次點亮就叫流水燈,它用在夜間建築物裝飾方面。例如在建築物的稜角上裝上流水燈,可起到變換閃爍美不勝收的效果。
單片機(Single-Chip Microcomputer)是一種集成電路晶元,是採用超大規模集成電路技術把具有數據處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統、定時器/計數器等功能。
集成到一塊矽片上構成的一個小而完善的微型計算機系統,在工業控制領域廣泛應用。從上世紀80年代,由當時的4位、8位單片機,發展到現在的300M的高速單片機。
J. 52單片機中用中斷程序中有的流水燈中斷結束後怎麼還亮著
把P1=0xff放到while循環里 是正解 這樣是不會導致數碼管閃爍的 因為沒看到電路圖,但是程序應該是沒有問題的,你可以將程序改回原來的樣子在試試看,如果數碼管不閃爍,那麼就用改用邊沿觸發方式吧,程序還原不變在EX0=1後面加上 TCON=1;就行了