![]() |
發布時間: 2020-6-24 18:34
正文摘要:要求:開機后,P2.0控制的LED燈閃爍6次,閃爍間隔為500ms;閃爍結束后P4.7控制的LED燈常亮。 程序: #include<reg52.h> sbit LED=P2^0; void delay(int i) { w ... |
你們51單片機度不用用while(1)卡程序的嗎 |
程序結束后跑飛了,然后自動自復位 |
我認為是超出單片機看門狗定時器時間造成的,如果你用的是STC單片機,建議在循環體中加喂狗就不會每次超時而重啟,這樣也就看出一直跳不出來,其實它已在一定時間后就重啟了 |
不要讓a初始化0,初始化放到for外邊, |
程序原則上沒有問題,但是最好加上while(1),然后自己設置停止點,不要讓程序走出main 函數。如果是軟件程序走出 main 就結束了。單片機很有可能會復位或者其他的原因再次進來。 |
限制循環的地方,不然一直跑就一直閃 |
要習慣性的寫個while(1)。有內容要循環的,就寫進while(1)循環里,沒有要循環的,就在最后寫個while(1). |
這不明擺著嗎,跳出for循環后又進去了啊,你又沒加限制,main函數會一直循環執行。 |
程序本身沒有問題,看了說加while(1);的處理方法,是一種答案。但原則上沒有while(1),程序也是執行到main的最后一個}結束。 |
設置斷點 調試一下代碼看看 |
#include<reg52.h> sbit LED=P2^0; void delay(int i) { while(i--); } void main() { int a; for(a=0;a<12;a++) { LED=~LED; delay(50000); } LED=0; while(1) { } } 加while(1),實測有效。 |
應該是沒有while(1)導致程序跑飛 |
為什么不跟蹤一下呢?將斷點設在LED=0處,看程序有沒有跳出for循環 |
應該是沒有while(1)導致程序跑飛,建議改成這樣 void main() { int a; for(a=0;a<12;a++) { LED=~LED; delay(50000); } while(1) { LED=0; } } |
我覺得程序是沒問題的,但是可能仿真軟件哪里有問題,你可以給程序里面加一個if(a==11)break;試試 |
這段代碼中有一個最大的問題是沒有主循環體,沒有while循環體,而直接是main函數,有一種可能性就是函數執行完一次后,回到開頭,重新執行,這就造成了一直閃爍 |
加入while,防止程序跑飛, |
main 函數一直在執行。led燈會一直閃爍。 |
void main() { int a; for(a=0;a<12;a++) { LED=~LED; delay(50000); } LED=0; while(1); } |