能帮忙编个程序吗?如下图能使开关按5下灯泡亮一下,开关再按5下,灯泡灭一下

[复制链接]
6866|53
 楼主| wuyua 发表于 2015-5-29 09:47 | 显示全部楼层
xiaocui0475 发表于 2015-5-29 09:09
哎,闲来没事, 我帮你编吧, 看见可以联系我,只限今天哦~~

好开心呀,可是怎么联系你呢?站内发消息我发不了,级别太低了,有没有其他联系方式呢?
han0097 发表于 2015-5-29 09:52 | 显示全部楼层
gx_huang 发表于 2015-5-29 09:44
说的也是,他这个MCU也不做其它事情。
我建议最简单的主程序判断按键和消抖,对LZ来说最合理。
初学MCU编 ...

好吧!你牛!
han0097 发表于 2015-5-29 09:52 | 显示全部楼层
gx_huang 发表于 2015-5-29 09:44
说的也是,他这个MCU也不做其它事情。
我建议最简单的主程序判断按键和消抖,对LZ来说最合理。
初学MCU编 ...

那你说说插入拔出的物理过程,和中断和Debounce的原理以及缺点。
 楼主| wuyua 发表于 2015-5-29 09:56 | 显示全部楼层
yuandf 发表于 2015-5-29 09:43
uint8 dbCnt=0;//消抖计数器
sbit keyValue=P3^2;// 读取键值,(51没用过,应该是这么写的)
if(dbCnt)

这种我可能还没学过。。。
老师说用计数器,然后中断方式2的
TMOD=0x10;
TH0=0xfb;
TL0=0xfb;
EA=1;
ET0=1;
TR0=1;
现在才学中断系统的
yuandf 发表于 2015-5-29 10:02 | 显示全部楼层
我以为你在做产品呢?老师布置的任务,我就无能为力了,好好看看书吧!可以忽悠老板,但要对自己负责,加油!!:lol
gx_huang 发表于 2015-5-29 10:30 | 显示全部楼层
han0097 发表于 2015-5-29 09:52
那你说说插入拔出的物理过程,和中断和Debounce的原理以及缺点。

它的输入口,内部有边沿检测加滤波延时,比如你设定50毫秒,如果有低电平,50毫秒后还是低电平,就产生一个中断。问题是,当中断产生,还没有退出中断,在这个处理时间内,已经拔出去了,这个拔出去的中断会丢失的。他们采取很笨的办法,先调整Debouce时间,觉得不够,在中断里再加一个延时判断,总之,故障概率一直在的。只要我知道他怎么编程的,我就可以怎么更快速的重现故障。其实,拔出和插入中断,只是让软件更快的反应这个变化,让用户觉得这个手机速度快,灵敏。至于拔出或者插入后,应该开一个定时器,定期检查电平状态,万一有硬件误判误中断,一段时间后可以改正状态。比如,插入充电器,马上显示充电状态,如果拔出,马上处理,用户觉得很快,偶尔中断状态丢失,定时器判断,小概率的情况下,延时个1S、2S后改正状态,用户可以接受的,也很难发现的。但是如果快速插入拔出充电器,手机一直显示在充电,用户肯定会发现的。
wang168506 发表于 2015-5-29 11:16 | 显示全部楼层
han0097 发表于 2015-5-29 09:31
消抖5ms就可以了,再说,他拿这个MCU也不做别的事!

大脸猫
jiangxingyuan 发表于 2015-5-29 11:41 | 显示全部楼层
yuandf 发表于 2015-5-29 09:15
if( ! ((++keyCount)%5)     )
{
      led=!led;

++keycount越界后将会出问题的。做完一次后不清零,到时死了都不知道什么回事。
gx_huang 发表于 2015-5-29 11:48 | 显示全部楼层
jiangxingyuan 发表于 2015-5-29 11:41
++keycount越界后将会出问题的。做完一次后不清零,到时死了都不知道什么回事。 ...

我知道,不会有大问题,不会死的,只是越界的时候,不是5次,可能一次按键LED就动作了。
gx_huang 发表于 2015-5-29 11:50 | 显示全部楼层
@ccmc 我是50步,你是250步吗?
NE5532 发表于 2015-5-29 12:01 | 显示全部楼层
Q1的极性都用反了。
gx_huang 发表于 2015-5-29 12:29 | 显示全部楼层
NE5532 发表于 2015-5-29 12:01
Q1的极性都用反了。

Q1极性用反,大家都懒得去指出了,也许人家就是NPN/PNP不分的,焊接的时候再挑一个可以用的。
21CHdwLHR 发表于 2015-5-29 13:17 | 显示全部楼层

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned  int
sbit key1=P3^2;/*定义端口,根据自己单片上按键端口定义*/
sbit led=P2^1;
uint i,j=0;
delay(uchar x);
/*主程序*/
void main()
{
        while(1)
{
                if(key1==0)
        {
       
        delay(50);
        while(!key1);
        delay(50);
        j++;
       
if(j==5)
led=0;
if(j==10)
led=1;
               

}

}

}
/*延时程序*/
delay(uchar x)
{
        uchar a,b;
        for(a=x;a>0;a--)
         for(b=200;b>0;b--);
}
han0097 发表于 2015-5-29 13:43 | 显示全部楼层
 楼主| wuyua 发表于 2015-5-29 14:13 | 显示全部楼层
21CHdwLHR 发表于 2015-5-29 13:17
#include
#define uchar unsigned char
#define uint unsigned  int

谢谢,不过要求用的是计数器,中断方式2的
你这个用的是延时函数吧
能否用工作方式2写下?
nienianhong 发表于 2015-5-29 16:34 | 显示全部楼层
wang168506 发表于 2015-5-29 17:15 | 显示全部楼层
han0097 发表于 2015-5-29 17:39 | 显示全部楼层
hgjinwei 发表于 2015-5-29 18:24 | 显示全部楼层
看来大家都很闲啊
justcxj 发表于 2015-5-29 21:42 | 显示全部楼层
天天向上
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部