昨天寫的比較匆忙,出現了一些錯誤,感謝幾位朋友的指正。這其中也有我了解不夠透徹的地方,幸好及時暴露了自己的盲點,不然還會繼續犯錯。 好了,繼續今天的內容。 這次說定時與中斷,有人說,掌握了定時與中斷,就掌握了一個單片機80%的功能;也有人說,中斷是一個單片機的靈魂。這兩句話無一不在強調中斷的重要性,就讓我們認識一下,中斷到底是什么。 根據百度百科的定義:指當出現需要時,CPU暫時停止當前程序的執行轉而執行處理新情況的程序和執行過程。即在程序運行過程中,系統出現了一個必須由CPU立即處理的情況,此時,CPU暫時中止程序的執行轉而處理這個新的情況的過程就叫做中斷。 舉個例子,我正在吃飯呢,忽然老婆大人發話了,說在網上看上一個包,挺好的,讓我幫著付款,于是我停下吃飯說好,去幫著付款,付完款,繼續吃飯。 這個過程中,我是CPU;吃飯是主程序;老婆大人說話,觸發了中斷;我說好,安慰了老婆的情緒同時清零了中斷標志;去付款,處理了中斷子程序;付完款繼續吃飯,回到了主程序。 STC89C52RC單片機中的中斷分為三種:外部中斷,一般是IO口的高低電平觸發;定時/計數器溢出中斷,一般是內部定時/計數器溢出中斷;UART口中斷,收發數據時引發的中斷。這次只說定時/計數器溢出中斷。 程序如下:
/**********************51單片機學習例程***********************
* 平臺:Keil U4 + STC89C52
* 名稱:LED閃爍
* 晶體:11.0592MHZ
******************************************************************/
#include <reg52.h>
sbit led=P1^0;
/****************************************************
*
* 延時子函數
*
*****************************************************/
void delay(unsigned int i)
{
unsigned int j;
unsigned char k;
for(j=i;j>0;j--) //把i賦值給j,然后進行判斷,當j大于0時,j減一,重復判斷,一直到符合條件為止
for(k=125;k>0;k--); //首先賦值125給k,然后進行判斷,當k大于0時,k減一,重復判斷,一直到符合條件為止
}
/****************************************************
*
* 主函數,在死循環中實現LED閃爍
*
*****************************************************/
int main()
{
while(1)
{
led=~led; //每隔一段時間即對輸出取反。
delay(3000); //閃爍間隔。間隔約為0.85S
}
return(0);
}
下載驗證,OK! 今天要出差,簡單寫一下,回來后再豐滿一下。 源碼如下:
LED延時閃爍.zip
(20.83 KB, 下載次數: 36)
2015-3-20 23:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|