Ⅰ 單片機實現LED燈,按鍵的時候閃爍,再次按鍵的時候熄滅
以後的程序記得縮進,不然很難看的,你得閃爍時間太長了正在閃爍的時候你又按一下按鍵,那你的單片機就會迷茫了,究竟是從頭開始還是繼續執行呢?對硬體的處理放到主函數里,你的延時居然是軟體加硬體,厲害,中斷函數里的LED是局域變數,賦值還是最好的,局域變數系統會隨機分配值的,不一定就是你想想的0
Ⅱ 單片機用外部中斷0實現:一個亮的LED燈,當按下按鍵後,閃爍2下,繼續恢復原來狀態。
main()
{
// CLK_CKDIVR=0x00;
CLK_Init();
IO_Init();
led_on=0;
//timer1_init();
EXTI_DeInit();?/初始化外部中斷IO口
_asm("rim");
while(1)
{
cbi(PA_ODR,4);
}
}
@far @interrupt void TIM1_UPD_OVF_IRQHandler(void)
{
TIM1_SR1 = 0x00; // 清除更新標志
}
@far @interrupt void EXTI0 (void)//外部中斷子函數
{
if(PA_on)
{ sbi(PA_ODR,4);PA_on=0;}//PA4為燈亮
else
{ cbi(PA_ODR,4);PA_on=1;}//PA4為燈滅
EXTI_CR1=0x00 ;
}
不懂再追問,你只需要把主程序裡面的燈定為一個狀態,外部中斷裡面再定一個狀態。要亮2次,加個延時,就行了。
Ⅲ 51單片機使燈閃爍,我寫的程序按一下開始閃爍,在按一下為什麼不能熄滅呢
void main()
{
L1=0;
if(K1==0) //1 按鍵按下後
{
Delay10ms(); //2 延時去抖動
if(K1==0) //3 確認按下
{
L1=0; //4 以下4句閃爍一次
Delay(1000);
L1=1;
Delay(1000);
}
while(1) //5 這里死循環,不能再執行上面的語句了。
{
while(!K1) //6 判斷按鍵是否按下,如果按下,則延時10ms,再判斷是否按下,一致循環,知道你松開手。
{
Delay10ms();
}
while(!K1); //7 按鍵按下話,一致死等,直到你松開手
{ //8 下面閃爍一次。
L1=0;
Delay(1000);
L1=1; // 9
Delay(1000);
}
}
}
}
你的程序來看,工作流程是這樣的,開機後,按下按鍵不放,只閃爍一次。如果你放開你的手,釋放按鍵,則LED一致閃爍。
你說再按一下為什麼不熄滅,因為 標示9句那裡置1了,你的硬體應該是L1置1亮吧?
因為L1=1,是你燈閃爍的最後一個狀態,而後又會從5再次執行,如果你按下了按鍵,程序停在了6那裡死循環,
則後面7,8都不會執行了。燈則保留了上一個循環最後的狀態,也就是9的狀態,所以就一致亮了。
你如果又松開按鍵,燈又會閃爍,你再按下按鍵,燈又一直亮了。如此循環。
你的程序的就是一個字概括,亂,你的思路很混亂,條理不清晰,建議先在紙上寫下流程,再來寫代碼。想清楚了再下手。
你會學的很快的。
你的main函數有個性,呵呵,沒有人會這么寫main函數的,去看看單片機C語言的書吧!
Ⅳ stm32單片機兩個跑馬燈一個一秒閃兩次一個一秒閃四次,
看到上面仁兄回答,想起自己剛編程時的艱難
介紹一個新的編程方式,自己選好晶元,安裝完parkage,勾選下面
具體實現自己來吧,都是從不會到會,種地也是
Ⅳ 51單片機,用兩個按鍵分別控制兩個led,一個亮/滅,另一個閃爍/滅,為什麼我按下了第二個燈不閃呢
你的led1=~led1;這個語句沒有循環,所以只會反轉一次。要麼加循環,要麼再寫一個閃爍函數。
voidled_filcker(usignedcharx)
{
while(x)
{
led1=~led1;
x--:
}
}
如果你是想,按一下,松開也會閃爍,再按一下熄滅。你得定義一個變數來表示按鍵的按下。
#include<reg52.h>
#define uchar unsigned char
bit stop=1;
sbit k5=P1^4;
void delay(uchar xms)
{
while(xms--);
}
void main()
{
if(k5==0)
{
delay(1000);
if(k5==0)
{
while(k5==0)
{
if(stop)
<<<<<<<<<<<<<<<此處執行你的語句
else
stop=~stop:
}
}
}
}
Ⅵ 單片機,跑馬燈,交替閃爍,C語言代碼
#include<reg51.h>
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
unsigned char i,led;
led=0xfe;
while(1)
{
P0=led;
delay(500);
P0=0xff;
delay(500);
led=(led<<1)|0x01;
if(led==0xff)led=0xfe;
}
}
Ⅶ 用單片機c語言一個按鍵控制led的閃爍和熄滅,就是按一下閃爍,再按就熄滅。
首先你的貼出來的程序不完整,最好貼出完整代碼!
其次,如果你的程序沒問題的話,你的LED閃爍是必須在你按住按鍵且不能彈起情況下才會發生的,你是一直按著嗎?
而且注意你n的類型,因為你這樣一直加,會溢出的
Ⅷ 單片機按下按鍵1,燈亮,按下按鍵2,燈滅,按下按鍵3,燈閃爍,求代碼
主要程序如下:
flag是用來記憶按鍵狀態,按下key3,flag置1,程序中檢測到flag是1才閃爍,鬆手後LED仍然閃爍,同時下一輪還可以檢測另外兩個按鍵
while(1)
{
if(key1==0)//判斷按鍵是否按下
{
Delay1ms(10);//延時消抖
if(key1==0)
{
while(key1==0);//等待按鍵抬起
LED=1;
flag=0;
}
}
if(key2==0)//判斷按鍵是否按下
{
Delay1ms(10);//延時消抖
if(key2==0)
{
while(key2==0);//等待按鍵抬起
LED=0;
flag=0;
}
}
if(key3==0)//判斷按鍵是否按下及是否在走時
{
Delay1ms(10);//延時消抖
if(key3==0)
{
while(key3==0);//等待按鍵抬起
flag=1;
}
if(flag==1)
{
LED=!LED;
Delay1ms(200);
}
}
Ⅸ 求教通過按鍵控制單片機LED燈閃爍周期的程序怎麼寫
你用的什麼單片機?
看你說的應該是跑馬燈,給你一個最常見的,51單片機,跑馬燈C程序。
若有需要可以給你更多,本人硬體開發工程師。
望採納。
例,這是一個51單片機的跑馬燈C程序,已經在PROTEUS軟體上模擬通過
#include<reg51.h>
void delay(int);
void main()
{
int i;
P0=0x01;
delay(500);
while(1)
{
for(i=0;i<7;i++)
{
P0<<=1;
delay(500);
}
P0=0x01;
delay(500);
}
}
void delay(intx)
{
int i,j;
for(i=x;i>0l;i--)
for(j=110;j>0;j--);
}
:
#include<reg51.h>
void delay(int);
void main()
{
int i;
P0=0x01;
delay(500);
while(1)
{
for(i=0;i<7;i++)
{
P0<<=1;
delay(500);
}
P0=0x01;
delay(500);
}
}
void delay(intx)
{
int i,j;
for(i=x;i>0l;i--)
for(j=110;j>0;j--);
}
Ⅹ 描述 stc單片機 按鍵控制燈亮滅和閃爍 上電燈不亮,按一下按鍵燈亮,再按一下燈閃爍,再按一下
#include<reg51.h>
unsigned char times;
sbit key=P1^0;
sbit led=P1^4;
void delay(unsigned char a)
{
unsigned char i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
led=1;
while(1)
{
if(key==0)
{
while(key==0);
times++;
times%=3;
}
switch(times)
{
case 0:led=1;break;
case 1:led=0;break;
case 2:led=~led;delay(100);break;
default:break;
}
}
}