打印
[51单片机]

求高手,程序调试一下午了,好奇怪

[复制链接]
3697|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
samsunghellome|  楼主 | 2013-8-17 17:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 samsunghellome 于 2013-8-17 18:02 编辑

程序实现功能:按下按键1再按下按键2,led灯亮
              按下按键2再按下按键1,led灯熄灭
程序如下:

#include<reg52.h>
sbit KEY1=P3^0;  
sbit KEY2=P3^1;  
sbit LED1=P1^0;
int Flag=0;
void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);
void main (void)
{
KEY1=1;
KEY2=1;
while(1)
{if(Flag==0&&KEY1==0)      
  {DelayMs(10);
   if(Flag==0&&KEY1==0)//按键1延时去抖     
        while(1)
        {if(Flag==0&&KEY2==0)
          {DelayMs(10);
       if(Flag==0&&KEY2==0)     
                LED1=0;
                Flag=1;
           break;
          }
        }               
                while(Flag)
                {if(Flag==1&&KEY2==0)      
         {DelayMs(10);
          if(Flag==1&&KEY2==0)//按键1延时去抖     
              while(1)
              {if(Flag==1&&KEY1==0)
               {DelayMs(10);
            if(Flag==1&&KEY1==0)     
                    LED1=1;
                    Flag=0;
                        break;                           
               }                                                                                               
          }
         }
                 }                                                                                                                           
  }
}
}     


void DelayUs2x(unsigned char t)
{   
while(--t);
}

void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
我软件调试通过,但硬件上,按下按键1再按按键2,led亮,正常。但是接下来,再按按键1(未按按键2),led灯竟然熄灭了,百思不得其解,求高手帮忙!!

相关帖子

沙发
crazy2012| | 2013-8-17 18:17 | 只看该作者
一看就是学生写的程序,程序思路不对。楼下请给予详细指点。

使用特权

评论回复
板凳
crazy2012| | 2013-8-17 18:18 | 只看该作者
其实不奇怪,你的软件架构就不对了,现象能正确就怪了。

使用特权

评论回复
地板
samsunghellome|  楼主 | 2013-8-17 18:27 | 只看该作者
crazy2012 发表于 2013-8-17 18:18
其实不奇怪,你的软件架构就不对了,现象能正确就怪了。

请师傅给予指点,十分感谢

使用特权

评论回复
评论
crazy2012 2013-8-17 18:36 回复TA
一句话,总结,一定要学会使用定时器。不要把定时器当做摆设。 
5
crazy2012| | 2013-8-17 18:35 | 只看该作者
samsunghellome 发表于 2013-8-17 18:27
请师傅给予指点,十分感谢

好吧,同学,我今天给你说的很重要,你要知道,指令是多么的重要,要学会释放CPU,把你的delay去掉,你这样程序不就没法响应其他任务了吗,当然,要转化一下思路。你用定时器来来做消抖处理。


同学,恭喜你,你要进步了。

使用特权

评论回复
6
samsunghellome|  楼主 | 2013-8-17 18:42 | 只看该作者
crazy2012 发表于 2013-8-17 18:35
好吧,同学,我今天给你说的很重要,你要知道,指令是多么的重要,要学会释放CPU,把你的delay去掉,你这 ...

师傅,我把delay去掉,用定时器,请问程序其他方面还有问题吗?

使用特权

评论回复
7
crazy2012| | 2013-8-17 18:48 | 只看该作者
samsunghellome 发表于 2013-8-17 18:42
师傅,我把delay去掉,用定时器,请问程序其他方面还有问题吗?

用了定时器就不会出现你的乱糟糟的情况了。加上状态机就可以实现你要的按键功能了。


另外你这个delay你是怎么知道他的具体延时时间的呢。你要么查看生成的汇编指令,然后算时间,要么就是用示波器看吧。你这样太不方便了。移植性不好,你换成定时器来做,定时时间精确,想怎么做就怎么做。哈哈。

使用特权

评论回复
8
samsunghellome|  楼主 | 2013-8-17 18:53 | 只看该作者
crazy2012 发表于 2013-8-17 18:48
用了定时器就不会出现你的乱糟糟的情况了。加上状态机就可以实现你要的按键功能了。

好的,谢谢师傅指点。我比较喜欢单片机,等我学好了,我也在论坛帮助别人

使用特权

评论回复
9
crazy2012| | 2013-8-17 18:57 | 只看该作者
samsunghellome 发表于 2013-8-17 18:53
好的,谢谢师傅指点。我比较喜欢单片机,等我学好了,我也在论坛帮助别人 ...

同学,有兴趣就好,你现在还没有建立起时间观念,单片机玩的就是时间观念。比如扫描键盘,多久扫描一次。这个你都得心中有数。

