C51定時(shí)器計(jì)算工具
◆測(cè)試代碼:
#include
void main(void)
{
TMOD = 0x01;//定時(shí)器T0 工作方式1 16位定時(shí)
TH0=0x3c;//50ms65536-50000us
TL0=0xb0;
ET0 = 1;//允許定時(shí)器T0中斷
EA = 1;//開啟總中斷
斷點(diǎn):TR0 = 1;//啟動(dòng)定時(shí)器,可以隨便放置^_^ TMOD←→while(1)
while(1);//無限循環(huán)………………
}
void intsert0(void) interrupt 1 using 0//T0中斷服務(wù)程序
{
TH0=0x3c;//50ms65536-50000us
TL0=0xb0;//軟件重新裝載!!!
{
斷點(diǎn):P0=0x00;//可以處理其他程序卻不影響定時(shí)器計(jì)時(shí)工作!!!
P1=0x00;
P2=0x00;
P3=0x00;
………… //代碼隨便寫,處理時(shí)間不超過定時(shí)時(shí)間就OK啦!
}
}
◆實(shí)驗(yàn)數(shù)據(jù)記錄
TH0/TL0=3cb0T0 16-bit
0.000 397 00
0.050 406 000.050 009 00
0.100 412 000.050 006 00
0.150 418 000.050 006 00
0.200 424 000.050 006 00
50 000+2+2+2=50 006
◆產(chǎn)生的匯編代碼:
; FUNCTION main (BEGIN)
0000 758901 MOV TMOD,#01H
0003 758C3C MOV TH0,#03CH
0006 758AB0 MOV TL0,#0B0H
0009 D2A9 SETB ET0
000B D2AF SETB EA
000D D28C SETB TR01'
000F ?C0001:
000F 80FE SJMP ?C0001
; FUNCTION main (END)
; FUNCTION intsert0 (BEGIN)
0000 758C3C MOV TH0,#03CH2'
0003 758AB0 MOV TL0,#0B0H2'
0006 758000 MOV P0,#00H
0009 759000 MOV P1,#00H
000C 75A000 MOV P2,#00H
000F 75B000 MOV P3,#00H
0012 32 RETI 2'
; FUNCTION intsert0 (END)
◆實(shí)驗(yàn)結(jié)論推測(cè):
假設(shè)要定時(shí)的時(shí)間為: 50000us 即50ms
則定時(shí)器初始值為: 65536+6-50000=15542(15542)d→(3cb6)h
◆推測(cè)論證:
TH0/TL0=3cb6T0 16-bit
0.000 397 00
0.050 400 00 0.050 003 00
0.100 400 000.050 000 00
0.150 400 000.050 000 00
0.200 400 000.050 000 00OK!推測(cè)正確!
◆實(shí)驗(yàn)總結(jié):
T0 工作方式1 16-bit定時(shí)器fosc=12MHz
設(shè)要定時(shí)的時(shí)間為: T
則定時(shí)器初始值為: 65536+6-T
【即定時(shí)器初始值為:: 65542-T】
定時(shí)器初始值計(jì)算方法:
TH = (2^n+6-T*fosc/12)/256//(2^n+6-T*fosc/12)<<8
TL = (2^n+6-T*fosc/12)%256//(2^n+6-T*fosc/12)&0xff
若定時(shí)器工作方式為0n=13TH全8位;TL低5位,高3位為0,沒有使用
若定時(shí)器工作方式為1n=16
若定時(shí)器工作方式為2n=8
若定時(shí)器工作方式為3n=8
//以上內(nèi)容僅供參考~