打印

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

[复制链接]
5642|53
手机看帖
扫描二维码
随时随地手机跟帖
沙发
wuyua|  楼主 | 2015-5-28 19:02 | 只看该作者

使用特权

评论回复
板凳
wuyua|  楼主 | 2015-5-28 19:04 | 只看该作者

使用特权

评论回复
地板
wuyua|  楼主 | 2015-5-28 19:05 | 只看该作者
初学单片机有点迷茫

使用特权

评论回复
5
whtwhtw| | 2015-5-28 19:17 | 只看该作者
设一个计数器,按一下计数器加一,加到5,执行led=!led;计数器清零,然后再计数。

使用特权

评论回复
6
duhemayi| | 2015-5-28 19:37 | 只看该作者
5楼正解!

使用特权

评论回复
7
gx_huang| | 2015-5-28 19:38 | 只看该作者
再迷茫,也得想办法自己编程。这是最简单的功能。
还有,看见这个原理图,就笑了,蜂鸣器上电复位就会响,直到程序开始运行关闭它。

使用特权

评论回复
评论
ccmc 2015-5-29 11:25 回复TA
50步笑百步 
8
991083158| | 2015-5-28 21:10 | 只看该作者
五楼正解,你的按键接的刚好是int0引脚,不用查询,直接外部中断既可,把计数放在中断里就ok了!

使用特权

评论回复
9
wuyua|  楼主 | 2015-5-28 23:23 | 只看该作者
gx_huang 发表于 2015-5-28 19:38
再迷茫,也得想办法自己编程。这是最简单的功能。
还有,看见这个原理图,就笑了,蜂鸣器上电复位就会响, ...

设计的程序应该和蜂鸣器无关吧?

使用特权

评论回复
10
gx_huang| | 2015-5-29 08:48 | 只看该作者
991083158 发表于 2015-5-28 21:10
五楼正解,你的按键接的刚好是int0引脚,不用查询,直接外部中断既可,把计数放在中断里就ok了! ...

5L是对的,他说的也许是软件里计数按键次数的。
而你说的,却往往是错的,一个按键下去,也许有10次上百次中断了,按键是有抖动的。

使用特权

评论回复
11
gx_huang| | 2015-5-29 08:49 | 只看该作者
wuyua 发表于 2015-5-28 23:23
设计的程序应该和蜂鸣器无关吧?

你要求设计的程序和蜂鸣器无关。
但是你不能看着这个原理图有错误呀。
做产品,一知半解,害人的。

使用特权

评论回复
12
han0097| | 2015-5-29 08:55 | 只看该作者
gx_huang 发表于 2015-5-29 08:48
5L是对的,他说的也许是软件里计数按键次数的。
而你说的,却往往是错的,一个按键下去,也许有10次上百 ...

加一个消抖程序不就行了!

使用特权

评论回复
13
xiaocui0475| | 2015-5-29 09:09 | 只看该作者
哎,闲来没事, 我帮你编吧, 看见可以联系我,只限今天哦~~

使用特权

评论回复
14
gx_huang| | 2015-5-29 09:15 | 只看该作者
han0097 发表于 2015-5-29 08:55
加一个消抖程序不就行了!

硬件中断输入的中断程序加消抖,要么很复杂的,要么占用比较多时间。

使用特权

评论回复
15
yuandf| | 2015-5-29 09:15 | 只看该作者
if( ! ((++keyCount)%5)     )
{
      led=!led;
}

使用特权

评论回复
评论
ccmc 2015-5-29 11:29 回复TA
66666 
16
gx_huang| | 2015-5-29 09:26 | 只看该作者
LS英武!
关键是keyCount在什么条件下加一,才是关键。
有些程序,在产品上用,刚开始好的,等按键老化抖动时间特性变化了,按键就不灵了。

使用特权

评论回复
17
han0097| | 2015-5-29 09:31 | 只看该作者
gx_huang 发表于 2015-5-29 09:15
硬件中断输入的中断程序加消抖,要么很复杂的,要么占用比较多时间。

消抖5ms就可以了,再说,他拿这个MCU也不做别的事!

使用特权

评论回复
18
yuandf| | 2015-5-29 09:43 | 只看该作者
uint8 dbCnt=0;//消抖计数器
sbit keyValue=P3^2;// 读取键值,(51没用过,应该是这么写的)
if(dbCnt)
{
        if(keyValue)
        {
                  if(++dbCnt>100)//完成消抖
                  {
                         dbCnt=0;
                        if( ! ((++keyCount)%5)     )
                        {
                              led=!led;
                        }
                  }
         }
         else
         {
                  dbCnt=0;
         }
}
else
{
     if(keyValue)
     {
            dbCnt++;
     }
}

使用特权

评论回复
19
mcu5i51| | 2015-5-29 09:43 | 只看该作者
LZ自己想一想要的是什么功能,用什么方法来实现,有什么样的限制,如果做成这样的一个产品会有什么可能的错误,包括人为的和不可预知的都要尽可能的想到,哪怕你只是一个实验,完全工作在理论上,以后你是不可能都做理想的东东;
Beep已经有人提出了,说明硬件上是有一些不理想的,按5下就亮,这5下什么时候按,有没有时间间隔,按键是在板子上的还是用线引来的
主体流程可以是类似这样:
复位,初始化
循环开始
读按键计数
是否达到次数
达到,LED处理,计数清零,计时清零
没有达到,是否超时
超时,错误处理,可以清零计数和计时后重来
没有超时,处理其它功能
循环尾

使用特权

评论回复
20
gx_huang| | 2015-5-29 09:44 | 只看该作者
han0097 发表于 2015-5-29 09:31
消抖5ms就可以了,再说,他拿这个MCU也不做别的事!

说的也是,他这个MCU也不做其它事情。
我建议最简单的主程序判断按键和消抖,对LZ来说最合理。
初学MCU编程的,还是不要急着用中断,中断用不好很多隐患的。
很早以前,飞利浦的手机平台,耳机的插入和拔出,或者充电器的插入和拔出,总是有一定概率,状态是错的。就是因为他是操作系统,基于消息传递,基于硬件中断触发。笑死我了,搞了几周还是搞不好。我说,这个插入拔出判断,我用1元的MCU做,绝对不会状态错,那些牛人就是不相信。那些牛人根本不知道插入拔出的物理过程,估计也不清楚中断和Debounce的原理以及缺点。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

17

帖子

0

粉丝