微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 软件延时的误区

软件延时的误区

时间:11-13 来源:互联网 点击:
通常在大学里学习单片机编程,老师都是教导要写程序流程,而且写出来的流程几乎是一条长龙偶尔附加点分支判断。这样写出来的程序条理比较清晰、易懂,但是通常问题多多,比如我突然间要加点东西进去,发现系统不正常了。

往往这些问题都是整个流程上附加的延时过多导致的。延时程序是比较直观明了的程序,但是也破坏单片机的整机性能,因为延时单片机处于全速运行状态。

我现在的脑海想起以前写的流程:初始化->显示->按键->其他功能->结束。

1.比如说显示,肉眼不可分辨是50HZ以上,所以说用4个数码管动态显示平均每个显示是5ms。按照以前的观点是这样写的 第一个数码管点亮->延时几毫秒、灭第一个、点亮第二个->...->延时、灭最后个、点亮第一个。 如果8个数码管的动态显示,岂不是得有 8 * 几毫秒的 延时。

2.还有个按键,按键得有个去除抖动,通常是软件延时,大约在20ms, 如果在加上显示的几十毫秒,那这延时是相当恐怖的。

3.其他功能函数也是有附带延时,特别是驱动程序,比如MAX7279读取操作都是需要一定延时,但是这种延时都是在us级别,对比与ms级别可以忽略。

笔者建议写程序,特别写到延时程序,考虑下你的延时得多久,如果是ms级别,考虑用定时器中断处理。

比如说显示程序。假如8个数码管动态显示。那么你就得考虑20ms内8个数码管刷新一次,那么意味着每个数码管显示时间为2.5ms。

那么程序如下:

volatile unsigned char time_2500_flag; //2.5ms标志

void TimerA(void) //定时器初始化

{

//初始化,配置为500us中断一次

}

#pragma interrupt_handler TimerA_ISR:NUM
void Timer1_ISR(void) //中断服务程序

{

static unsigned char cnt = 0;

//reload 重新赋值

if (++cnt > 5)

{

cnt = 0;

time_2500_flag = 1;

}

}

void Display(void)

{

;

}

void main(void)

{

//初始化

for (;;)

{

if (time_2500_flag == 1)

{

time_2500_flag = 0;

Display();

}

}

}

程序写到这里。

显示程序这里要做特别处理,执行一次显示程序,数码管依次点亮就OK。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top