单片机实现延时一般有一下几种方式
1.软件延时
利用多个指令的执行来延时,累加每个指令的运行时间,来计算出延时的总时间。一般写成一个延时函数。
如,以下是1ms软件延时。
delay_1ms() {
int c = 1000; // 调整常数,以达到要求的延时,但很难!
while(c != 0) {
c--;
}
}
以上函数被调用一次,就延时1ms,多次调用可以达到任意时间要求。
!但是,在延时时,就其它什么事也做不了了,就是干等啊!
2.硬件延时
利用定时器/计数器芯片,或用微控制器内部的定时器/计数器,实际上,它就是对晶振的分频(分频系数可编程设置),得到一个精确的低频的周期信号,用这个周期信号(比如10ms)去触发中断,每10ms调用一次定时中断服务程序。在定时中断服务程序中加入计数变量,就可以得到任意的定时了。
在10ms没有到时,微控制器可以运行其它程序,10ms到时再自动进去中断服务程序以处理定时任务,不会像软件延时阻塞了。
操作系统中,都有个硬件延时,和定时中断,可以看ucos ii中的源码,节拍时钟,和汇编语言实现的定时中断。
硬件延时,要占用一个定时器/计数器硬件资源。
单片机中采用软件延时处理事项,是书本中误人子第的做法;当处理的事项越复杂、软件延时越长,程序在那里傻等,其他事项都不用干啦!
成熟的程序架构,必须要有系统时基,短的ms级,长的100ms、500ms、1sec,程序循环里有了这些标准时间,处理任何时间间隔的事项来,都会得心应手。
就是数数延时了,你数满一百需要十秒,单片机数满一百仅需要几百微秒,多数几次就达到延时目的了。这是最笨的延时办法。成熟的程序员不会在那死等数数,他会先处理别的事情当做数数时间,这样程序就不会死机
单片机每执行一天机器码/语句,都是需要时间的。有机器周期,指令周期,时钟周期之分。
那么单片机要延时就很简单了。就是做一些无关紧要的指令来达到消耗时间延时的目的。
PS:如果一个程序像这种消耗时间的延时多了,程序就会柱塞。怎么处理不柱塞又能达到延时的目的。合理安排程序内各程序的运行。这就是新手和高手的区别。