找回密码
 注册
关于网站域名变更的通知
查看: 431|回复: 1
打印 上一主题 下一主题

单片机日常系列!今天我在修改定时器定时功能

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-2-25 09:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机日常系列!今天我在修改定时器定时功能5 T: b( Z) m/ e4 c* a

( l- u+ G) `2 j) W

慎用标志位(本人单片机菜鸟,高手请高抬贵手,欢迎指点!~)

这里说的是合理谨慎的运用标志位,否则很容易出现错误,也很难debug。

今天工作的时候,修改定时器定时功能的时候,得出的经验,这里说的与具体的单片机无关,是个通用的想法。

以我今天修改的为例:

PIC单片机的两个I/O引脚控制着两个LED灯(分别为蓝灯和红灯,这里以LED代替,避免涉及公司里的内容)的亮和灭。

要求是

蓝灯每5s亮一次,大概亮100ms;

红灯每隔10s亮一次,每次亮100ms;

红灯和蓝灯尽量错开。

我的思路是,

定义一个10s的时间轴,用定时器来实现,在2.5秒和7.5秒时刻点亮蓝灯,在10s时刻点亮红灯。

有一个全局变量cnt。

定义一个全局变量times = 0。

[cpp] view plain copy print?

0 2.5s 5s 7.5s 10s

|-------------|===|-------------|-------------|===|-------------|+++|

blue blue red

|----times=0------|----------times=1----------|----times=0-----------|

我理所当然的就

每10ms进一次中断

if((cnt > 250)&&(times == 0))

{

times = 1;

blue_led_light_flag = 1;

blue_led_on = 1;

}

if((cnt > 750)&&(times == 1))

{

times = 0;

blue_led_light_flag = 1;

blue_led_on = 1;

}

if(cnt > 1000)

{

red_led_light_flag = 1;

red_led_on = 1;

}

if((cnt > 250)&&(times == 0)) 理所当然的以为这样是可以的,且不知这里有一个bug,因为在7.5-10s的时候,也符合这个条件的。。。这样出来的系哦啊过就不是上面所想的

我们应该改为if((cnt > 250)&&(times == 0)&&(cnt < 750))这样才是可以的。。。

, b* [( \( R1 j9 I  q; u# L! @

该用户从未签到

2#
发表于 2019-2-25 17:11 | 只看该作者
学习一下,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-4 21:58 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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