单片机工程经验 - 状态机时间片结合
通常来说,大部分程序使用状态机和时间片的结合就能满足,如果不知道状态机和时间片是什么的可以看我之前的文章
单片机工程经验 - 状态机
单片机工程经验 - 时间片
举例
我们直接上例子,还是点灯,但是这回我们我们需要一开始先闪烁5秒(亮100ms,灭500ms),然后熄灭3秒,最后常亮,而底层给到我们的函数只有led_open()和led_close,应用层希望在点灯的时候调用一个接口,比如app_open_led()即可完成该功能,而不希望去在后续还要控制灯闪烁、熄灭、常亮等。也就是说应用层调用了app_open_led()之后,后续应用层就不想再管了,你自己跑吧。
分析
首先我们看到功能中有四个状态
- 一开始的熄灭状态
- 点灯之后闪烁状态
- 闪烁之后熄灭状态
- 熄灭之后的常亮状态
于是我们可以列出这么四个状态
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,//点灯之后闪烁状态

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





