879c51 keil c delay

我想讓P1閃1秒後就暗下來接著P2閃1秒就暗下來查了網上許多DELAY寫法但燒入後經過測式,發覺燈都亂跳,連沒使用到的燈也會動作我程式碼如下#include unsigned char idata LedCycle; //program start from main() while power on void DELAY(unsigned int uiDelay){ unsigned int uiTemp = 3; while( uiTemp-- ) while( uiDelay-- ); }void main(){P1_0=1;DELAY(1000);P1_0=0;DELAY(1000);P1_3=1;DELAY(1000);P1_3=0;DELAY(1000);P1_3=1;DELAY(1000);P1_3=0;DELAY(1000);P1_7=1;DELAY(1000);P1_7=0;DELAY(1000);P1_7=1;DELAY(1000);P1_7=0;DELAY(1000);}不知哪邊錯,是否有更好DELAY的寫法謝謝

2 個解答

評分
  • 9 年前
    最佳解答

    Delay 跟 Clock 是相依的,

    而 眼睛看 跟 電路量測又是 有根本上的差別

    你至少要考慮 眼睛看到的基本條件

    1. LED 要"亮"夠久, 人眼才看的到

    2. 亮滅間閣要夠大, 看起來 才會是 閃爍, 間隔太小, 就會變成 平均亮度,

    好像 不太亮的燈一般

    所以沒有好寫法, 只有適合的寫法....

    1. 可以用 Timer 來計時, 準確度 較高

    2. 用軟體延時, 每次重新編譯可能會有些許不同需要注意

    3. 盡量用 倒數, ( 因為會自動轉為 DJNZ, 比較一致)

    C 語言 for( i=100; i>0 ; i--);

    組語 ---> mov r0, #100

    ---> djnz r0, $

    一般開始實驗時, 延時最好設久一些, 寧可等一下, 對了再改短

  • 9 年前

    雖然不知道您的 Clock 是多少,但乍看之下 Delay 似乎太短。

    請試著將:

    unsigned int uiTemp = 3;

    改為 300 (甚至 3000) 試試看。

還有問題?馬上發問,尋求解答。