ps:P0口接八位LED管,低電平點燈;
程序1:
#include<reg52.h>
sbit D1=P0^0;
void delay_while_s(unsigned int ns)
{while(ns)
{unsigned int i=51177;
while(i--);
ns--;}
}
void main()
{
delay_while_s(1);
D1=0;
delay_while_s(1);
}
程序2:
#include<reg52.h>
sbit D1=P0^0;
void delay_for_ms(unsigned int xms)
{unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
delay_for_ms(500);
D1=0;
delay_for_ms(500);
}
現象如下:程序一燒錄51單片機中,led1管每1s鐘亮滅循環(即一直循環閃爍);
而程序二中,則先滅后亮,不閃爍,點亮后一直保持點亮狀態;
從上述程序中可以看出for,和while語句都是作為延時功能作用,為什么會發生兩種不同的現象?
望高手解答下~本人不勝感激。。
換成這樣當然肯定跟第二個效果一樣了~
主要問這個不是為結果,只是想知道為什么會產生這樣的區別;
似乎是跟編譯器轉化成匯編的方式有關。。
我經過單步觀察是第一個經過一次程序的運行,單片機內部中斷返回時無程序繼續操作產生錯誤,因為單片機不會停止工作,所以遇到這種錯誤無法執行就選擇復位,故而沒有D1=1;也能閃爍(復位上電各引腳都是高電平的)
而用for的那句延時在執行完一遍之后還能返回至程序的開頭即void后重新開始,因而單片機不產生復位操作,D1=0也就一直保持下去。。
但總覺得疑惑,為什么單片機用while會使程序發生錯誤而導致上電復位操作。。
| 歡迎光臨 (http://m.raoushi.com/bbs/) | Powered by Discuz! X3.1 |