目錄
前言
一、點亮一個LED
二、LED閃爍
三、LED流水燈
四、獨立按鍵控制LED
獨立按鍵控制LED亮滅
獨立按鍵控制LED狀態(tài)
獨立按鍵控制LED以二進制形式顯示
獨立按鍵控制LED狀態(tài)循環(huán)移位
總結
前言
?
????????嵌入式學習的入門就是點亮LED燈,就好比學習編程語言敲 “Hello world” 一樣
一、點亮一個LED
? ? ? ? 8051系列單片機上電默認都是高電平,而開發(fā)板上的LED都是共陽極的,所以只有輸出低電平才會產(chǎn)生電勢差,LED才會被點亮。那么為什么要用共陽極呢?這是因為51單片機IO默認是準雙向口模式,它的驅動能力很弱,弱到不足以點亮LED燈,只能用來輸出高低電平信號,所以共陽極只需要將端口電位拉低就可以了。
#include <REGX52.H>
sbit LED = P2^0; //將P2_0引腳定義為LED
void main()
{
LED=0;
while(1){}
}
? ? ? ? IO口的配置可以采用字節(jié)尋址和位尋址兩種方法,也就是說上述代碼還可以這樣寫:
#include <REGX52.H>
void main()
{
P2=0xFE; //1111 1110
while(1){}
}
????????將程序燒錄進單片機,這樣一顆LED就被點亮了!
二、LED閃爍
? ? ? ? 將LED循環(huán)往復的置高置低并在期間加入一定的延時,就形成了閃爍的效果:
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz 這里的延時就是讓程序在循環(huán)里空跑消耗時間
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE; //1111 1110
Delay500ms();
P2=0xFF; //1111 1111
Delay500ms();
}
}
三、LED流水燈
? ? ? ? 流水燈只需要循環(huán)點亮每一個LED并加入延時即可
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE;//1111 1110 // 8位依次置為0
Delay500ms();
P2=0xFD;//1111 1101
Delay500ms();
P2=0xFB;//1111 1011
Delay500ms();
P2=0xF7;//1111 0111
Delay500ms();
P2=0xEF;//1110 1111
Delay500ms();
P2=0xDF;//1101 1111
Delay500ms();
P2=0xBF;//1011 1111
Delay500ms();
P2=0x7F;//0111 1111
Delay500ms();
}
}
????????或者可以用個循環(huán)左移函數(shù) _nrol_() 可以簡潔得多,需要引入頭文件#include <INTRINS.H>
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
unsigned char tem = 0xfe; //設置初值1111 1110
while(1)
{
P2 = tem; //LED的IO口位
tem = _crol_(tem,1); //_crol_:循環(huán)左移函數(shù) 1111 1101 函數(shù)的參數(shù)tem是要移位的十六進制數(shù),1是每次移的位數(shù)
Delay500ms();
}
}
四、獨立按鍵控制LED
????????獨立按鍵需要再使用一個IO口做檢測,當然開發(fā)板上是已經(jīng)連接好了的,K1 ~ K4分別接在P3_0 ~ P3_3引腳(很多普中的板子K1和K2是接反的,也就是P3_0是K2,也就是P3_1是K1),當按鍵按下時,IO口與GND短路電位被拉低,單片機即可接收到按鍵按下的信號。
? ? ? ? 這里需要注意一下,當按鍵按下時,按鍵內(nèi)部的彈簧片會在接觸的臨界點產(chǎn)生抖動,這會使得信號不穩(wěn)定,需要加入一段極短的延時做軟件消抖。
獨立按鍵控制LED亮滅
????????判斷按鍵是否被按下,如果按下就點亮LED
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0 || P3_0==0) //如果K1按鍵或K2按鍵按下
{
P2_0=0; //LED1輸出0,點亮
}
else //松手
{
P2_0=1; //LED1輸出1,熄滅
}
}
}
獨立按鍵控制LED狀態(tài)
? ? ? ? 當按鍵按下時,給LED取反
#include <REGX52.H>
void Delay(unsigned int xms) //定義一個有形式參數(shù)的延時函數(shù),可改變延時的時間
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0) //如果K1按鍵按下
{
Delay(20); //延時消抖
while(P3_1==0); //松手檢測
Delay(20); //延時消抖
P2_0=~P2_0; //LED1取反
}
}
}
獨立按鍵控制LED以二進制形式顯示
? ? ? ? 當按鍵按下時LED會以二進制的規(guī)律依次被點亮,一個char型是1字節(jié),8位二進制,正好對應8個LED
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main()
{
unsigned char LEDNum=0;
while(1)
{
if(P3_1==0) //如果K1按鍵按下
{
Delay(20); //延時消抖
while(P3_1==0); //松手檢測
Delay(20); //延時消抖
LEDNum++; //變量自增 0000 0001 ~ 0000 0010 ~ 0000 0011 ...
P2=~LEDNum; //因為是低電平點亮,所以變量取反輸出給LED
}
}
}
獨立按鍵控制LED狀態(tài)循環(huán)移位
? ? ? ? 創(chuàng)建一個變量“LEDNum”,每次按鍵按下“LEDNum”自增或自減,"<<"為左移操作符,將0x01左移LEDNum位就是把“1”左移,再取反賦給LED就是點亮第“LEDNum”位
#include <REGX52.H>
void Delay(unsigned int xms);
unsigned char LEDNum;
void main()
{
P2=~0x01; //上電默認LED1點亮
while(1)
{
if(P3_1==0) //如果K1按鍵按下
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++; //LEDNum自增
if(LEDNum>=8) //限制LEDNum自增范圍
LEDNum=0;
P2=~(0x01<<LEDNum); //LED的第LEDNum位點亮
}
if(P3_0==0) //如果K2按鍵按下
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDNum==0) //LEDNum減到0后變?yōu)?
LEDNum=7;
else //LEDNum未減到0,自減
LEDNum--;
P2=~(0x01<<LEDNum); //LED的第LEDNum位點亮
}
}
}
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
masterLED文章來源:http://www.zghlxwxcb.cn/news/detail-735609.html
總結
????????祝各位都能成為點燈大師!文章來源地址http://www.zghlxwxcb.cn/news/detail-735609.html
到了這里,關于51單片機點亮LED燈的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!