單片機 for 語句的問題
兩種循環,延時時間確實是不一樣的,測試程序和測試結果如下:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
//--------------------------------------
void main(void)
{
uint i; uchar j;
while(1) { //主循環
//--------------------------------------
P2 = 0x00;
for(i = 1000; i > 0; i--) for(j = 100; j > 0; j--);//實測 209005T
//--------------------------------------
P2 = 0xff;
for(i = 0; i < 1000; i++) for(j = 0; j < 100; j++);//實測 324013T
//--------------------------------------
}
}
分別是 209005T 和 324013T,應該是編譯成機器語言后,代碼有所不同所至。
按照樓主給出的形式,寫成兩個子函數,時間相差更大,長的竟達 413019T !
控制LED閃爍,324013T 的,亮暗的時間間隔稍長,可以看出來;
209005T 的,亮暗的時間間隔短,看起來就是常亮。
一個單片機的for語句的簡單延時程序
你的延時程序從語法來說是沒有問題的,但是在實際應用中就應該考慮實際問題。
我具體幫你分析一下;看你包含的頭文件,你應該是用的51內核的單片機,假設你用的是12M的晶振好了,一個機器周期等于12個時鐘周期,那么就是1MHZ的頻率,你的延時程序增加一個數如果我沒記錯的話是雙周期指令,那么就是0.5MHZ,你增加100次,那么就是5KHZ,燈閃的太快了,也就是說你的燈亮與滅之間的間隔是0.2ms,人的眼睛是無法分辨那么快的變化的,所以你看上去就一直是亮的,其實我們日常生活中的日光燈也不是一直亮的,他是以50HZ的頻率閃爍著的,但是你看上去他是一直亮著的,一樣的道理。解決辦法是延長延時時間就可以了。
以上只是定性的分析,具體計算可能不是那么準,但是結果和原因的分析都是沒問題的。