如下**: 最近常在网络上看一些朋友在讨论如何做软件延时,有用C的,也有用ASM的.
作为个人而言,我一般不喜欢软件延时的,特别是在单核心的单片机系统中.想想看
即使是1MIPS的MCU执行速率,1ms的时间,系统就可以跑1000条指令呀,可以检测
多少个需要处理的信号.但是由于软件延时处理起来比较方便一点,所以一直还受多数人的追捧.
首先,我们这里讲的软件延时是指把MCU几乎当下来,什么事情都不处理,只是简单
的在一个延时LOOP中循环,知道需要的时间到后,才跳出循环.从这里,我们就可以看出软件
延时的优缺点了.软件延时的优点是,在不计较中断的影响下,只要指令周期计算得很精准
延时的精度也会很高,而且处理十分方便.它的缺点就是,在延时过程中,会忽略一些输入信号的处理.
造成处理的时实性不是很好.
为了实现精准的延时,你必须要弄清楚2个问题: 1是你使用的MCU的指令执行速度是多少,即指令周期,2是每一个指令执行需要多少个指令执行周期.比如你使用传统的51,一个NOP
指令需要2个指令周期,当你使用12M的外部晶体是,指令周期刚好是1us,所以这个NOP就需要
2us的时间来执行.
例如我们在模拟IIC通信时,为了运行可靠,需要在改变IO状态后延时10us左右,再改变时钟信号线.
这里,我们往往是使用一长串NOP指令,5个,或者更多。所以当一些朋友使用了我们的多核心
IC后,就幽默的说,其实那样的NOP串真的很不环保.因为在我们的系统中,延时10个指令周期,
也可以简单的写成DELAY 9,这是真正的原指令,并非一个虎人的宏指令,因为它绝对只需要你一
条指令占有的空间就可以存储了.
我不谈别人怎么去实现1ms的延时了,我用我的系统写给你看看,指令周期还是1us,都知道,需要
1000个指令周期啦.
好办得很:
delay_1ms:
delay 249 ;延时250
delay 249
delay 249
delay 248
ret ;此返回指令需要一个指令周期,所以上面少执行一个,多好配合呀,哈哈.
如果要延时长一点,那也加几个回圈, 看看我的循环,仔细体会一下吧,先忙其它的去了.
delay_n100ms: mov temp00, a delay_n100ms_loop: mov a, 250 mov temp01, a ;250 *800 delay 249 delay 249 delay 249 delay 47 dzsn temp01 goto $-5 ; dzsn temp00 goto delay_n100ms_loop ret ;-------------------------------------------------------- delay_n10ms: mov temp00, a delay_n10ms_loop: mov a,80 mov temp01, a ;250* delay 247 dzsn temp01 goto $-2 dzsn temp00 goto delay_n10ms_loop ret
相关链接:http://http://www.gkbk.com/more.asp?name=gongkong&id=83211 |