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