為什麼51微控制器的定時器計時不準確

2022-02-25 22:06:20 字數 3855 閱讀 9312

1樓:我是小靖仔

中斷函式裡面儘量少放語句,如果產生脈衝波形就只放一個

實在要放語句的話,可以增大計數的th0和tl0,頻率低一點輸出的波形會更接近你想設定的值

比如改成:

2樓:

除了在中斷裡執行語句外,最主要的是晶振誤差

3樓:懂事電子設計

中斷裡執行語句了吧,

4樓:0427付強

進入、退出中斷服務函式會有額外的系統開銷,這個過程中的時間如果不計算進去的話肯定引起誤差。

5樓:匿名使用者

用51微控制器的定時器計時,相當是比較準的,但不是十分精確。要想與標準的北京時間對比,肯定是有誤差的,特別是計時的時間越長,誤差就越大,這是累計誤差的結果。

一是微控制器的晶振頻率的誤差,二是定時器計時的誤差,這是主要的。

因平時,用定時器計時,並沒有計時太長的時間,而且也是實驗性的寫程式就完了。

如果真的就想用微控制器計時,並長時間當時鍾計時,必須對定時器的計時誤差進行補償。

產生誤差的主要原因是:雖然按定時計算的時間常數,但是,在微控制器響應中斷時,是需要時間的,從響應中斷,進入中斷服務子程式,到重寫時間常數,再次計時,需要十幾個機器週期的。對於一次中斷,這個時間可以忽略了,但長期計時,累加的誤差就很大了。

補償的 方法是,中斷服務子程式的第一行就要重寫時間常數,再寫其它語句。在中斷重寫時間常數時,低8位的數按計算的值加上8~12,再經過一段時間的計時,對照標準時間比較一下誤差大小,逐步調整。

51微控制器程式定時器怎麼這麼不準確啊,求高手指點!

6樓:匿名使用者

這是編譯器造成的,你最好用debug模式看看生成的彙編**是什麼摸樣,比較一下你那三種方 式給th0和tl0賦的是什麼樣的值。

這是我試驗的結果:

4: th0=-780/256;

c:0x0003 758cfd mov th0(0x8c),#0xfd

5: tl0=-780%256;

c:0x0006 758af4 mov tl0(0x8a),#0xf4

6: th0=-516/256;

c:0x0009 758cfe mov th0(0x8c),#0xfe

7: tl0=-516%256;

c:0x000c 758afc mov tl0(0x8a),#0xfc

8: th0=(65536-516)/256;

c:0x000f 758cfd mov th0(0x8c),#0xfd

9: tl0=(65536-516)%256;

c:0x0012 758afc mov tl0(0x8a),#0xfc

看出差別了吧?使用-780時給t0賦值0xfdf4,使用第三種方式賦值為0xfdfc,這兩個數字相近,所以結果基本正確。但是使用-516時賦值的0xfefc,這差別就大了,結果就是不正確。

一般建議用th0=(65536-516)/256 ;tl0=(65536-516)%256;這種方式,保證不出問題。

7樓:七零後走四方

定時器是從小到大計數的,前2個設定是錯誤的。

另外,定時器中斷處理時有時間開銷,如暫存器入棧。尤其是用c編譯器,額外開銷是不可見的。

學習微控制器、cpld,請到「電子設計網dzsj」

8樓:匿名使用者

每條指令也需要時間呀,當然不是516,而是780很正常,你可以減掉這個誤差值呀,

9樓:匿名使用者

用中斷來做,指令也要佔用時間。輪詢會隨機不確定的。

51微控制器定時器問題,定時不精準,差不多30s就有一秒的誤差,

10樓:匿名使用者

65536-46080=19456個機器週期。

你使用11.0592m,如果微控制器是12t的話,那就是每秒有11059200/12=921600個週期

19456/921600=0.0211111秒再加上你在中斷函式中到th0,tl0賦值的操作,包括,跳轉,關鍵資料入棧,th0,tl0賦值等的時間。

換句話說,你一次中斷大概是0.021120秒接下來,你就自己算吧

11樓:匿名使用者

你這個 設定是 50 ms, 就是 20 次為 1 秒, 要精確計時 定時器中斷 用最高優先順序,

