⑴ 用51單片機,怎麼來控制1000個左右的LED燈呢
方法1:1000個左右的燈,需要10根地址線選通,51的IO管腳應該是沒有問題。剩下的就是要用大量的解碼器,把二進制信息轉換為管腳信息。
估計你僅僅是控制亮和滅,如果是這樣選通也就可以進行明暗的控制,否則輸出的信息也要加進去,就是說需要加驅動電路。
方法2:用移位電路,比如HC595,在51中地址做為串列信號發出,轉換為對應的地址線,然後在連接解碼器,這樣,51的管腳比較節省,但,編程的難度稍大。
你可以參考一下鍵盤解碼器的電路,控制16個和控制1000個的原理是一樣的。
⑵ 單片機控制led燈的創新點是什麼
單片機控制led燈的創新點是,LED的陽極全部接到了正極(電源),當負極接到LED的陰極時就會發光,因為LED的陰極與單片機的P2口相接,如果你想點亮那一個LED就把單片機相應的引腳賦值為低電平。具體如下:1、LED基礎知識
LED是發光二極體的一種,它具有單向導電的特點,在51開發板上使用的是貼片式發光二極體,正向導電電壓在1.8-2.2v之間,工作時的電流在1-20mA。當電流在1-5mA之間變化時,肉眼可以觀測到亮度的變化,但是當電流在5-20mA之間變化時,亮度變化不太明顯。如果電流一直增大二極體可能會燒壞。其餘LED知識就不再進行敘述,其中LED原理圖如下圖所示。
LED原理圖
2、點亮第一個LED燈
由原理圖可知,LED的陽極全部接到了正極(電源),當負極接到LED的陰極時才會發光,因為LED的陰極與單片機的P2口相接,如果你想點亮那一個LED就把單片機相應的引腳賦值為低電平,具體程序如下:
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
sbit led=P2^0; //將單片機的P2.0埠定義為led
void main()
{
while(1)
{
led=0;//P2.0埠設置為低電平
}
}
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
3、LED閃爍
如果想讓LED進行閃爍就要涉及到延時,針對單片機進行延時的方法有很多,在此向大家推薦一種比較簡單的程序助手—單片機小精靈,可以直接進行設置時間,並且生成相應的代碼。
將P2^0引腳的LED進行間隔一秒閃爍的程序如下:
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
#include "intrins.h" //頭文件
sbit led=P2^0; //將單片機的P2.0埠定義為led
void delay1s() //延時1s,誤差 0us
{
unsigned char a,b,c;
for(c=46;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void main()//主程序
{
while(1)
{
led=0;//P2.0埠設置為低電平
delay1s();//調用延時函數
led=1;//P2.0埠設置為低電平
delay1s();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
為了使程序更好的進行表達,使用16進制進行表述,程序如下:
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
#include "intrins.h" //頭文件
void delay1s() //延時1s,誤差 0us
{
unsigned char a,b,c;
for(c=46;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void main()//主程序
{
while(1)
{
P2=0xFE;//P2.0埠設置為低電平
delay1s();//調用延時函數
P2=0xFF;//P2.0埠設置為低電平
delay1s();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
上面是針對一個LED燈進行的設計,下面針對8個LED燈依次閃爍進行設計,具體程序如下:
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
#include "intrins.h" //頭文件
void delay1s() //延時1s,誤差 0us
{
unsigned char a,b,c;
for(c=46;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void main()//主程序
{
while(1)
{
P2=0xFE;//1111 1110
delay1s();//調用延時函數
P2=0xFD;//1111 1101
delay1s();
P2=0xFB;//1111 1011
delay1s();
P2=0xF7;//1111 0111
delay1s();
P2=0xEF;//1110 1111
delay1s();
P2=0xDF;//1101 1111
delay1s();
P2=0xBF;//1011 1111
delay1s();
P2=0x7F;//0111 1111
delay1s();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
4、LED左右移動
上面進行描述的是利用延時並對P2口引腳進行賦值設計LED燈的閃爍,這樣程序較為繁雜,下面將利用「左移」和「右移」進行設計,crol(a,b),左循環,a是左移的值,b是左移的位數;cror(a,b),右循環,a是右移的值,b是右移的位數。包含在instrins.h庫函數中。具體程序如下:
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
#include "intrins.h" //頭文件,包含延時(_nop_ )和函數循環
typedef unsigned int u16;//聲明新類型名
typedef unsigned char u8;//聲明新類型名
#define led P2//宏定義
void delay1s() //延時1s,誤差 0us
{
u8 a,b,c;
for(c=46;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void main()//主程序
{
u8 i;//定義i的類型
led=0xFE;
delay1s() ;
while(1)
{
for(i=0;i<7;i++)//左移
{
led=_crol_(led,1);
delay1s() ;
}
for(i=0;i<7;i++)//右移
{
led=_cror_(led,1);
delay1s() ;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
5、總結
以上程序均進行了實驗驗證,完全正確。針對LED燈的控制,可以和按鍵進行聯合設計,實現更多的功能,後面會進行更新。對於沒有單片機開發板的小夥伴可以利用proteus模擬軟體進行設計。
⑶ 單片機用c語言,按鈕控制一個LED燈,要求按下松開,LED亮,按下松開,LED暗!循環
1、首先打開桌面上的keil軟體,在進行對51單片機進行編程時最常用的就是keil軟體。