模板:自動重裝和不自動重載區(qū)別
定時器中斷方式:
跑一遍后溢出,TFx由硬件自動清零了,所以在中斷服務函數(shù)中就不用多此一舉中斷標志位TFx=0了。
我們也不需要在中斷服務函數(shù)里寫TRx=1,因為中斷一開啟只要不另外暫停(TR0=0;),它本身就是像多線程一樣一直在運行。
TMOD=0X01; 對模式的設(shè)置,中斷服務函數(shù)里不用再寫這句話了,這個在主函數(shù)一開始就設(shè)置了,再設(shè)置編譯直接會報錯,認為TMOD是個錯誤變量了。
定時器查詢方式:
我們需要在查詢方式延時函數(shù)里寫TRx=1,因為查詢方式跑一遍后,中斷溢出標志位TFx等于1就停止了,停止就是TRx=0,所以我們要另外重新開啟。并且TFx必須軟件清零,所以在查詢方式的延時函數(shù)中后面就得寫TFx=0了。
而主函數(shù)中因為我們用的不是中斷方式,所以就不需要寫EA=1; ETx=1,TRx=1。
// ------------------------分 隔 符------------------------
自動重載:
定時器中斷方式:
首先得在main函數(shù)中對初值THx和TLx賦值,即初始化(告訴CPU每多久中斷一次)。在中斷服務函數(shù)中不需要另外重新賦初值,因為它滿了會自動重新裝main函數(shù)配置好的初值。
查看代碼
//定時器0初始化
void timer0_Init()
{
TMOD &= 0x0F; //設(shè)置定時器模式 00為16位自動重載 01為16位不自動重載
TH0 = 0xFC; //設(shè)置定時初始值:1毫秒
TL0 = 0x78;
ET0=1;
EA=1;
TR0=1; //上電開跑 啟動定時中斷
}
//定時器0中斷服務函數(shù)
void timer0_Server()interrupt 3
{
//進入中斷服務后執(zhí)行的動作 一般建議不要太長,因為中斷本來就是為了實時響應。如果代碼語句超過本身中斷時間,就一直困在中斷了。
// e.g:我經(jīng)常用定時器用來實時掃描按鍵的狀態(tài)
keyProc(); //自己寫的按鍵處理函數(shù)
}
//main
void main()
{
timer0_Init();
while(1)
{
//動作代碼
}
}
定時查詢方式:
不需要在main函數(shù)中對初值THx和TLx賦值,即初始化。直接在所用到的查詢方式的延時函數(shù)中賦初值就好了,調(diào)用延時函數(shù)時候就裝一次。
示例代碼1:
查看代碼
//定時器0初始化
void timer0_Init()
{
TMOD &= 0x0F; //設(shè)置定時器模式 00為16位自動重載 01為16位不自動重載
}
//延時函數(shù):定時器0查詢方式
void delayMs(unsigned int xms)
{
xms=xms/5; //減少外循環(huán)次數(shù),增加程序運行效率
while(xms--)
{
TH0 = 0xEC; //設(shè)置定時初始值:5ms
TL0 = 0x78;
TR0=1; //溢出標志位為1后,TR也為0了,所以需要重新開啟
while(!TF0); //到了5ms后 溢出標志位TF0就等于1
TF0=0; //所以為了下次又能調(diào)用 這里就要對溢出標志位清0
}
}
//main
void main()
{
timer0_Init();
while(1)
{
//動作代碼
delayMs(); //調(diào)用延時函數(shù)
}
}
示例代碼2:
查看代碼
//延時函數(shù):定時器0查詢方式
void delayMs(unsigned int xms)
{
xms=xms/5; //減少外循環(huán)次數(shù),增加程序運行效率
TMOD &= 0x0F; //設(shè)置定時器模式 00為16位自動重載 01為16位不自動重載
while(xms--)
{
TH0 = 0xEC; //設(shè)置定時初始值:5ms
TL0 = 0x78;
TR0=1; //溢出標志位為1后,TR也為0了,所以需要重新開啟
while(!TF0); //到了5ms后 溢出標志位TF0就等于1
TF0=0; //所以為了下次又能調(diào)用 這里就要對溢出標志位清0
}
}
//main
void main()
{
while(1)
{
//動作代碼
delayMs(); //調(diào)用延時函數(shù)
}
}
不自動重載:
定時器中斷方式:
首先得在main函數(shù)中對初值THx和TLx賦值,即初始化。在中斷服務函數(shù)中也需要另外重新賦初值,因為01不自動重載模式 它滿了不會自動重新裝main函數(shù)配置好的初值。
查看代碼
//定時器0初始化
void timer0_Init()
{
TMOD &= 0x01; //設(shè)置定時器模式 00為16位自動重載 01為16位不自動重載
TH0 = 0xFC; //設(shè)置定時初始值:1毫秒
TL0 = 0x78;
ET0=1;
EA=1;
TR0=1; //上電開跑 啟動定時中斷
}
//定時器0中斷服務函數(shù)
void timer0_Server()interrupt 3
{
TH0 = 0xFC; //設(shè)置定時初始值:1毫秒
TL0 = 0x78;
//進入中斷服務后執(zhí)行的動作 一般建議不要太長,因為中斷本來就是為了實時響應。如果代碼語句超過本身中斷時間,就一直困在中斷了。
// e.g:我經(jīng)常用定時器用來實時掃描按鍵的狀態(tài)
keyProc(); //自己寫的按鍵處理函數(shù)
}
//main
void main()
{
timer0_Init();
while(1)
{
//動作代碼
}
}
定時查詢方式:
首先需要在main函數(shù)中對初值THx和TLx賦值,即初始化。然后直接在所用到的查詢方式的延時函數(shù)中也是需要重新賦初值的,因為你一旦調(diào)用了一次,初值就沒了。
示例代碼1:
查看代碼
//定時器0初始化
void timer0_Init()
{
TMOD &= 0x01; //設(shè)置定時器模式 00為16位自動重載 01為16位不自動重載
}
//延時函數(shù):定時器0查詢方式
void delayMs(unsigned int xms)
{
xms=xms/5; //減少外循環(huán)次數(shù),增加程序運行效率
while(xms--)
{
TH0 = 0xEC; //設(shè)置定時初始值:5ms
TL0 = 0x78;
TR0=1; //溢出標志位為1后,TR也為0了,所以需要重新開啟
while(!TF0); //到了5ms后 溢出標志位TF0就等于1
TF0=0; //所以為了下次又能調(diào)用 這里就要對溢出標志位清0
}
}
//main
void main()
{
timer0_Init();
while(1)
{
//動作代碼
delayMs(); //調(diào)用延時函數(shù)
}
}
示例代碼2:
查看代碼
//延時函數(shù):定時器0查詢方式
void delayMs(unsigned int xms)
{
xms=xms/5; //減少外循環(huán)次數(shù),增加程序運行效率
TMOD &= 0x01; //設(shè)置定時器模式 00為16位自動重載 01為16位不自動重載
while(xms--)
{
TH0 = 0xEC; //設(shè)置定時初始值:5ms
TL0 = 0x78;
TR0=1; //溢出標志位為1后,TR也為0了,所以需要重新開啟
while(!TF0); //到了5ms后 溢出標志位TF0就等于1
TF0=0; //所以為了下次又能調(diào)用 這里就要對溢出標志位清0
}
}
//main
void main()
{
while(1)
{
//動作代碼
delayMs(); //調(diào)用延時函數(shù)
}
}

浙公網(wǎng)安備 33010602011771號