導航:首頁 > 操作系統 > 單片機1毫秒定時不準確

單片機1毫秒定時不準確

發布時間:2022-07-12 11:37:24

1. 51單片機定時器初值用變數設置定時不準確,為什麼,求高手。TH0=(65536-X)/256,TL0=(65536-X)%256

看一下C代碼編譯後的匯編代碼就知道了,用變數方式很耗時,而直接用數字,編譯器已經將算式的值算好了,代碼里就是一個MOV指令而已,只需1us!!!
TH0=(65536-2000)/256; TL0=(65536-2000)%256;

匯編後,只要2us就完事了。 而用變數方式,單片機很忙,計算幾十乃至上百微妙才完事!
15: TH0=(65536-a)/256;
C:0x0190 AE09 MOV R6,a(0x09)
C:0x0192 AF0A MOV R7,0x0A
C:0x0194 AB07 MOV R3,0x07
C:0x0196 AA06 MOV R2,0x06
C:0x0198 E4 CLR A
C:0x0199 C3 CLR C
C:0x019A 9B SUBB A,R3
C:0x019B FF MOV R7,A
C:0x019C E4 CLR A
C:0x019D 9A SUBB A,R2
C:0x019E FE MOV R6,A
C:0x019F 7401 MOV A,#0x01
C:0x01A1 9400 SUBB A,#0x00
C:0x01A3 FD MOV R5,A
C:0x01A4 E4 CLR A
C:0x01A5 9400 SUBB A,#0x00
C:0x01A7 FC MOV R4,A
C:0x01A8 E4 CLR A
C:0x01A9 FB MOV R3,A
C:0x01AA 7A01 MOV R2,#0x01
C:0x01AC F9 MOV R1,A
C:0x01AD F8 MOV R0,A
C:0x01AE 1201EA LCALL C?SLDIV(C:01EA)
C:0x01B1 8F8C MOV TH0(0x8C),R7
16: TL0=(65536-a)%256;
C:0x01B3 AE09 MOV R6,a(0x09)
C:0x01B5 AF0A MOV R7,0x0A
C:0x01B7 AB07 MOV R3,0x07
C:0x01B9 AA06 MOV R2,0x06
C:0x01BB E4 CLR A
C:0x01BC C3 CLR C
C:0x01BD 9B SUBB A,R3
C:0x01BE FF MOV R7,A
C:0x01BF E4 CLR A
C:0x01C0 9A SUBB A,R2
C:0x01C1 FE MOV R6,A
C:0x01C2 7401 MOV A,#0x01
C:0x01C4 9400 SUBB A,#0x00
C:0x01C6 FD MOV R5,A
C:0x01C7 E4 CLR A
C:0x01C8 9400 SUBB A,#0x00
C:0x01CA FC MOV R4,A
C:0x01CB E4 CLR A
C:0x01CC FB MOV R3,A
C:0x01CD 7A01 MOV R2,#0x01
C:0x01CF F9 MOV R1,A
C:0x01D0 F8 MOV R0,A
C:0x01D1 1201EA LCALL C?SLDIV(C:01EA)
C:0x01D4 AF03 MOV R7,0x03
C:0x01D6 8F8A MOV TL0(0x8A),R7
17: TH1=(65536-1000)/256;
C:0x01D8 758DFC MOV TH1(0x8D),#0xFC
18: TL1=(65536-1000)%256;
C:0x01DB 758B18 MOV TL1(0x8B),#0x18

2. 單片機高手給點撥下,定時器這個不太理解,定時器初始化有幾種方法啊比如說定時1毫秒

51 單片機中定時器,是個 16 位的加法計數器。
其內容是 0000H ~ FFFFH,即:0 ~ 65535。
每隔一個機器周期,加一次一。加到 65536,就會溢出,產生中斷。

在外部振盪器頻率 = 11.0592 MHz 時,機器周期=1085.06944...us。
要想定時 1000us,這就有點困難了。

在外部振盪器頻率 = 12 MHz 時,機器周期=1us。
要想定時 1000us,就可以設初始值為:65536 - 1000 = 64536。

分成高、低八位後,寫入 THx、TLx,即可。

