极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10476|回复: 2

arduino宏的应用实例5--用宏实现时间继电器

[复制链接]
发表于 2016-4-27 01:23:15 | 显示全部楼层 |阅读模式
本帖最后由 wwwymq 于 2016-4-27 01:24 编辑

直接上代码:
[pre lang="arduino" line="1" file="delayRelay"]//宏名:delayRelay。返回值:bool 到达时间。输入值:enable使能,del延时时间。作用:延时继电器,当enable使能后,延时del毫秒后接通。
//static unsigned long tim = ({Serial.println("start"), millis();}); //这句用于测试是否能在static 变量设置的时候加入只执行一次的初始化代码块。
#define delayRelay(enable,del) ({\
    static unsigned long tim = millis();\
    if (!enable) {\
      tim = millis();\
    }\
    millis() - tim >= del;\
  })
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(7, INPUT);            //pin7接led
  pinMode(8, INPUT_PULLUP);     //pin8接按键
}
void loop() {
  // put your main code here, to run repeatedly:
  //当8口的按键按下后,延时1000ms接通led,中途断开则下次重新计时。
  if (delayRelay(!digitalRead(8), 1000))
  {
    pinMode(7, OUTPUT);
  } else {
    pinMode(7, INPUT);
  }

}[/code]
代码作用,实现plc中常见的时间继电器功能。
按键保持按下1s后led点亮。
回复

使用道具 举报

发表于 2016-4-27 12:52:28 | 显示全部楼层
我觉得不是所有地方都适合用宏代替函数的.

若你这段代码在很多地方都要引用
1.用宏的话编译器会在每处引用的地方插入该代码
2.用函数的话编译器会在每处引用的地方插入跳转代码

所以用宏的话会使到最终编译出来的程序空间占用大很多(引用越多,差别越大).
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-27 13:22:43 来自手机 | 显示全部楼层
henrypcw 发表于 2016-4-27 12:52
我觉得不是所有地方都适合用宏代替函数的.

若你这段代码在很多地方都要引用

资源足够的前提下我会优先考虑逻辑清晰。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 05:01 , Processed in 0.039615 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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