标题:
单片机如何让按键控制LED灯常亮30分钟后熄灭,下次按按键后继续亮30分钟后熄灭
[打印本页]
作者:
79498
时间:
2020-7-16 19:01
标题:
单片机如何让按键控制LED灯常亮30分钟后熄灭,下次按按键后继续亮30分钟后熄灭
本帖最后由 79498 于 2020-7-17 12:00 编辑
用定时器做的,但是LED灯只是第一次闪烁后常亮30分钟后熄灭,第二次按按键后就是一直亮了,不知道为什么,请一些高手解答下。
测试代码如下 最重要的就是第一次定时可以 第二次就不行了 STC15W100的芯片
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u1;
typedef unsigned char u2; //
unsigned char d;
unsigned char n=0;
uchar min=1; sec=59; //
uchar flag;//
sbit led2=P3^0; //
sbit led1=P3^1; //
sbit cd=P3^2; //
sbit uv=P3^3; //
sbit k1=P3^4;
bit flash;//
bit key;
sfr IE2=0xAF;
sfr AUXR=0x8E;
sfr T2H=0xD6;
sfr T2L=0xD7;
void shijian(); //
/*************************************
*************************************/
void delay_1s()
{
int a,b;
for(a=1000;a>0;a--)
for(b=150;b>0;b--);
}
/*************************************
*************************************/
void keypros()
{
if(k1==0)
{
delay_1s();
if(k1==0)
{
flash=~flash;
key=1;
}
}
while(!k1);
}
/*************************************
*************************************/
void ledflash()
{
if(flash==1&&key==1)
{
for(d=0;d<10;d++)
{
led1=0;
delay_1s();
led1=1;
delay_1s();
}
key=0;
led1=0;
uv=1;
}
if(flash==0)
{
led1=1;
uv=0;
}
}
/*************************************
*************************************/
void Int1Init() //
{
IT0=1;
EX0=1;
EA=1;
}
/*************************************
*************************************/
void Timer2Init() //
{
IE2|=0x04;
T2H=(65536-50000)/256;
T2L=(65536-50000)%256;
EA=1; //
AUXR|=0x10; //
}
/*************************************
*************************************/
void main()
{
led1=1;
uv=0;
led2=1;
flash=0;
Timer2Init();
while(1)
{
keypros();
ledflash();
Int1Init();
}
}
/*************************************
*************************************/
void Int0() interrupt 0 //
{
if(cd==0)
{
uv=0; //
led2=~led2; //
}
else
{
led2=1;
}
}
/*************************************
*************************************/
void Timer2() interrupt 12
{
T2H=(65536-50000)/256;
T2L=(65536-50000)%256;
flag++;
if(min==0&&sec==0)
{
uv=0;
}
if(flag>=20)
{
flag=0;
sec--;
if(sec<=0)
{
sec=59;
min--;
if(min<=0)
{
min=0;
sec=0;
AUXR|=0x00;
}
}
}
}
作者:
汇源科技
时间:
2020-7-16 20:19
是不是计时没清0,
作者:
sommer78
时间:
2020-7-16 20:31
定时器要设置成重载型,你这个一次定时,肯定后面就没有了。
作者:
wulin
时间:
2020-7-16 23:08
定时器周期50ms,按键按下灯亮,赋值变量36000,定时中断一次变量减1,减到0灯灭结束。
作者:
zhai1995
时间:
2020-7-17 09:25
如果你可以在线仿真调试的话,看下每个变量的数据变化,你应该就可以找到原因啦。
作者:
权威人物
时间:
2020-7-17 09:29
发程序啊!你这样只能用猜的了,我猜你某个变量没清除、标志位没处理好或者定时器没清
作者:
压着我头发啦
时间:
2020-7-17 11:18
#include <reg51.h>
#define uchar unsigned char//o궨òå
#define uint unsigned int//o궨òå
sbit LED1 = P2^2;
sbit KEY = P2^3;
uchar u,num;
sfr AUXR=0x8E;
void init()
{
KEY=1;
LED1=1;
TMOD=0x01;
TH0=(65536-45872)/256; //11.0592M?50ms??45872
TL0=(65536-45872)%256;
EA=1;
ET0=1;
}
void delay_1ms(uint t)//Ñóê±
{
uint i;
while(--t)
for(i=0;i<600;i++);
}
void main()
{
init();
while(1)
{
if(KEY==0)
{
delay_1ms(20);
if(KEY==0)
{
while(KEY==0);
LED1=0;
TR0=1;
}
}
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256; //11.0592M?50ms??45872
TL0=(65536-45872)%256;
num++;
if(num==40)
{
num=0;
LED1=1;
TR0=0;
}
}
复制代码
作者:
压着我头发啦
时间:
2020-7-17 11:19
压着我头发啦 发表于 2020-7-17 11:18
我试着写了下,用proteus看了下。可以用
作者:
pcl001
时间:
2020-7-17 11:47
可以用定时器查询,或者递增
作者:
79498
时间:
2020-7-20 14:18
感谢各位大佬讲解,已经弄好了 定时器清零后未赋值,所以工作一次
作者:
Roy-2010
时间:
2020-8-7 16:38
不用单片机。用电容。容量足够大就可以实现。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1