51單片機實現(xiàn)LED流水燈(數(shù)組方式和位運算方式)
名稱:51單片機實現(xiàn)LED流水燈(數(shù)組方式和位運算方式)
說明:今天又重新開始系統(tǒng)的學習51了,LED就算個開端吧。
要注意兩點:
1、sfr和sbit是C語言擴展出來的關(guān)鍵字。其中sfr用于對特殊功能寄存器進行聲明,sbit用于對某些特殊功能寄存器的某位進行聲明。這里和宏定義很相似,但是不能用宏定義進行替換,對于前者是因為51單片機的寄存器存在于內(nèi)部空間0x80-0xFF,這空間屬于直接尋址,51特殊功能寄存只能直接尋址,不能間接尋址。如果用宏定義的話,在翻譯成匯編時就會認為是通過總線訪問對應(yīng)的外部地址了。對于后者,sbit是定義一個標志位,也叫位變量。而類似于#define key1 P3^0就說不通了。
2.對于一般的二極管LED來說,驅(qū)動其發(fā)光的電流一般為5-30mA。所以一般的發(fā)光二極管都接成灌電流的形式,(即電流是流入單片機的,使其對應(yīng)位為低電平)。但是我用的開發(fā)板用的卻不是這種形式,(在這里是高電平對應(yīng)的二極管工作。)但是51單片機IO口輸出的電流大小只有1-2mA,為什么足以驅(qū)動二極管發(fā)光呢(私自以為是中間接了一些能夠放大電流的東西)?
*/
#include
#define uchar unsigned char
//延時函數(shù)
void delay_ms(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i
for(j=0;j<123;j++);
}
//以數(shù)組方式實現(xiàn)流水燈
void LEDlightByArray()
{
uchar _data[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar i = 0;
while(1)
{
for(i = 0;i<8;++i)
{
P2 = _data[i];
delay_ms(1000);
}
}
}
//利用位運算實現(xiàn)流水燈
void LEDlightByBitOpe()
{
uchar i = 0;
while(1)
{
P2 = 0x01;
for(i = 0;i<8;++i)
{
delay_ms(1000);
P2 = P2<<1;
}
}
}
int main()
{
//LEDlightByArray();
LEDlightByBitOpe();
return 0;
}