一个延时程序的作用?

[复制链接]
7272|8
 楼主| a3711 发表于 2012-6-10 14:45 | 显示全部楼层 |阅读模式
在书上看到一个简单的程序:按键控制继电器开合,继电器通电时灯泡来亮。

void main()
{
   P1=0xff;
   delay=1;//PNP三极管高电平截止,因为PNP三极管电流从基极流出,高电平时没有电流。
   while(1)
  {
   if (sw==0)//sw是按键,按键控制继电器的开合
      {

     while(sw==0);
//等待按键松开

delay=~delay;//按一次继电器开,再按一次继电器合上

delayms(20);//这里的延时程序有什么用?


  

  }
   }
用protues仿真时,把delayms(20);去掉也没有看出什么不同,那为什么书上要加上这一句?
}
JC.Wang 发表于 2012-6-10 14:57 | 显示全部楼层
你要明白,继电器是机械装置,不会像单片机那么快的,不过这里的20ms也没多大作用。建议你用硬件学习,proteus很多东西都不深入,跟硬件相差很远,用一用你就知道了
 楼主| a3711 发表于 2012-6-10 17:03 | 显示全部楼层
谢谢,我有51的板子。刚刚在 翻看仿真资料的时候看到这一程序就好奇了。这么说这个延时程序就是为了等待继电器的反应速度了。谢谢你~!
joyme 发表于 2012-6-11 10:25 | 显示全部楼层
延时对按键松开时的防抖有一点作用,程序没有按键按下做防抖所以不实用
shuai37zhang 发表于 2012-6-11 15:28 | 显示全部楼层
建议楼主学习软件的同时还是要了解些硬件知识,不然写程序运行时逻辑会出现问题
 楼主| a3711 发表于 2012-6-11 23:52 | 显示全部楼层
谢谢5楼的建议。:loveliness:
 楼主| a3711 发表于 2012-6-11 23:53 | 显示全部楼层
4# joyme 不是等待继电器的反应吗?延迟加在这里显然不是为了防抖。
bbskate 发表于 2012-6-12 00:31 | 显示全部楼层
继电器的原理是电磁的原理 那么就以为这不像cpu执行每一条指令那样运行的时间很短很短 而是需要一定时间 那么久需要一个延时
joyme 发表于 2012-6-16 21:37 | 显示全部楼层
多看看书是对的,不过还是要自己多动脑筋

1、等继电器动作干什么?继电器的动作时间是ms级别(一般也就5-10ms)的,如果忽略按键抖动的话,你能在几或十几ms里按两次键吗?

2、按键防抖的原理是什么?连续两次扫描按键之间的间隔要大于一般的抖动时间6-10ms,否则可能把一次按键检测为多次。这个延时20ms就是防止过快的调用第二次扫键。

3、多学点怎么尽可能多的释放CPU资源才是学习单片机基本,比如用状态机扫描按键,一般按键防抖用连续多少次扫到相同的值来判断按键的状态,当然将扫描间隔加大也是可以的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

29

帖子

0

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