1. 急求一個單片機控制一個LED燈發光的匯編程序,啟動時LED發光有按鍵按下燈熄滅
一鍵多功能按鍵識別技術
1.實驗任務
開關K1接在P3.2管腳上,在AT89S51單片機的P0.0埠接有1個發光二極體,上電的時候,L1接在P1.0管腳上的發光二極體在亮,當一次按下開關K1的時候,燈滅,再按一次,燈亮,如此輪流下去。
2.系統板上硬體連線
把「單片機系統」區域中的P3.2埠連接到「獨立式鍵盤」區域中的K1埠上;把P0.0連到L1上
3.程序設計方法
(1. 設計思想由來
在我們生活中,我們很容易通過這個叫張三,那個叫李四,另外一個是王五;那是因為每個人有不同的名子,我們就很快認出,同樣,對於要通過一個按鍵來識別每種不同的功能,我們給每個不同的功能模塊用不同的ID號標識,這樣,每按下一次按鍵,ID的值是不相同的,所以單片機就很容易識別不同功能的身份了。
(2. 設計方法
從上面的要求我們可以看出,L1到亮滅受開關K1來控制,我們給L1亮滅定義出不同的ID號,當L1在亮時,ID=0;當L1在滅時,ID=1;分別給出不同的ID號我們就能夠完成上面的任務了
4.匯編程序:
ID EQU 30H
K1 BIT P3.2
L1 BIT P0.0
ORG 0000H
CLR P1.7
MOV ID,#00H
START: JB K1,REL ;K1沒閉合轉
LCALL DELAY10MS ;K1閉合,延時消抖動
JB K1,REL :再判斷
INC ID
MOV A,ID
CJNE A,#02,REL
MOV ID,#00H
REL: JNB K1,$ ;等待開關彈起
MOV A,ID
CJNE A,#00H,IS0 ;判斷相應ID
CLR L1 :ID=0,燈亮
LCALL DELAY光 ;延時
SJMP START
IS0: CJNE A,#01H,START;
SETB L1
LCALL DELAY
SJMP START
DELAY10MS: MOV R6,#20 ;延時10MS子程序
LOOP1: MOV R7,#248
DJNZ R7,$
DJNZ R6,LOOP1
RET
DELAY: MOV R5,#20 ;延時20MS子程序
LOOP2: LCALL DELAY10MS
DJNZ R5,LOOP2
RET
END
2. 用c語言編寫單片機流水燈程序,(8個發光二極體從左至右循環點亮)
#include<reg51.h>
voiddelay(void)
{
unsignedinti,j;
for(i=0;i<200;i++)
for(j=0;j<1000;j++)
;
}
voidmain(void)
{
while(1)
{
P3=0xfe;//第一個燈亮
delay();//延時
P3=0xfd;//第二個燈亮
delay();
P3=0xfb;//第三個燈亮
delay();
P3=0xf7;//第四個燈亮
delay();
P3=0xef;//第五個燈亮
delay();
P3=0xdf;//第六個燈亮
delay();
P3=0xbf;//第七個燈亮
delay();
P3=0x7f;//第八個燈亮
delay();
}
}
(2)發光單片機擴展閱讀
單片機C語言16種方式流水燈
voidmain()
{
while(1)
{
P1=0xfe;//點亮第一個發光管
Delay(5000);
P1=0xfd;//點亮第二個發光管
Delay(5000);
P1=0xfb;
Delay(5000);
P1=0xf7;
Delay(5000);
P1=0xef;
Delay(5000);
P1=0xdf;
Delay(5000);
P1=0xbf;
Delay(5000);
P1=0x7f;//點亮第八個發光管
}
}
3. 用單片機控制8個發光二極體依次發光,產生跑馬燈的效果,3種效果循環,要求通過按鈕切換效果!
這個程序的關鍵點是要在顯示子程序執行的過程中,多對按鍵進行檢測。檢測到有按鍵按下時,即退出子程序,返回到主函數的按鍵檢測,對num
加一。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^5;
uchar temp;
uchar num;
void delay(uint z)//延時程序
{
uint x ,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display0()//顯示效果1
{
uchar i;
temp=0xfe;
for(i=0;i<8;i++)
{
if(key1==0) break;//對按鍵進行檢測
P1=temp;
temp=_crol_(temp,1);
delay(50);
}
P1=0xff;
temp=0x7f;
for(i=0;i<8;i++)
{
if(key1==0) break;//對按鍵進行檢測
P1=temp;
temp=_cror_(temp,1);
delay(50);
}
}
void display1()//顯示效果2
{
uchar i;
temp=0xf8;
for(i=0;i<8;i++)
{
if(key1==0) break;//對按鍵進行檢測
P1=temp;
temp=_crol_(temp,1);
delay(50);
}
P1=0xff;
temp=0x1f;
for(i=0;i<8;i++)
{
if(key1==0) break;//對按鍵進行檢測
P1=temp;
temp=_cror_(temp,1);
delay(50);
}
}
void display2()//顯示效果3
{
uchar i;
temp=0x99;
for(i=0;i<8;i++)
{
if(key1==0) break;//對按鍵進行檢測
P1=temp;
temp=_crol_(temp,1);
delay(50);
}
P1=0xff;
temp=0xcc;
for(i=0;i<8;i++)
{
if(key1==0) break;//對按鍵進行檢測
P1=temp;
temp=_cror_(temp,1);
delay(50);
}
}
void anjian()
{
if(key1==0)//按鍵檢測
{
delay(5);//按鍵消抖延時
if(key1==0)
{
num++;
if(num==3) num=0;
}
while(!key1);
}
}
void main()
{
while(1)
{
anjian();//按鍵檢測並賦num值
switch(num)
{
case 0:display0();break;
case 1:display1();break;
case 2:display2();break;
}
}
}
4. 單片機驅動一個led的工作原理是什麼
對於小功率LED,單片機IO驅動能力可以直接驅動。當LED的陽極接電源正時,單片機IO口如果為低電平將形成電流通路,所以可以使LED發光。
5. 單片機控制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模擬軟體進行設計。