欢迎光临散文网 会员登陆 & 注册

纪客老白【每日答疑】白纪龙老师每日6点更新一题目,欢迎各位关注!

2020-07-19 11:43 作者:纪客老白  | 我要投稿


纪客老白

答疑方向:半导体设计,职场规划、项目管理、硬件设计、高速PCB设计,高速电路设计,EMC设计,仿真等等!

答疑讲师:白纪龙   飞利浦技术专家、上市公司研发经理、资深硬件教育讲师!

1、资历深厚:10余年消费类电子,汽车电子以及医疗电子一线项目研发经验。

2、热门项目经验:致力于目前热门物联网技术以及人工智能以及IVD领域医疗器械的研究与实践!

3、口碑讲师:为多家上市公司与行业高校进行电子行业知识讲座、技术内训!

学生提问:老师,我手上有个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



纪客老白【每日答疑】白纪龙老师每日6点更新一题目,欢迎各位关注!的评论 (共 条)

分享到微博请遵守国家法律