關於單片機的led燈的二三事,初學者的開端
///插播一條:我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以哦~點我頭像黑色字體加我地球呺也能領取哦。最近比較閒,帶做畢設,帶學生參加省級或以上比賽///
一、點亮
工作原理:
如圖,二極體陽極連接電阻,二極體陰極連接單片機引腳。D0對應P20,D1對應P21,,,,,,,都通過P2孔進行控制。
二極管:
電源正極連接到二極體陽極,負極連接到陰極,二極體正常工作。所以,原理圖中,引腳為低電平,連接的是二極體的陰極,陽極通過與電阻連接,電阻連接的是高電平,所以二極體正常工作。電阻的作用為保護二極體。
程序編寫
#include"reg52.h"
sbit LED=P2^0; /*sbit用於定義變量。LED為自定義變量。將P2.0(注意不要寫成P2.0,應寫為P^0)孔賦給變量LED*/
void main()
{
while(1)
{
LED=0;/*由二極體的工作原理可得,二極體接P2.0孔,所以該孔為低電平,為0*/
}
}
二、閃爍
工作原理
在點亮LED燈的基礎之上。
原理上基本與點亮LED燈工作原理相同。
自定義一個延時函數。
主函數先點亮燈,在調用延時函數,在熄滅燈,然後在調用延時函數,將這些放入循環一直執行。完成
代碼
#include "reg52.h"
typedef unsigned char u8; //重定義字符型變量
typedef unsigned int u16; //重定義整型變量
/*自定義延時函數*/
void dealy(u16 i)
{
while(i--);
}
sbit led=P2^0;
void main()
{
while(1)
{
led=0; //點亮,陰極接低電平
dealy(50000);
led=1; //熄滅,陰極接高電平
dealy(50000);
}
}
三、流水燈
·工作原理
1.在LED點亮、LED閃爍實驗的基礎之上。
2.移位函數
crol(a,b):循環左移函數,a為左移的值,b為左移的位數。
cror(a,b):循環右移函數,a為右移的值,b為右移的位數。
移位函數包含在instrins.h庫函數裡面。
3.c語言中十六進位的表示
·Ox代表的是十六進位的前綴,不用讀。例如OXaaOxbb,只看aa,bb就行。
·十六進位到二進位轉換
十六進位表示:每一位有不同的數碼0~9,A(10),B(11),C(12),D(13),E(14),F(15)
十六進位轉二進位:將十六進位的每一位轉化為二進位即可。例如8FA,=>1000 1111 1010
·運作過程
·先看原理圖
LED原理圖(陽極解高電平),陰極通過電阻接接引腳
引腳默認接高電平,所以,初始時燈為熄滅狀態。
·流水實現
利用十六進位位位移函數實現左移和右移
_crol_(0xfe,1):0xfe轉化為二進位為1111 1110;1代表位數
f代表原理圖中的4個高位引腳,e代表4個低位引腳。
1111 1110 =>p0=0(低電平,燈亮)
1111 1101 =>左移,p1=0,第二個燈亮
1111 1011 =>p2
…………
_cror_(oxfe,1):與左移原理相同(從0111 1111開始向右移)
·代碼實現
#include
#include
typedef unsigned char u8; //重定義全局字符型變量
typedef unsigned int u16; //重定義全局整型變量
#define led P2//宏定義LED為p2埠
/*延時函數*/
void dealy(u16 i)
{
while(i--);
}
void main()
{
u16 i; //定義變量i
P2=0xfe; //點亮第一個LED燈,即1111 1110.
dealy(50000); //延時450ms
while(1)
{
for(i=0;i8個LED燈,利用for循環一直執行
{
led=_crol_(led,1); // 1111~1110~0111 1111,左移
dealy(50000);
}
for(i=0;i8個LED燈,利用for循環一直執行
{ led=_cror_(led,1); //0111 1111變小,呼吸燈效果就出來了。單片機用來控制頻率,得計算RC的振蕩頻率