怎么实现单片机多个函数功能同时执行
我的程序老是不能兼得,当流水灯亮是,数码管就不动了,而数码管亮时流水灯停止。
这个程序的设置思路是怎样?或要用到什么单片机功能才能实现?谢谢各位大侠了。 展开
单片机“同时”执行多个函数的方法,一定要耐心看完哦!
设计主要思想:
单片机不可能同时执行多个函数,但是可以先后执行程序给他安排的每一件事,假如每个事件间隔时间非常短,ms、us级别,或者间隔时间更短,那么连续一段时间内执行的事件,看起来就是同时执行的。每一个事件可以看做一个或多个函数,也就意味着只要程序安排的合理,很多函数看起来是同时运行的;
模型举例:假如要做几件事,烧开水,洗衣服,打游戏;
A:烧开水,等好了之后,洗衣服,洗完之后,打游戏;
B:烧开水,洗衣服时监听水壶的声音,两件事执行完,打游戏;
C:选择一个烧水开了会停止工作的电水壶,不要等了,用洗衣机洗衣服,打游戏;
耗时:A最长,其次B,C最短。
不同的工具占用人时间精力也是不同的,同理单片机周围外设选择不同,也会影响CPU占用时间;
实例:
要求:假如单片机要“同时”执行,数码管显示、蜂鸣器、流水灯移动;
具体实施A:设置一个定时器,假如每隔1ms进入中断,设置几个全局变量x、y、z,定时器中断里自加,在程序主循环里查询全局变量的数值,当x大于500后,清零x,让流水灯移位,当y大于,1000时清零y,数码管加1,当z大于2时,清零z,反转控制蜂鸣器的IO电平,以此类推其他事情也是如此。
具体实施B:设置单片机本身PWM驱动蜂鸣器,设置一个定时器,假如每隔1ms进入中断,设置几个全局变量x、y、z,定时器中断里自加,在程序主循环里查询全局变量的数值,当x大于500后,清零x,让流水灯移位,当y大于,1000时清零y,数码管加1,以此类推其他事情也是如此。
使用内部PWM资源可以更省CPU时间!
总结:
如果外设资源不足只能算法来补充;
以上方法适合资源较少的单片机,若是单片机资源够多(RAM>4K,Flas>8K),很多实时操作系统可以选择:ucos,FreeRTOS等,这些实时操作系统可以方便管理事件的切换。
1. 加锁存器,也就是说你把IO口状态改变后,锁存器会自动锁存输出状态,直到你改变为止;
2. 对于数码管来说,可以用扫描来实现,即每隔一段时间点亮一次,但人的肉眼又分辨不出来。这就要求时间要短。人眼的视觉暂留时间是0.1-0.4S,因此如果每20ms点亮一次人眼是完全分辨不出来的。
3. 使用并行语句,这就不能使用单片机了,可以使用CPLD,我见过用单片机来控制CPLD的,你也可以这样。
设计主要思想:
单片机不可能同时执行多个函数,但是可以先后执行你给他安排的每一件事。
简单的讲,(每一个事件可以看做一个或多个函数)充分利用时间:把A事件的延时去做b事件,把B做完后,或者做完n个B事件后,A事件所需要的延时到了,开始做A事件延时之后的事情。
具体实现方法:设置一个定时器,假如每隔10ms进入中断,中断里设置几个全局变量想,x、y,自加,在程序主循环里查询全局变量的数值,当x大于100后,清零x让流水灯移位,当y大于50时清零y,数码管加·1,以此类推其他事情也是如此。
2012-06-03
复杂点的必须引入实时操作系统可以解决,