代碼中註釋爲解釋思路,基於教程中提供的知識步驟(不理解歡迎留言)
# include"reg51.h"
typedef unsigned int u16;
sbit led=P1^0;
void timer0init()
{
TMOD=0X01;//選擇16位定時器,或一下來防止干擾定時器T1的設置(高四位)
TH0=0Xfc;
TL0=0X18; /*初值爲64536,計數1000個溢出,精確計算時間爲1ms
計數夠了纔會溢出去申請中斷,然後就會CPU響應中斷
TF1硬件自動清0,寄存器中定時器T0的8位自動清零*/
ET0=1;
EA=1;
TR0=1; /*爲什麼TMOD = 0X01不用管高四位全是0會不會影響T1的設置,
因爲有TR0,所以也只有T0纔會開啓計數 */
}
void main()
{
timer0init();//滿足中斷條件進入中斷服務函數
while(1);
}
void timer0() interrupt 1 //中斷號爲1
{
static u16 i;/*設置一個靜態局部變量i,初始化i爲0,
然後函數執行完一次會保留上次的值*/
TH0=0Xfc;
TL0=0X18;/*定時器溢出才申請中斷,方式1不能自動重裝載,
所以需要重新設置初值,同時在中斷函數中設置
定時器初值,*/
++i;
if(i==1000)
{
i=0;
led=~led;
} /*函數執行過程:當i不滿足1000時,就會退出中斷服務函數,
但是定時器和CPU是相互獨立並且它是開啓的,所以就會一直計數
(在設定初值基礎上),直到8位溢出再次申請中斷,CPU響應中斷
進入中斷服務函數,之後CPU進入死循環也沒事,因爲滿足中斷條件
響應後,CPU就會轉而去執行中斷服務函數,所以中斷函數被一次次調用
i的值在沒達到1000時不能初始化,需要保存之前的值*/
}