A. 單片機按鍵按五次燈亮
單片機如何設置燈L1到L8循環亮基伏扮5次的程廳陪序:例題:使LED燈先全部閃五次,再實現從L1到L8依次亮起,最後實現從L1到L8依次熄滅。(註:擴展方式為io,即J13跳帽接到io處)#include"reg52.h"流水燈程搏灶序最簡單了,而且在知道這里可以搜到無數個例子。循環5次停下來,用for控制循環5次,結束後,用一個while(1); 語句就停了。
B. 單片機怎麼實現一個開關控制八個燈按一下亮一個按八下八個燈都亮匯編語言程序
用一個寄存器做變數就可以。
假如按鍵是一個開個,接在P1.0,八個燈在P0,低電平燈亮
程序是這樣的
MOV 30H ,#00
LOP :
SETB P1.0
JNB P1.0, PRESS
AJMP LOP
PRESS:
INC 30H
MOV A,30H
CJNE A,#9,L_NEXT
MOV 30H,#1
L_NEXT:
JNB P1.0,$
MOV A,30H
CJNE A,#1 ,LED1_ON
CJNE A,#2, LED2_ON
CJNE A,#3, LED3_ON
CJNE A,#4, LED4_ON
CJNE A,#5, LED5_ON
CJNE A,#6, LED6_ON
CJNE A,#7, LED7_ON
CJNE A,#8, LED8_ON
LJMP LOP
LED1_ON: MOV P0,#0FEH //亮一個燈
LJMP LOP
LED2_ON: MOV P0,#0FDH //亮一個燈
LJMP LOP
LED3_ON: MOV P0,#0F8H //亮一個燈
LJMP LOP
LED4_ON: MOV P0,#0F0H //亮一個燈
LJMP LOP
LED5_ON: MOV P0,#0E0H //亮一個燈
LJMP LOP
LED6_ON: MOV P0,#0D0H //亮一個燈
LJMP LOP
LED7_ON: MOV P0,#080H //亮一個燈
LJMP LOP
LED8_ON: MOV P0,#00H //亮一個燈
LJMP LOP
C. 如何用單片機一個按鈕開關控制3個燈3種效果。流水。閃爍。還有一直亮。用keil編程。
下面是用C51編寫的簡單程序:
#include <reg51.h>
#include <intrins.h>
sbit io_Key = P1 ^ 1;
sbit led1 = P1 ^ 2;
sbit led2 = P1 ^ 3;
sbit led3 = P1 ^ 4;
unsigned char ucCount = 0;
bit flag05s = 0;
//---------------------------------
void delay125us(void) //@12.000MHz
{
unsigned char i;
i = 60;
while (--i);
}
void Timer0Init(void) //10毫秒@12MHz
{
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0xF0; //設置定時初值
TH0 = 0xD8; //設置定時初值
TR0 = 1; //開定時器0
ET0 = 1; //開定時器0中斷
EA = 1; //開總中斷
}
//T0中斷用來計數器溢出
void zd0(void) interrupt 1
{
TL0 = 0xF0; //設置定時初值
TH0 = 0xD8; //設置定時初值
if(++ucCount >= 50)
{
ucCount = 0;
flag05s = 1; //g_flag05s = isYes定時0.52秒到,用於測量周期延時
}
}
void main(void)
{
unsigned char CountTemp = 0, ucState = 0;
Timer0Init();
while(1)
{
//-------------------------------
//簡單的按鍵檢測程序:
io_Key = 1;
_nop_();
if( io_Key == 0 )
{
CountTemp = 0;
do
{
delay125us();
if( io_Key != 0 ) break;
} while(++CountTemp > 160); // 延時20ms去抖動
if(CountTemp > 160)//如果按鍵時間有效,改變狀態
{
switch(ucState)
{
case(0):
{
ucState = 1;
led1 = 0;
led2 = 0;
led3 = 0;
}
break;
case(1):
{
ucState = 2;
led1 = 0;
led2 = 0;
led3 = 0;
}
break;
case(2):
{
ucState = 0;
led1 = 0;
led2 = 1;
led3 = 1;
}
break;
}
while(io_Key == 0); //等待按鍵釋放
}
}
//------------------------------
//每0.5秒改變一下LED狀態
if(flag05s == 1)
{
flag05s = 0;
switch(ucState)
{
case(0):
{
led1 = !led1;
led2 = !led2;
led3 = !led3;
}
break;
case(1):
{
bit ledTemp = led1;
led1 = led2;
led2 = led3;
led3 = ledTemp;
}
break;
//LED常亮可以忽略改變LED狀態
/*
case(2):
{
led1 = 0;
led2 = 0;
led3 = 0;
}
break;
*/
}
}
}
}
//-----------------------------------------------
//上面程序中有很多地方可以優化,這里只是給出一個參考供學習。
D. 用匯編語言編寫一個按鈕控制8個流水燈的亮滅
51單片機匯編語言程序設計如下,實現通過按鍵控制8個流水燈的亮滅功能:
KEY被定義為P3.2埠,LED被定義為P1埠。
程序起始地址為0000H,跳轉到主程序MAIN。
主程序MAIN從0030H地址開始:
清除00H單元的內容。
將0FEH的值送入累加器A。
進入循環LOOP。
檢查P3.2埠的狀態,如果為低電平,跳轉到LOOP1。
如果P3.2埠為高電平,則執行下一條指令。
將0FFH的值送入LED埠。
跳轉到LOOP2。
進入LOOP2,檢查00H單元狀態,如果為高電平,則跳轉到LOOP2。
將0FFH的值送入P1埠。
右移累加器A的內容。
調用延時子程序DELAY。
返回到LOOP。
延時子程序DELAY從200H地址開始:
將200H送入R2。
進入循環DLY1。
將250H送入R3。
當R3不為0時,循環繼續。
R2減1,直到為0,跳出循環。
返回到調用處。
這個程序通過按鍵P3.2控制8個流水燈P1埠的亮滅,通過右移操作實現流水效果,並通過延時子程序實現一定的視覺效果。在實際應用中,可以根據需求調整延時子程序的延時時間,以適應不同的顯示效果要求。
在編寫和調試此類程序時,需要注意按鍵的抖動問題,以及單片機的時鍾頻率對延時時間的影響。此外,還可以通過增加更多的邏輯判斷,實現更加復雜的功能,比如增加計數器,實現流水燈的計數顯示,或者加入更多的控制邏輯,實現更復雜的燈光控制效果。
通過這種編程方式,可以實現對單片機的精細控制,滿足各種不同的應用需求。在實際應用中,這種編程方式還可以與外部設備或感測器結合,實現更加復雜的功能。