我们写单片机程序,有时候是需要精确到ns级别的。  你要对ns,us,ms,s有时间观念的。不能大概估的哦。

使用特权

评论回复
10
crazy2012| | 2013-8-17 18:59 | 只看该作者
另外提醒你,不是所有的东西都适合软件仿真的哦,比如算法类的你可以仿真下,但是对于这种类似的机械键盘,不同的键盘灵敏度是不同的,延时时间也是不同的哦。


扔掉你的仿真软件,搭建个实际电路。毕竟,最终是要做实物的哦。

使用特权

评论回复
11
samsunghellome|  楼主 | 2013-8-17 19:06 | 只看该作者
叶伤 发表于 2013-8-17 18:48
匿迹

谢谢,成功了。我明白为什么加按键释放语句了,因为程序执行太快了,我还没来得急释放按键2,已经进入下一个while循环了,谢谢你!!

使用特权

评论回复
12
叶伤| | 2013-8-17 19:08 | 只看该作者
samsunghellome 发表于 2013-8-17 19:06  谢谢,成功了。我明白为什么加按键释放语句了,因为程序执行太快了,我还没来得急释放按键2,已经进入下 ...

没事,好好加油哈。谁都是从这一步过来的。

使用特权

评论回复
13
samsunghellome|  楼主 | 2013-8-17 19:11 | 只看该作者
crazy2012 发表于 2013-8-17 18:59
另外提醒你,不是所有的东西都适合软件仿真的哦,比如算法类的你可以仿真下,但是对于这种类似的机械键盘, ...

哈哈,我手里有德飞莱的51板子,下午捣鼓了一下午,软件仿真一步一步的没问题,下载到板子上就出问题了,
非常感谢老师们的指点,我刚开始练习编程,看着别人写的很简单,自己手痒痒,但自己真正动手写才发现,处处都要考虑到,一处想不到就得不出结果来!!

使用特权

评论回复
14
crazy2012| | 2013-8-17 19:16 | 只看该作者
samsunghellome 发表于 2013-8-17 19:11
哈哈,我手里有德飞莱的51板子,下午捣鼓了一下午,软件仿真一步一步的没问题,下载到板子上就出问题了, ...

是啊,另外告诉你,真正做产品,要比你自己diy玩要考虑问题多的多哦。一个小小的问题瑕疵都可能会让用户觉得不爽哦。

比如你的鼠标,乱跳指针,你是不是有把它砸了冲动。:lol

没啥的,你现在的问题,刚学的人几乎都要遇到这个问题,很正常的,你要做的就是抓紧赶上。

使用特权

评论回复
15
samsunghellome|  楼主 | 2013-8-17 19:24 | 只看该作者
crazy2012 发表于 2013-8-17 19:16
是啊,另外告诉你,真正做产品,要比你自己diy玩要考虑问题多的多哦。一个小小的问题瑕疵都可能会让用户 ...

老师,您有时间帮我参考参考这个课题吧,我想自己做个红外感应开关出来
https://bbs.21ic.com/forum.php?mod=viewthread&tid=600492&epclose=1
我知道前方的路还很遥远,但兴趣是最好的老师,我不怕,会一直**下去!

使用特权

评论回复
16
samsunghellome|  楼主 | 2013-8-17 19:31 | 只看该作者
叶伤 发表于 2013-8-17 19:08
没事,好好加油哈。谁都是从这一步过来的。

师傅,麻烦你有时间帮我看看这个课题吧,我想自己做个东西出来,谢谢!
https://bbs.21ic.com/forum.php?mod=viewthread&tid=600492&epclose=1

使用特权

评论回复
17
stupidboy456| | 2013-8-17 19:51 | 只看该作者
https://bbs.21ic.com/forum.php?mo ... 00492&epclose=1


这是什么东西?打不解开网页,,无结贴权限

使用特权

评论回复
18
crazy2012| | 2013-8-17 20:24 | 只看该作者

把链接里的&epclose=1去掉就可以访问了,不是你的ID的帖子,肯定结不了贴。呵呵。


https://bbs.21ic.com/forum.php?mod=viewthread&tid=600492

使用特权

评论回复
19
samsunghellome|  楼主 | 2013-8-17 20:39 | 只看该作者
https://bbs.21ic.com/forum.php?mod=viewthread&tid=600492
是我发的另一个帖子,呵呵!([51单片机] 基于51单片机的人体感应开关的问题,新人求高手指导)请大家给点建议吧!谢谢!

使用特权

评论回复
20
创隆电子| | 2013-8-17 20:46 | 只看该作者
诶呀!!!用了软件调试功能了吗(这程序不用硬件一调就出来了,看看程序运行到哪里了)。再有你写的程序层次感也有点不好。给看程序的人都有点蒙圈了 把你的代码给我我帮你看看

使用特权

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

本版积分规则

43

主题

198

帖子

0

粉丝