回覆列表
  • 1 # 使用者8852944140293

    請你明確你的程式具體出什麼問題,別讓我們再去讀整個程式啊!你可以這樣描述:不顯示、計數不正確、時間間隔不正確等等……

    大致看了一下,感覺有幾個思路問題,給你些提示吧:

    1. 你的程式會不斷的執行display(),原因是超級迴圈體裡面沒有對display的執行條件予以限制,我想著一定是你不希望的吧,而且通常這樣會帶來問題!解決:增加一個標誌變數,你的限定條件是1秒重新整理一次顯示,在定時器中斷中計數到達1秒時置位這一個標誌,在超級迴圈體中的部分使用:

    if(標識變數) {

    ……

    display();

    標識變數 = 0; //清零標誌,很重要!

    }

    你上面的程式 if(a==20) {} 也可以有類似的效果,不過你沒有把display包括進去就有問題了。

    2. 從最佳化的角度講TH0=(65536-50000)/256這樣的語句是垃圾程式碼,你應該把具體的值算出來填寫上去才對,否則微控制器執行的時候還需要計算這個太浪費。如果你想程式便於理解又便於維護你可以這樣:

    #define THVALUE (65536-50000)/256

    TH0 = THVALUE;

    這樣在編譯的時候編譯器會幫你完成計算。同樣是最佳化,temp計數再轉換成個十百位也不理想,其實本例中你的temp沒有其它用處,你完全可以這樣:

    ge++;

    if (ge == 10) {

    shi++;

    ge = 0;

    }

    if (shi == 10) {

    bai++;

    shi = 0;

    }

    if(bai == 10) {

    bai = 0;

    }

    直接得到個十百位的數值,而且完全不使用除法何求餘(要知道這可是微控制器的軟肋)。

    3. 為什麼要在定時器中斷服務程式中重置定時器初值?不能自動重計數嗎?要知道重置定時器初值也是需要指令週期的,直接的結果就是定時不準,累積誤差不可小看。仔細查查微控制器的手冊看如何配置定時器。

    4. 已經啟用了定時器為什麼還要使用阻塞式的延時函式?就算是動態掃描,合理的確定定時器中斷的時長,結合前面提到的標誌變數使用應該也容易完成的。

  • 中秋節和大豐收的關聯?
  • 橡膠錶帶,布藝錶帶,鋼錶帶,皮質錶帶該如何選擇,根據手錶種類有什麼原則?