程式 或者 晶振 有問題 一般 用定時器中斷 誤差 很小的 24 小時也不會 差 1 s的。

51微控制器定時器不準是為什麼。晶振12m,程式是定時器中斷定時,

12樓:拜楚安浩嵐

確定你的**沒問題,定時器設定時正確的再考慮其他問題,,如果是晶振不準不會誤差這麼大的

13樓:瞿虹冷明明

12m晶振,每個指令週期是1us,採用方式1定時,那麼定時公式為:

定時時間=(2^16-定時初值)×1us,當初值=0時,最大可以是2^16us=65536us

即一次迴圈最多可以定時65536us,你可以設定多次迴圈,來實現需要的定時時長

proteus與keil 聯調模擬51微控制器計時很不準,為什麼?

14樓:匿名使用者

interrupt 5 是c52微控制器的定時器2中斷

15樓:沁芳蕭然

interrupt 5 :5指中斷型別,在51微控制器沒有,以下51微控制器的為中斷型別。

第0號中斷:外部中斷0

第1號中斷:定時計數器中斷0

第2號中斷:外部中斷1

第3號中斷:定時計數器中斷1

第4號中斷:序列口中斷。

依據你的要求應使用interrupt 1.

using 1表示中斷使用第1組工作暫存器51微控制器有四組(第0組-第3組)工作暫存器(指r0-r8),預設使用第0組工作暫存器。在中斷中指定工作寄存組就無需把第0組工作暫存器壓入堆疊。

至於使用聯調,時間一般是不準確的,一般比實際時間要慢。只要時間計算沒有問題就不用管它了。

你可以不使用聯調,直接載入hex檔案,時間就差不多了。

51微控制器定時器中斷不準確,怎麼解決

16樓:

任何器件都會有偏差,晶振有偏差很正常。不過這顯示出來的偏差也離譜了點。按目前的製造工藝一般的晶振精度都很容易做到數十ppm,偏移到數百ppm要麼是環境太差要麼是器件有問題,或者是測量不準^_^

這個顯示值應該只是軟體根據波特率估算出來的,本身並不嚴格。

如果人類都能感覺到定時器時間不準確了,那問題多半出在軟體方面。

如果真的要求高精度定時,需考慮專用的器件。

17樓:網路無此

如果你這樣要求,任何晶振都達不到你的要求,電腦的晶振也是有誤差的,你檢查一下,你的晶振誤差百分比,是不是可以滿足你的要求。10ms的時間,如果有微秒或納秒級的誤差,應該可以接受吧。當然,你可以在挑選晶振時,儘量選擇誤差小的。

18樓:匿名使用者

你的硬體電路確定完好嗎?從你的問題中我感覺你的硬體是不是存在虛焊啊,造成電路不穩。如果不是的可能是軟體問題,如果c語言定時不準的話,可以試試用組合語言編定時程式,組合語言定時很準的。

依次排除吧,先從硬體開始,沒問題再查軟體。希望這些能對你有幫助。

51微控制器的定時器怎麼做延時51微控制器的定時器怎麼做延時彙編

1 你的主程式必須在1秒內完成一個過程,然後等待下一秒的到來 2 主程式放在一個迴圈內,並回設定答一個標記,以判斷是否觸發執行主程式,還是繼續空迴圈 3 這個標記就由延時中斷例程來賦值 其實,如果你的主程式能夠在1秒內完成,由沒有其他任務的話,完全可以放在中斷例程裡執行的 貌似想到的方法和複雜,就是...

用AT89C51微控制器的定時器0以工作方式2計數,每計數100次,中斷方式將COUNT單元加

include define uchar unsigned charuchar count void t0isr interrupt 1main count equ 30h org 0000h sjmp start org 000bh inc count reti start mov tmod,06...

利用微控制器設計59秒計時器,利用51微控制器,4個數碼管設計一個計時器,要求在數碼管上顯示的資料從0開始每1秒鐘加1。

共陽共陰只是你在選com端時給其高低電平的問題無關大雅我給一段pic微控制器的程式讓你參考一下,如果你看懂的話應該能做出來了 include include 此程式實現計時秒錶功能,時鐘顯示範圍00.00 99.99秒,分辨度 0.01秒 unsigned char s0,s1,s2,s3 定義0....