查看: 2247|回复: 3

[应用教程] arduino宏的应用实例3--用宏实现定时调用(转)

[复制链接]
本帖最后由 大连林海 于 2016-5-1 08:15 编辑

这个只是从前几个帖子中提取出的一部分。完成常见的定时执行程序执行程序。
直接上代码:
  1. //宏名:timer。返回值:bool 时间到返回真。参数:enable使能,startTime第一次执行时间,delayTime执行间隔时间,doSomeThing任意表达式到时间执行的任务。
  2. #define timer(enable,startTime,delayTime,doSomeThing) ({\
  3.     static unsigned long timsta = millis();\
  4.     static unsigned long tim = startTime;\
  5.     bool ret = false;\
  6.     if(!enable){timsta = millis();tim = startTime;}else{\
  7.       if (millis() - timsta>= tim){\
  8.         doSomeThing;\
  9.         ret = true;\
  10.         timsta = millis(); \
  11.         tim = delayTime;\
  12.       }\
  13.     }\
  14.     ret;\
  15.   })
  16. //7号端口led闪烁程序
  17. void flash() {
  18.   static bool b = true;
  19.   (b = !b ) ? pinMode(7, OUTPUT) : pinMode(7, INPUT);
  20. }
  21. void setup() {
  22.   // put your setup code here, to run once:
  23.   Serial.begin(9600);
  24.   pinMode(8, INPUT_PULLUP);//8号端口接按键
  25. }
  26. void loop() {
  27.   // put your main code here, to run repeatedly:
  28.   //定时器调用方式1:通过按键使能led每500ms翻转一次。
  29.   timer(!digitalRead(8), 0, 500, flash());
  30.   //定时器调用方式2:通过内嵌的语句执行,0ms执行第一次,然后每2000ms执行一次。
  31.   timer(true, 0, 2000, Serial.println("Timer2 trig!"));
  32.   //定时器调用方式3:通过timer的返回值触发语句(时间到达时触发一次),从3000ms开始,每2000ms执行一次。
  33.   if (timer(true, 3000, 2000, void())) {
  34.     Serial.println("Timer3 trig!");
  35.   }
  36. }
复制代码
程序中分别启动了3个定时执行的程序段;
程序段1,定时器调用方式1:通过按键使能led每500ms翻转一次。
程序段2,定时器调用方式2:通过内嵌的语句执行,0ms执行第一次,然后每2000ms执行一次,打印输出"Timer2 trig!"。
程序段3,定时器调用方式3:通过timer的返回值触发语句(时间到达时触发一次),从3000ms开始,每2000ms执行一次,打印输出"Timer3 trig!"。

dsweiliang  版主

发表于 2016-5-4 09:36:23

学习学习
回复 支持 反对

使用道具 举报

virtualwiz  版主

发表于 2016-5-4 13:23:01

学习了~从来没这样写过~~
回复 支持 反对

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-5-4 13:42:11

virtualwiz 发表于 2016-5-4 13:23
学习了~从来没这样写过~~

现在的高手太多了
回复 支持 反对

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail