電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 2094|回復(fù): 0
收起左側(cè)

[硬件設(shè)計] stc51單片機,延時是軟件延時,但實時性不好,如何處理會比較好

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2021-6-3 09:27:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
老師,我手上有個stc51單片機,現(xiàn)在用的延時是軟件延時,但實時性不好,弊端已經(jīng)顯露出來的,所以,我現(xiàn)在打算用定時器0進行延時,但是我現(xiàn)在不知道該怎么實現(xiàn)比較好,
我選擇的思路是:把定時器配置成1ms,已經(jīng)配置完成,然后在定義20ms,50ms,100ms,500ms的變量和標志位,打算當變量達到相對應(yīng)的時間后,對應(yīng)的標志位置1,
我現(xiàn)在疑惑不知道怎么辦的是:我在主函數(shù)中,不知道該如何去實現(xiàn)這些延時
我原來的代碼如下,我想修改成用定時器來延時,但我不知道該怎么實現(xiàn),實時性比較差的代碼如下:
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.一般解決思路有兩種:一是改變定時器中斷初始化的值,而是利用全局變量,而定時器初始化的值不變的這種方式;但是改變初始化的值會牽扯進來很多東西,而且如果你的單片機運行的任務(wù)比較多的時候,你還想要通過定時器來實現(xiàn)時間片輪的控制的話,就會變得非常復(fù)雜,所以一般情況下我們?nèi)绻獙崿F(xiàn)精確延時的話,我們都會采取全局變量+定時固定的方式來實現(xiàn),換一種思路就是你可以把延時也看做是MCU運行的所有任務(wù)的其中一個任務(wù)這就要求大家對時間片輪方式去控制不同任務(wù),最簡單的方式其實是用一個全局變量的數(shù)組,數(shù)組中的每個元素代表了一個任務(wù),然后每個任務(wù)的時間片輪是多少可以通過這個數(shù)組來調(diào)整
B.我們還是回歸到我們精確延時的問題上來,我們使用全局變量的方式來實現(xiàn),其思路如下:
(1)我們需要兩個全局變量:一個全局變量用來實現(xiàn)你要多長時間的延時,另外一個全局變量用來實現(xiàn)你的延時是否已經(jīng)結(jié)束
(2)具體配合定時器的中斷函數(shù)如何實現(xiàn)呢?我們可以這樣考量,比如說我們要實現(xiàn)ms級的延時我們怎么做呢
a.首先我們做好延時的初始化,由于我們要做ms級延時,所以我們最好是以1ms做初始化
b.然后我們每次用延時函數(shù)的時候,我們改變的是全局變量:
u16 global_delay; //.全局變量
……;
delay_ms(285);
/ *
那么當我們在延時函數(shù)中輸入285的時候,我們延時函數(shù)內(nèi)部要做的事情第一步就是首先給全局變量賦值;
然后緊接著中斷函數(shù)中的這個值就會重新賦值,然后每次進入中斷函數(shù)以后就會對改變量減一;
當該全局變量減為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;
}

凡億教育 課堂免費視頻匯總:https://www.fanyedu.com
回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表