您的位置 首页 数字

软件延时的误区

通常在大学里学习单片机编程,老师都是教导要写程序流程,而且写出来的流程几乎是一条长龙偶尔附加点分支判断。这样写出来的程序条理比较清…

一般在大学里学习单片机编程,教师都是教训要写程序流程,并且写出来的流程几乎是一条长龙偶然附加点分支判别。这样写出来的程序条理比较明晰、易懂,可是一般问题多多,比方我突然间要加点东西进去,发现体系不正常了。

往往这些问题都是整个流程上附加的延时过多导致的。延时程序是比较直观明晰的程序,可是也损坏单片机的整机功用,由于延时单片机处于全速运转状况。

我现在的脑际想起曾经写的流程:初始化->显现->按键->其他功用->完毕。

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。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/273243.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部