㈠ 51單片機流水燈程序解析,求大神指導,本人是初學者。
首先,樓主要搞清楚P口的值與P口每一個輸出端的關系,也即樓上所說的,要轉換成二進制來看,數據0xfe = 1111 1110中的每一個1或0對應一個埠的高或低電平;其次樓主要結合電路圖LED的接法與單片機埠的屬性,搞清楚是1使得燈亮還是0使得燈亮;最後樓主要知道函數_crol_(P0,1)的作用,它是將P0的值循環左移後,即比如原來P0為1111 1110,循環左移後為1111 1101,再賦值給P0,你如果給P0一開始設置的初值為0x00,那當然不論怎麼循環都是0x00,沒有流水燈的效果。
㈡ 51單片機流水燈原理
單片機流水燈控制原理就是將多個LED燈珠連接到不同的單片機輸出端上,編程使單片機的這些輸出端逐個的輸出信號點亮LED,在設置好各個LED的通電時間和通電間隔時間後,就可以看到這些LED燈珠此起彼伏的亮起,如同流水一樣.
㈢ 如何用單片機做流水燈
因為電路用單片機控制,所以電路非常簡潔。其電路原理圖見下圖,印製板圖如下圖所示。
電路的核心部分是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行
㈣ C51單片機編程,按鍵控制流水燈
#include "reg51.h"
unsigned char led[]={0xfe,0xfd,0xfb,0xf7}; //LED燈的花樣數據
void delay(unsigned char time){ //延時函數
unsigned int j=15000;
for(;time>0;time--)
for(;j>0;j--);
}
void main(){
bit dir=0,run=0; //標志位定義及初始化
char i;
while(1){
switch (P0 & 0x0f){ //讀取鍵值
case 0x0e:run=1;break; //K1動作,設run=1
case 0x0d:run=0,dir=0;break; // K2動作,設run=dir=0
case 0x0b:dir=1;break; //K3動作,設dir=1
case 0x07:dir=0;break; //K4動作,設dir=0
}
if (run) //若run=dir=1,自上而下流動
if(dir)
for(i=0;i<=3;i++){
P2=led[i];
delay(200);
}
else
for(i=3;i>=0;i--){ //run=1,dir=0,自下而上流動
P2=led[i];
delay(200);
}
else P2=0xff; //若run=0,全部燈滅
}
}
㈤ 51單片機流水燈電路的問題
亮度的大小看電流,所以,如果覺得不夠亮,你將限流電阻減小一點就可以了,一般10毫安,LED足夠亮。
㈥ 51單片機流水燈程序
程序如下:
#include <reg52.h>
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;
void main()
{
int i,j;
//點亮第一個燈
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//延時1秒
for(i = 0;i < 110; ++i)
{
for(j = 0; j < 1000; ++j)
{
;//什麼也不做
}
}
//點亮第二個燈
led1 = 0;
led2 = 1;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//點亮剩餘的燈
//省略……
while(1);
}
流水燈幾點說明:
void:因為該延時函數不需要返回值,所以寫為void
delay1s:該函數的函數名,命名需要符合C語言的標識符命名規則。
(): 不需要傳入參數,所以括弧中為空
至此我們可以把流水燈程序寫為以下形式: