单片机分时扫描

上传人:hs****ma 文档编号:469398858 上传时间:2023-06-20 格式:DOCX 页数:5 大小:19.82KB
返回 下载 相关 举报
单片机分时扫描_第1页
第1页 / 共5页
单片机分时扫描_第2页
第2页 / 共5页
单片机分时扫描_第3页
第3页 / 共5页
单片机分时扫描_第4页
第4页 / 共5页
单片机分时扫描_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《单片机分时扫描》由会员分享,可在线阅读,更多相关《单片机分时扫描(5页珍藏版)》请在金锄头文库上搜索。

1、下面说的单片机应用也主要是家电控制方面,也就是现在的工作。其它应用不在讨论范围。 才识有限,也敬请前辈们勘误,指教。先用一个小例子引出今天的主题,想象一下,一个基本的家电控制板,肯定或多或少的会包 含 : LED 或者 数码管显示, 按键, 继电器或者可控硅的输出 这 3 部分。数码管需要 10ms到20ms的动态扫描,按键也需要20ms左右的延时消抖,有没有意识到,其实这些时 间是同时在进行的。回想一下咱们的教科书怎么教 按键 的延时消抖的?没错,死循环,绝 对是原地踏步死循环,用指令来计时。这样很自然的引发一个问题,单片机在原地踏步死循 环的话,那么其它的工作怎么办?如数码管的动态扫描怎么

2、办?唯有等按键扫描之后再进行 了,这样出来的效果,数码管肯定会闪烁的,扫描时间过长了,缩短按键消抖时间也不是解 决办法,想象如果咱们还有其它很多工作也是同时做的呢?解决办法之一,就是今天的主题, 分时扫描的思想。当然不会是唯一的办法,只不过俺一直在用,觉得这个是非常不错的思想, 可以解决很多实际问题。大胆妄言一下,分时扫描的思想也是单片机编程最核心的思想了, 信不信就由你自己判断了。程序的执行环境用的是纯汇编,因为用习惯的汇编,以致于整个脑袋都是汇编的思想,某种程度上说,C的 废码确实是多了一点,对于实际工业用的单片机ROM和RAM都不是很充足的情况下,代 码还是要求尽量精简的。所以俺一直都在

3、汇编的苦海中沉浮着说明一点,俺用的是EMC 的单片机(Elan公司的),传闻中最烂的单片机,所以代码不值的去学,也正是这个原因, 但愿我想表达的思想能表达清楚, 阿门!核心思想的实现其实是几个步骤,第一,用TCC中断来计时,TCC的中断时间断一点,我习惯是125us,为了解红外遥控 的码,这个时间是需要的。TCC计时是相当准的,尽量利用。第二,在TCC的中断服务程序里面放3个(数量自定)记时器(说白了就是计数器),我 的习惯是 2ms 5ms 500ms 这3个是作为基准时间,提供给整个系统来调用的,所以 必须准确一点,实际用示波器调一下就OK 了,不难。第三, 在主程序的循环里面放一个专门处

4、理时间的子程序。(注:单片机是不会停的,永远 在不断循环的跑,这个跟学校学的貌似有点不同,俺面试的时候被问过这个问 题 .) 将所有的时间处理都放在时间处理子程序里面做,这样是非常方便的, 一个单片机系统最起码需要处理1020个不同的时间,也需要1020个计时器了, 而且相当多要求同时不同步工作的,如果每个都单独的话是相当的麻烦。第四, “程序是跑着来等,而不是站着来等”,这话看来有点玄,一个跟俺一起进去公司的 工程师讨论的时候提到的这个问题,俺觉得这个也是分时系统的一个比较重要的思 想,所以也这样叫,下面有细说。第五, 下面用程序来说话,注释尽量详细,可以不用看代码,直接看注释就可以了。一)

5、先中断服务程序部分: 每 125us 中断一次产生几个基准时间int_2ms:djzref_2ms(1)jmpint_5msmova,16; 恢复原始数据movref_2ms,absflag_time,flag_2ms(2)int_5ms:djzref_5msjmpref_time_endmova,40125usX40=5msmovref_5ms,absflag_time,flag_5msint_500ms:djzref_500msjmpref_time_endmova,100movref_500ms,absflag_time,flag_500msref_time_end:nop(1)ef_2

6、ms 寄存器不断的减 1,每次中断减1,一共减 16 次,所以这里经过的时间是 125us x 16 = 2ms,这个就是所谓的计时/计数器了。这样就可以靠一个系统的TCC中断,来 实现我们需要的很多个定时时间。(2)置 2ms 计时结束标志,这个是提供给时间处理程序用的,这是一个计时器的框架, 下面的 5ms 计时完全相同。这里解释一下:bsflag_time,flag_2ms,其中bs是将某一位置1的指令,该指令的意思是,将flag_timg寄存器里面第flag_2ms位置1,设立一个溢出标志,后面的程序可以通过 读这个标志,就知道 2ms 是否已经计时到了这程序还用了一个块的框架,比较方

7、便的,不过跟今天的主题无关,以后郁闷的时候再上来 写写这个。上面的程序就是中断服务程序里面的计时器,分别定时2ms 5ms 500ms,计时完 毕溢出是flag_time标志来记录的,程序通过读这个标志就可以知道定时的时间是否已经到 了。二)下面看那个统一的时间服务子程序时间处理子程序time_proc:jbsflag_time,flag_5ms判断 5ms 是否到jmptime_500ms_proc没有的话判断500mstime_5ms_proc:bcflag_time,flag_5ms5ms 已经到了,进入服务程序,先清掉那个标志,这样下次再过5ms才允许进来这里。; 按键延时部分;这里用

8、这个做例子key_delay_proc:jbsflag_delay,key_start ; 按键延时开始标志,这个用来控制是否进入计时,允许计时标志jmpkey_delay_enddjz减一次,这里预设的值是 4reg_key也就是说 5ms * 4 = 20msjmpbsmov movnopkey_delay_end flag_delay,key_flowa,4reg_key,a; 预先设置的延时时间,每5秒有减到 0 的话直接跳出 时间到,置需要用的标志 ; 重新置数据下次用。;500ms 处理部分time_500ms_proc:jbsflag_time,flag_500msretbcfl

9、ag_time,flag_500ms这里放需要的计时器Ret上面用了按键20ms消抖的计时器作为例子,如果理解之后就可以发现,我们可以完全模仿 那个计时器而在下面放很多很多的计时器,则每 5ms 进来一下,每个计时器都同时在计数 了,谁先计算完毕就先关掉自己,置相应的标志给其它程序调用,而对其它计时器完全没有 影响!这样,我们可以在这里放很多个计时器了,一般来说,十来二十个是没有问题的,完 全满足一个单片机系统对多个时间的需求了。单个计时器的结构很简单,先判断允许计时标志是否进入计时,然后一个专用的寄存器在加 1或者减1,加/减购相应的数值之后也就是相应的时间到了,关掉计时器,置相应需要用到

10、的标志。到这里差不多了,俺们需要的时间都可以出来了,这样做是不是非常方便?咱们再来看看在 这段时间里面单片机在做了什么东西?只有中断计时够 5ms 或者 500ms ,那个溢出标志 才有效,才能进入上面的计时程序,其它时间都是在做其它事情。而且进入上面的计时器的 时候,可以看出,并不是在那里死循环,只是单纯的加减一下寄存器就退出了,整个过程耗 时极其短,看代码不同吧,5us到20us左右吧,对主程序的执行没有什么影响。(三)下面看看具体怎么调用 最开始谈过的按键的消抖时间处理问题,现在就用上面介绍的办法来看具体怎么解决问题。按键的处理也是重要的基础学问,不过不在本次的讨论范围,所以只是单单的讨

11、论怎么解决时间问题,而对于按键的一些问题,下次有机会继续讨论吧,hohoscan_key:jbc jmp jbs jmpflag_key,first_onhave_keyport6,1key_end; 用来控制跳转的假设P61高电平是有键bsflag_key,first_on第一次按键的标志bsflag_delay,key_start启动计时器开始定时 20ms 消抖have_key:jbsflag_delay,key_flow等待定时结束溢出jmpkey_end大概是这样的:判断时候有健,没有的话跳出,有的话开始延时消抖的计时,第二次进来的时候直接由标志位控制过去判断时间时候够。同样是等待,

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

13、am清空 RAMcallinitialize初始化loop:eni开中断wdtc清看门狗callscan_proc调用扫描 LED 和按键程序callir_data_proc调用红外处理程序calltime_proc调用时间统一处理程序calloutput_proc调用输出处理程序jmploop这个就是我用的循环体了,所有功能都做成子程序形式了,需要就挂上去就可以了,比较方 便,这样一个总的循环体,单片机就是在不断的执行这个循环体,如果整个程序都采用上面 说的分时扫的思想的话,一周循环回来的时间是相当短的,其实是不是跟电脑的思想有点像 呢?电脑再快也并不是同时处理多个任务,而且每次处理一个,然

14、后非常快的速度来循环处 理,让我们感觉上他是在同时处理多个程序那样,我想,我最终想表达的思想也就是这个而已。啰啰唆唆的说了一堆,也不知道是否能看懂,或者是否去看。不知道我对分时扫描这个概念 是否理解错了呢?在我看来,有这个思想支撑下,单片机的程序变得比较容易上手了,剩下 的只是集中精力去用程序来实现我们的思想而已,当然,这里只是说一种可行的办法而已 不是说只有这种办法,如果大家有好的思想也分享一下哦,编写程序是一门艺术,写出来很 容易,但是写得好,写得精巧,那就很难了。最后来段日文结束吧,最近的坏习惯付吉合本当僕未熟先 輩上引土 指導比巴于和壬嬉(感谢大家能看完,在下还是菜鸟,希望能得到前辈们的指导,拜谢)Etual2007-1-13

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号