Ⅰ 单片机实现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;
}
}
}