求出:初始值、分成高低八位,可以人工計算,那麼,程序就是:
TH1 = 0XFC;
TL0 = 0X67;
也可以由編譯軟體來算,程序中,寫出公式,這就是:
TH0 = (65535 - 1000)/256;
TL0 = (65535 - 1000)%256;
-------
又因為,中斷響應,是不會及時發生的,通常,都會遲到 3 ~ 8 個機器周期。
用 C 語言編程,會耽誤更多吧。
所以,定時時間,應該縮短一些,定時才准確。
因此,才有+ 28 的演算法

加上這個數之後,初始值,就大了一些,更接近 65536,定時時間,就短了。
這是個經驗數據。

3. 單片機:用計時器給LCD計時間每一秒可能都會多個幾毫秒,要怎麼能減小這種誤差

千分之幾的誤差,用定時器計時的這種方法誤差很難消,
實在想消的話,可以用下面幾種法子試試:
1. 挑選晶振,晶振頻率有差,挑選個頻率高一點的。

2. 調大計數器的初值,然後在中斷服務 子程序中讓計數器停止計數、馬上再啟動計數,目的是微微調整定時的周期。

兩種方法都較難調好,要慢慢試,最好改其它定時法。比如用1302等晶元

4. 51單片機查詢法設置初值為1ms的時候查詢不準確

你液晶刷新的時間就超過1毫秒了,所以這樣的程序結構並沒有意義,查詢法最大的弊病也在於此,當你有空查詢標志的時候,殊不知已物是人非……所以查詢法只能自己勤盯著,不要給意外以可乘之機

5. 51單片機中用定時器定時1毫秒,怎麼編寫

假設晶振為12MHz,不用中斷時程序語句如下:
TMOD=0x01;//定時器0工作方式1
TH0=(65536-1000)/256;//裝入初值
TL0=(65536-1000)%256;
TF0=0;//清溢出標志;
TR0=1;//啟動定時器0
while(TF0==0);//等待定時時間到
TR0=0;
TF0=0;

6. 單片機定時器做的時鍾,定時不準。

單片機定時器做時鍾,確切的說在環境溫度變化不大的前提下,可以調整的很准,畢竟它是基於MHz級的晶振的,提兩點建議,1】建議使用12MHz晶振;2】請注意對於不同的編程,定時器賦值時,如果需要50ms定時則絕不一定是賦值50000,也不一定是循環20次就是1S;你琢磨下這里的道理,你就明白了,具體方法是,找一個比較準的時鍾,比如在線時鍾,每10小時記錄一次找出規律,細細調整,畢竟它是在微秒范圍內進行調整,你肯定行的,祝成功。

7. 為什麼51單片機的定時器計時不準確

中斷函數裡面盡量少放語句,如果產生脈沖波形就只放一個

8. 51單片機定時器問題,定時不精準,差不多30s就有一秒的誤差,

65536-46080=19456個機器周期。
你使用11.0592M,如果單片機是12T的話,那就是每秒有11059200/12=921600個周期
19456/921600=0.0211111秒
再加上你在中斷函數中到TH0,TL0賦值的操作,包括,跳轉,關鍵數據入棧,TH0,TL0賦值等的時間。
換句話說,你一次中斷大概是0.021120秒
接下來,你就自己算吧

閱讀全文

與單片機1毫秒定時不準確相關的資料

熱點內容
解壓文件密碼怎樣重新設置手機 瀏覽:999
高考指南pdf 瀏覽:693
爬蟲python數據存儲 瀏覽:240
u盤怎麼取消加密 瀏覽:429
567除以98的簡便演算法 瀏覽:340
pdf手機如何解壓 瀏覽:15
python描述器 瀏覽:60
戰地聯盟3解壓密碼 瀏覽:805
s型命令 瀏覽:25
php年薪5年 瀏覽:71
如何上網上設個人加密賬戶 瀏覽:44
linux打開ssh服務 瀏覽:78
微信位置可以加密嗎 瀏覽:470
演算法蠻力法 瀏覽:438
隨機排練命令 瀏覽:147
python多進程並發 瀏覽:41
安卓軟體安裝如何躲避安全檢測 瀏覽:647
奇幻潮翡翠台源碼百度雲盤 瀏覽:187
什麼軟體可以免費pdf轉word 瀏覽:15
php正則表達式大全 瀏覽:395