找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6499|回复: 6
打印 上一主题 下一主题
收起左侧

单片机按键延时开关灯问题求助

[复制链接]
楼主
ID:213173 发表于 2017-7-21 09:43 | 显示全部楼层
修改后完美解决你的问题,有详细注释
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
bit sign_a=0,sign_b=0,sign_c=0,sign_d=0;//标志
uint count1=0,count2=0;                                        //计数器
sbit LED1 = P1^0;
sbit key = P3^0;

void keyscan()                                        //按键扫描程序
{
        static uchar count=0;                //消抖计数变量                       
        if(key==0)                                        //检测按键如果为0
        {
                count++;                                //消抖计数
                if(count>=100)                        //重复检测按键如果为0
                {                       
                        count=100;                        //防止溢出
                        if(sign_c==0)                //按键自锁标志为0
                        {
                                sign_a=1;                //延时1秒启动标志
                                sign_c=1;                //按键自锁标志置1,防止一次按键多次响应
                                EA = 0;                        //关闭总中断,防止改变count2时与中断冲突
                                count2+=600;        //每30秒延时累加(600),最大累加到54.5分钟,超过109次溢出
                                EA = 1;                        //开启总中断
                        }
                }
        }
        else                                                //按键抬起
        {
                if(sign_c==1)                        //如果按键自锁标志为1
                {
                        sign_c=0;                        //按键自锁标志清0
                        sign_d=1;                        //按键按下后再抬起标志为1
                }
                count=0;                                //消抖计数清0
        }
}

void main(void) //@12T、12MHz、定时50ms
{
        TMOD = 0x01;
        TH0 =(65536-50000)/256;                //设置定时初值
        TL0 =(65536-50000)%256;                //设置定时初值
        TR0=1;
        EA = 1;
        ET0 = 1;
        while(1)
        {
                keyscan();                                //按键扫描
/*******显示部分********/
                if(sign_b==1)                        //1秒延时结束
                        LED1 = 0;                        //LED1亮
                else
                        LED1 = 1;                        //LED1灭
        }   
}

void time0() interrupt 1
{
        TH0 =(65536-50000)/256;                //设置定时重载值
        TL0 =(65536-50000)%256;                //设置定时重载值
        if(sign_a==1)                                  //判断计时标志,启动延时1秒
        {
                count1++;                                //计数器1自+1
                if(count1>=20)                        //1秒延时到
                {
                        count1=0;                        //计数1清0
                        sign_a=0;                        //1秒延时标志清0
                        sign_b=1;                        //30秒延时标志
                }
        }
        if((sign_b==1)&(sign_d==1)) //30秒延时标志与按键抬起标志
        {
                count2--;                                //计数器2自-1
                if(count2==0)                        //N+30秒延时到
                {
                        sign_b=0;                        //30秒延时标志清0
                        sign_d=0;                        //按键抬起标志清0
                }
        }
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表