微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机分时思想

单片机分时思想

时间:11-17 来源:互联网 点击:

断5ms是否到

jmp time_500ms_proc 没有的话判断500ms

time_5ms_proc:

bc flag_time,flag_5ms 5ms已经到了,进入服务程序,先清掉那个标志,这样下次再过5ms才允许进来这里。

;------------------ 按键延时部分--------------------- ;这里用这个做例子

key_delay_proc:

jbs flag_delay,key_start ; 按键延时开始标志,这个用来控制是否进入计时,允许计时标志

jmp key_delay_end

djz reg_key ; 预先设置的延时时间,每5秒减一次,这里预设的值是4,也就是说 5ms * 4 = 20ms

jmp key_delay_end 有减到0的话直接跳出

bs flag_delay,key_flow 时间到,置需要用的标志

mov a,@4 ; 重新置数据下次用。

mov reg_key,a

key_delay_end:

nop

;---------------------500ms处理部分------------------------

time_500ms_proc:

jbs flag_time,flag_500ms

ret

bc flag_time,flag_500ms

这里放需要的计时器

Ret

上面用了按键20ms消抖的计时器作为例子,如果理解之后就可以发现,我们可以完全模仿那个计时器而在下面放很多很多的计时器,则每5ms 进来一下,每个计时器都同时在计数了,谁先计算完毕就先关掉自己,置相应的标志给其它程序调用,而对其它计时器完全没有影响!这样,我们可以在这里放很多个计时器了,一般来说,十来二十个是没有问题的,完全满足一个单片机系统对多个时间的需求了。

单个计时器的结构很简单,先判断允许计时标志是否进入计时,然后一个专用的寄存器在加1或者减1,加/减购相应的数值之后也就是相应的时间到了,关掉计时器,置相应需要用到的标志。

到这里差不多了,俺们需要的时间都可以出来了,这样做是不是非常方便?咱们再来看看在这段时间里面单片机在做了什么东西?只有中断计时够 5ms 或者 500ms ,那个溢出标志才有效,才能进入上面的计时程序,其它时间都是在做其它事情。而且进入上面的计时器的时候,可以看出,并不是在那里死循环,只是单纯的加减一下寄存器就退出了,整个过程耗时极其短,看代码不同吧,5us到 20us左右吧,对主程序的执行没有什么影响。

(三)下面看看具体怎么调用

最开始谈过的按键的消抖时间处理问题,现在就用上面介绍的办法来看具体怎么解决问题。按键的处理也是重要的基础学问,不过不在本次的讨论范围,所以只是单单的讨论怎么解决时间问题,而对于按键的一些问题,下次有机会继续讨论吧,hoho~~~

scan_key:

jbc flag_key,first_on ; 用来控制跳转的

jmp have_key

jbs port6,1 假设P61高电平是有键

jmp key_end

;-------------------------------------

bs flag_key,first_on 第一次按键的标志

bs flag_delay,key_start 启动计时器开始定时20ms消抖

have_key:

jbs flag_delay,key_flow 等待定时结束溢出

jmp key_end

大概是这样的:判断时候有健,没有的话跳出,有的话开始延时消抖的计时,第二次进来的时候直接由标志位控制过去判断时间时候够。

同样是等待,这里就是最后一点所说的,咱这是跑着来等,不是站着来等。跟死循环定时比较,在没有定时到20ms 的这段时间里面单片机在做什么? 死循环的话,肯定就是在原地等,什么都不做,而看看上面的程序,他只是判断是否定时够,具体的定时在统一的时间子程序里面做,判断没有到时间的话就跳出了,继续跑其它的程序,直到当时间到了,单片机判断出flag_delay,key_flow 符合条件,开始进入按键处理程序了,在这个期间,单片机都在做其它事情,只是一个主循环跑回来判断一次,所以单片机完全有空跑其它的程序,而没有将时间都耗在消抖上面。

(四)看看我的主程序循环体

start:

call clear_all_ram 清空RAM

call initialize 初始化

loop:

eni 开中断

wdtc 清看门狗

call scan_proc 调用扫描LED和按键程序

call ir_data_proc 调用红外处理程序

call time_proc 调用时间统一处理程序

call output_proc 调用输出处理程序

jmp loop

这个就是我用的循环体了,所有功能都做成子程序形式了,需要就挂上去就可以了,比较方便,这样一个总的循环体,单片机就是在不断的执行这个循环体,如果整个程序都采用上面说的分时扫的思想的话,一周循环回来的时间是相当短的,其实是不是跟电脑的思想有点像呢?电脑再快也并不是同时处理多个任务,而且每次处理一个,然后非常快的速度来循环处理,让我们感觉上他是在同时处理多个程序那样,我想,我最终想表达的思想也就是这个而已。

啰啰唆唆的说了一堆,也不知道是否能看懂,或者是否去看。不知道我对分时扫描这个概念是否理解错了呢?在我看来,有这个思想支撑下,单

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top