纪客老白【每日答疑】我手上有个stc51单片机,现在用的延时是软件延时,但实时性不好,弊端已经显露出来的,所以,我现在打算用定时器0进行延时,但是我现在不知道该怎么实现比较好。

白纪龙
学生提问如下;
老师,我手上有个stc51单片机,现在用的延时是软件延时,但实时性不好,弊端已经显露出来的,所以,我现在打算用定时器0进行延时,但是我现在不知道该怎么实现比较好,
我选择的思路是:把定时器配置成1ms,已经配置完成,然后在定义20ms,50ms,100ms,500ms的变量和标志位,打算当变量达到相对应的时间后,对应的标志位置1,
我现在疑惑不知道怎么办的是:我在主函数中,不知道该如何去实现这些延时
我原来的代码如下,我想修改成用定时器来延时,但我不知道该怎么实现,实时性比较差的代码如下:
Y07=1;
delay_ms(20);
Y01=0:
if (x01==0)
{
Y02=0;
delay_ms(500);
if (x05 == 0)
{
Y04=0;
delay_ms(100);

Y06=1;

   }

}

白纪龙老师解答:
A.一般解决思路有两种:一是改变定时器中断初始化的值,而是利用全局变量,而定时器初始化的值不变的这种方式;但是改变初始化的值会牵扯进来很多东西,而且如果你的单片机运行的任务比较多的时候,你还想要通过定时器来实现时间片轮的控制的话,就会变得非常复杂,所以一般情况下我们如果要实现精确延时的话,我们都会采取全局变量+定时固定的方式来实现,换一种思路就是你可以把延时也看做是MCU运行的所有任务的其中一个任务这就要求大家对时间片轮方式去控制不同任务,最简单的方式其实是用一个全局变量的数组,数组中的每个元素代表了一个任务,然后每个任务的时间片轮是多少可以通过这个数组来调整。
B.我们还是回归到我们精确延时的问题上来,我们使用全局变量的方式来实现,其思路如下:
(1)我们需要两个全局变量:一个全局变量用来实现你要多长时间的延时,另外一个全局变量用来实现你的延时是否已经结束。
(2)具体配合定时器的中断函数如何实现呢?我们可以这样考量,比如说我们要实现ms级的延时我们怎么做呢!
a.首先我们做好延时的初始化,由于我们要做ms级延时,所以我们最好是以1ms做初始化。
b.然后我们每次用延时函数的时候,我们改变的是全局变量:
u16 global_delay; //.全局变量
……;
delay_ms(285);
/ *
那么当我们在延时函数中输入285的时候,我们延时函数内部要做的事情第一步就是首先给全局变量赋值;
然后紧接着中断函数中的这个值就会重新赋值,然后每次进入中断函数以后就会对改变量减一;
当该全局变量减为0的时候,就让标志位置一

*/

void delay_ms(u16 ms)
{
global_delay=ms;
while(!DELAY_FLAG);

DELAY_FLAG=0;
}
void Timer_Intterupt()
{
global_delay–;
if(0==global_delay)
DELAY_FLAG=1;
}

猜你喜欢

转载自blog.csdn.net/m0_49011926/article/details/107867607