軟件延時(shí)的誤區(qū)
往往這些問(wèn)題都是整個(gè)流程上附加的延時(shí)過(guò)多導(dǎo)致的。延時(shí)程序是比較直觀明了的程序,但是也破壞單片機(jī)的整機(jī)性能,因?yàn)檠訒r(shí)單片機(jī)處于全速運(yùn)行狀態(tài)。
本文引用地址:http://www.ex-cimer.com/article/201611/316566.htm我現(xiàn)在的腦海想起以前寫的流程:初始化->顯示->按鍵->其他功能->結(jié)束。
1.比如說(shuō)顯示,肉眼不可分辨是50HZ以上,所以說(shuō)用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í)器中斷處理。
比如說(shuō)顯示程序。假如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。
評(píng)論