数码之家

 找回密码
 立即注册
搜索
查看: 1071|回复: 9

[C51] 求助:单片机1秒钟内按2下按钮开关LED灯亮

[复制链接]
发表于 2022-10-20 14:01:25 | 显示全部楼层 |阅读模式
本帖最后由 燎原之势 于 2022-10-20 14:03 编辑

程序实现功能是,在1秒内按2下按钮开关LED灯亮。


刚接触单片机不久,下面写的这段代码。  求大咖们赐教


#include<reg51.h>
unsigned char flag,num,keyn;
sbit KEY=P1^0;
sbit LED=P1^1;
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<125;j++);
}

void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
   if(num>20)
  {
   num=0;
  flag=0xff;
   }
}

void keyscan()
  {
     if(P1.0==0)
    {
     delay(10);
     TR0=1; //有效按键启动定时器
     if(P1.0==0)keyn++;
     }
}


main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
num=0;
keyn=0;
while(1)
{
flag=0x00;
while(flag==0x00)//等待1秒定时结束
{
keyscan();
}
if(keyn>=2)
{
LED=0; //1秒内按两次键,灯亮
keyn=0;
TR0=0;
}

}
}


发表于 2022-10-20 20:28:37 | 显示全部楼层
按键弄个外部中断,进中断后开定时器计数,等下次外部中断到,查询计数到多少再处理,计数设个超时
回复 支持 反对

使用道具 举报

发表于 2022-10-20 20:42:33 | 显示全部楼层
好乱的样子
回复 支持 反对

使用道具 举报

发表于 2022-10-20 21:57:36 | 显示全部楼层
状态机,键扫描,直接有按键组件也可以
回复 支持 反对

使用道具 举报

发表于 2022-10-21 09:59:42 | 显示全部楼层
#include<reg51.h>
unsigned char flag,num,keystate;
sbit KEY=P1^0;
sbit LED=P1^1;
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<125;j++);
}

void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
   if(num>20)
  {
   num=0;
  flag=0xff;
   }
}

main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
num=0;
while(1)
{
if(flag==0xff) keystate=0;

switch(keystate)
{
case 0:

if(KEY==0)
  {
   delay(10);
   if(KEY==0) {keystate=1; TR0=1; flag=0;}
  }
   break;
  case 1:   
if(KEY==0)
  {
   delay(10);
   if(KEY==0) {keystate=0; TR0=0; LED=0;}
  }
   break;

}

}
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-21 12:21:59 | 显示全部楼层
owenql 发表于 2022-10-21 09:59
#include
unsigned char flag,num,keystate;
sbit KEY=P1^0;

感谢热心的大佬回复,上机试了一下,没有实现1秒内连续按两次按键则点亮led功能。
回复 支持 反对

使用道具 举报

发表于 2022-11-10 10:45:57 | 显示全部楼层
状态机,应可以实现。上电默认一个值,每按一次,键值加一,同时开始计时;按第二次键值加到二起开关作用,且键值复位,计时(1秒)后键值复位,这样如果不是1秒内按二次就不会起作用
回复 支持 反对

使用道具 举报

发表于 2022-11-10 11:23:18 | 显示全部楼层
ling11052001 发表于 2022-11-10 10:45
状态机,应可以实现。上电默认一个值,每按一次,键值加一,同时开始计时;按第二次键值加到二起开关作用, ...

用定时中断和延时函数都可以实现
回复 支持 反对

使用道具 举报

发表于 2022-11-10 15:51:21 来自手机浏览器 | 显示全部楼层
双击功能,先画ns流程图试试
回复 支持 反对

使用道具 举报

发表于 2022-11-18 15:15:30 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-26 12:29 , Processed in 0.202800 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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