新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 軟件延時(shí)的誤區(qū)

軟件延時(shí)的誤區(qū)

作者: 時(shí)間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
通常在大學(xué)里學(xué)習(xí)單片機(jī)編程,老師都是教導(dǎo)要寫程序流程,而且寫出來的流程幾乎是一條長(zhǎng)龍偶爾附加點(diǎn)分支判斷。這樣寫出來的程序條理比較清晰、易懂,但是通常問題多多,比如我突然間要加點(diǎn)東西進(jìn)去,發(fā)現(xiàn)系統(tǒng)不正常了。

往往這些問題都是整個(gè)流程上附加的延時(shí)過多導(dǎo)致的。延時(shí)程序是比較直觀明了的程序,但是也破壞單片機(jī)的整機(jī)性能,因?yàn)檠訒r(shí)單片機(jī)處于全速運(yùn)行狀態(tài)。

本文引用地址:http://butianyuan.cn/article/201611/316566.htm

我現(xiàn)在的腦海想起以前寫的流程:初始化->顯示->按鍵->其他功能->結(jié)束。

1.比如說顯示,肉眼不可分辨是50HZ以上,所以說用4個(gè)數(shù)碼管動(dòng)態(tài)顯示平均每個(gè)顯示是5ms。按照以前的觀點(diǎn)是這樣寫的 第一個(gè)數(shù)碼管點(diǎn)亮->延時(shí)幾毫秒、滅第一個(gè)、點(diǎn)亮第二個(gè)->...->延時(shí)、滅最后個(gè)、點(diǎn)亮第一個(gè)。 如果8個(gè)數(shù)碼管的動(dòng)態(tài)顯示,豈不是得有 8 * 幾毫秒的 延時(shí)。

2.還有個(gè)按鍵,按鍵得有個(gè)去除抖動(dòng),通常是軟件延時(shí),大約在20ms, 如果在加上顯示的幾十毫秒,那這延時(shí)是相當(dāng)恐怖的。

3.其他功能函數(shù)也是有附帶延時(shí),特別是驅(qū)動(dòng)程序,比如MAX7279讀取操作都是需要一定延時(shí),但是這種延時(shí)都是在us級(jí)別,對(duì)比與ms級(jí)別可以忽略。

筆者建議寫程序,特別寫到延時(shí)程序,考慮下你的延時(shí)得多久,如果是ms級(jí)別,考慮用定時(shí)器中斷處理。

比如說顯示程序。假如8個(gè)數(shù)碼管動(dòng)態(tài)顯示。那么你就得考慮20ms內(nèi)8個(gè)數(shù)碼管刷新一次,那么意味著每個(gè)數(shù)碼管顯示時(shí)間為2.5ms。

那么程序如下:

volatile unsigned char time_2500_flag; //2.5ms標(biāo)志

void TimerA(void) //定時(shí)器初始化

{

//初始化,配置為500us中斷一次

}

#pragma interrupt_handler TimerA_ISR:NUM
void Timer1_ISR(void) //中斷服務(wù)程序

{

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();

}

}

}

程序?qū)懙竭@里。

顯示程序這里要做特別處理,執(zhí)行一次顯示程序,數(shù)碼管依次點(diǎn)亮就OK。



關(guān)鍵詞: 軟件延時(shí)誤

評(píng)論


技術(shù)專區(qū)

關(guān)閉