单片机工程经验 - 状态机时间片结合

本文介绍了一种利用状态机与时间片相结合的方法来实现单片机控制LED灯的复杂状态变化。通过定义四种状态及100毫秒为时间片,实现了初始熄灭、闪烁、再次熄灭到最终常亮的功能。

单片机工程经验 - 状态机时间片结合

通常来说,大部分程序使用状态机和时间片的结合就能满足,如果不知道状态机和时间片是什么的可以看我之前的文章
单片机工程经验 - 状态机
单片机工程经验 - 时间片

举例

我们直接上例子,还是点灯,但是这回我们我们需要一开始先闪烁5秒(亮100ms,灭500ms),然后熄灭3秒,最后常亮,而底层给到我们的函数只有led_open()led_close,应用层希望在点灯的时候调用一个接口,比如app_open_led()即可完成该功能,而不希望去在后续还要控制灯闪烁、熄灭、常亮等。也就是说应用层调用了app_open_led()之后,后续应用层就不想再管了,你自己跑吧。

分析

首先我们看到功能中有四个状态

  1. 一开始的熄灭状态
  2. 点灯之后闪烁状态
  3. 闪烁之后熄灭状态
  4. 熄灭之后的常亮状态

于是我们可以列出这么四个状态

enum{
   
   
 LED_STATE_CLOSE,//一开始的熄灭状态
 LED_STATE_BLINK,//点灯之后闪烁状态
 LED_STATE_BLINK_AFTER_CLOSE,//闪烁之后熄灭状态
 LED_STATE_OPEN,//熄灭之后的常亮状态
};

然后我们计算时间片,发现闪烁5秒和熄灭3秒的最大公约数是1秒,但是这里我们还要考虑闪烁的时间,那么我们的时间片轮询函数就是100毫秒轮询一次。

代码实现

enum{
   
   
 LED_STATE_CLOSE,//一开始的熄灭状态
 LED_STATE_BLINK,//点灯之后闪烁状态
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝忧云枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值