单片机怎么在灯闪烁的同时去做另一件事情呢?

2020-01-13 18:34发布


程序中定时1s和10s有什么问题没有

BOOL  volatile  led_flag;
BOOL  volatile  flag_1s;
BOOL  volatile  flag_10s;

void Sys_10ms_Interrupt(void) //10ms中断函数
{
        static volatile  u16 led_timer = 0;
        static volatile  u16 count_timer = 0;
        static volatile  u16 count_timer2 = 0;
        count_timer++;
        flag_1s = 0;
        if(count_timer%100 == 0)       
        {       
                flag_1s = 1;          //1s定时
                count_timer2++;
                if(count_timer2 == 10)
                {                  
                        flag_10s = 1;       //10s定时
                        count_timer2 = 0;
                }
        }
        led_timer++;
        if(led_timer>10) //100ms 反转
        {
                led_flag =~led_flag;
                led_timer = 0;
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
42条回答
磊磊映画
1楼-- · 2020-01-18 09:26
没必要用定时器实现,只用定时器做一个时基就行了 比如1ms记个时 变量++ ,主程序写成判断式的非阻塞     一直判断某个状态 多个状态
mikewang011
2楼-- · 2020-01-18 14:52
资深雨粉 发表于 2018-11-6 11:10
看不懂你写的这个。软件定时队列怎么弄

硬件定时间实现 tick-tock, 基于tick-tock来写一个状态机(称为B吧)来管理软定时器队列。比如 tick tock 1ms, 你想要100ms的定时,那就向软件定时器队列注册一个100ms timer,同时绑定好回调函数,当你的状态机B发现队里中100ms的 timer timeout了,调用回调函数。可以参考 rtos的 timer实现。
cnshibo
3楼-- · 2020-01-18 16:52
 精彩回答 2  元偷偷看……
cysocool
4楼-- · 2020-01-18 21:03
用中断,或者上操作系统啊
dou_yuyu
5楼-- · 2020-01-18 23:09
个人认为,这类应用,最好是 ,做个标志位,中断里判断后写标志位。然后主程序来执行具体操作。当然你的任务真的非常需要立即执行,也可以写中断里。但是一般情况下,建议中断里代码越少越好。
diyeyuye
6楼-- · 2020-01-19 02:13
资深雨粉 发表于 2018-11-6 11:10
看不懂你写的这个。软件定时队列怎么弄

找下安富莱教程了解一下,他们的历程都是使用软定时器的框架来写的,很好用。

一周热门 更多>