51單片機定時時間如何校正?
想寫個準確的 定時程序,可是走走走時間會有誤差.請教高手指點.
全部回復(9)
正序查看
倒序查看
2496441207996329.rar
送你一個軟件,51 定時器定時設(shè)定軟件,很好用的!
送你一個軟件,51 定時器定時設(shè)定軟件,很好用的!
0
回復
@水石頭草
多謝,我就是不清楚:“響應定時中斷,重寫定時數(shù)前,要讀出定時器中的數(shù)”這句話的意思,請大師解釋詳細點.
51系列的定時器作為16位使用時,定時數(shù)據(jù)不會自動寫入,要編段程序來寫.
有段時間沒干這個了,印象中是加一計數(shù),就是一直加到0000H發(fā)出中斷信號.
比如假設(shè)你每次定時的數(shù)據(jù)是20000,重寫入的數(shù)就是65536-20000,這就是你每次響應定時器中斷要重寫入定時器的數(shù).因為只能兩個八位分別寫入,這45536要轉(zhuǎn)換成16進制的高低兩個字節(jié).
定時器發(fā)出中斷后還繼續(xù)在加一,也許到你響應中斷時已經(jīng)加到了000CH,那么你就讀出這個0CH加到45536的低字節(jié)上(對于你的20000來說就是減),再寫入定時器.當然這要保證你響應中斷不會太遲,如果有可能太遲定時器計數(shù)可能進位到高字節(jié),這樣就要把高低字節(jié)都讀出加到45536上.
有段時間沒干這個了,印象中是加一計數(shù),就是一直加到0000H發(fā)出中斷信號.
比如假設(shè)你每次定時的數(shù)據(jù)是20000,重寫入的數(shù)就是65536-20000,這就是你每次響應定時器中斷要重寫入定時器的數(shù).因為只能兩個八位分別寫入,這45536要轉(zhuǎn)換成16進制的高低兩個字節(jié).
定時器發(fā)出中斷后還繼續(xù)在加一,也許到你響應中斷時已經(jīng)加到了000CH,那么你就讀出這個0CH加到45536的低字節(jié)上(對于你的20000來說就是減),再寫入定時器.當然這要保證你響應中斷不會太遲,如果有可能太遲定時器計數(shù)可能進位到高字節(jié),這樣就要把高低字節(jié)都讀出加到45536上.
0
回復
@njyd
51系列的定時器作為16位使用時,定時數(shù)據(jù)不會自動寫入,要編段程序來寫.有段時間沒干這個了,印象中是加一計數(shù),就是一直加到0000H發(fā)出中斷信號.比如假設(shè)你每次定時的數(shù)據(jù)是20000,重寫入的數(shù)就是65536-20000,這就是你每次響應定時器中斷要重寫入定時器的數(shù).因為只能兩個八位分別寫入,這45536要轉(zhuǎn)換成16進制的高低兩個字節(jié). 定時器發(fā)出中斷后還繼續(xù)在加一,也許到你響應中斷時已經(jīng)加到了000CH,那么你就讀出這個0CH加到45536的低字節(jié)上(對于你的20000來說就是減),再寫入定時器.當然這要保證你響應中斷不會太遲,如果有可能太遲定時器計數(shù)可能進位到高字節(jié),這樣就要把高低字節(jié)都讀出加到45536上.
老大能不能舉個例,寫個小程序說明一下呢?
0
回復
@水石頭草
老大能不能舉個例,寫個小程序說明一下呢?
XX: PUSH PSW ;計時中斷
MOV PSW,#8 ;設(shè)置工作寄存器1區(qū)
PUSH ACC
CLR TR0 ;停止定時器計數(shù),以防止操作過程中定時器低位向高位進位.
MOV A,#DSL ;讀出定時數(shù)據(jù)低八位
ADD A,TL0 ;加上定時器中低八位數(shù)據(jù)
MOV TL0,A ;寫入定時器低八位
MOV A,#DSH ;讀出定時數(shù)據(jù)高八位
ADDC A,TH0 ;加上定時器中低八位數(shù)據(jù),帶低八位相加后的進位
MOV TH0,A ;重置定時數(shù)高八位
SETB TR0 ;重啟定時器計數(shù)
……
……
RETI
因這這段操作也要占用時間,但只要把定時器中斷定為最高級,這段時間是固定的,只要調(diào)整一下計算所得的定時數(shù)據(jù)就行了.
用51的定時器計時精度還是有限的,取決于晶振頻率,頻率越低精度越差,但用此方法可以在此限制下最大限度地提高計時精度.
MOV PSW,#8 ;設(shè)置工作寄存器1區(qū)
PUSH ACC
CLR TR0 ;停止定時器計數(shù),以防止操作過程中定時器低位向高位進位.
MOV A,#DSL ;讀出定時數(shù)據(jù)低八位
ADD A,TL0 ;加上定時器中低八位數(shù)據(jù)
MOV TL0,A ;寫入定時器低八位
MOV A,#DSH ;讀出定時數(shù)據(jù)高八位
ADDC A,TH0 ;加上定時器中低八位數(shù)據(jù),帶低八位相加后的進位
MOV TH0,A ;重置定時數(shù)高八位
SETB TR0 ;重啟定時器計數(shù)
……
……
RETI
因這這段操作也要占用時間,但只要把定時器中斷定為最高級,這段時間是固定的,只要調(diào)整一下計算所得的定時數(shù)據(jù)就行了.
用51的定時器計時精度還是有限的,取決于晶振頻率,頻率越低精度越差,但用此方法可以在此限制下最大限度地提高計時精度.
0
回復
@njyd
XX: PUSHPSW ;計時中斷 MOVPSW,#8 ;設(shè)置工作寄存器1區(qū) PUSHACC CLRTR0 ;停止定時器計數(shù),以防止操作過程中定時器低位向高位進位. MOVA,#DSL ;讀出定時數(shù)據(jù)低八位 ADDA,TL0 ;加上定時器中低八位數(shù)據(jù) MOVTL0,A ;寫入定時器低八位 MOVA,#DSH ;讀出定時數(shù)據(jù)高八位 ADDCA,TH0 ;加上定時器中低八位數(shù)據(jù),帶低八位相加后的進位 MOVTH0,A ;重置定時數(shù)高八位 SETBTR0 ;重啟定時器計數(shù) …… …… RETI 因這這段操作也要占用時間,但只要把定時器中斷定為最高級,這段時間是固定的,只要調(diào)整一下計算所得的定時數(shù)據(jù)就行了. 用51的定時器計時精度還是有限的,取決于晶振頻率,頻率越低精度越差,但用此方法可以在此限制下最大限度地提高計時精度.
頂,終于能吃透,多謝大蝦們.多謝.
0
回復