1樓:匿名使用者
tmod=0x01;
65536-50)%6;
改為tmod=0x11;
65536-50)%256;
只有程式沒有電路原理很難找錯誤
2樓:匿名使用者
可以同時執行兩個定時器
51微控制器程式定時器怎麼這麼不準確啊,求高手指點!
3樓:匿名使用者
這是編譯器造成的,你最好用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;這種方式,保證不出問題。
4樓:七零後走四方
定時器是從小到大計數的,前2個設定是錯誤的。
另外,定時器中斷處理時有時間開銷,如暫存器入棧。尤其是用c編譯器,額外開銷是不可見的。
學習微控制器、cpld,請到「電子設計網dzsj」
5樓:匿名使用者
每條指令也需要時間呀,當然不是516,而是780很正常,你可以減掉這個誤差值呀,
6樓:匿名使用者
用中斷來做,指令也要佔用時間。輪詢會隨機不確定的。
51微控制器,定時器每20ms進中斷,中斷裡執行100ms軟體延時函式,當100ms延時函式執行20
7樓:匿名使用者
首先,你這麼做不科學。
不應在中斷裡進行延時。
回答你的問題,
「定時中斷中執行20ms後應該再次進定時中斷」,在51中,不是這樣的。51內部有記錄中斷服務級別的標誌,每個中斷優先順序有一個標誌,這個標誌使用者程式是看不到的。進行中斷後,對應優先順序的中斷服務狀態標誌自動被置位,同級別的中斷都不再響應,也就是說,定時中斷不會再次進定時中斷,執行reti指令後,這個標誌自動被複位,同級別的中斷才會繼續響應。
假設不是51系統,比如arm,進入中斷後,可以手動允許同級別的中斷繼續響應,這時再次中斷後是延時100ms還是80ms,取決於你的延時程式。如果延時程式的變數是建立在棧上的區域性變數,每次呼叫delay,都會一組新的變數,也就是說,延時每次都是100ms。如果是用的靜態變數,或者全域性變數,則有可能,只延時80ms。
請高手幫忙,51微控制器執行定時器0的中斷程式後,需要大約15秒才能返回主程式斷點處繼續執行? 太奇怪了?
8樓:匿名使用者
不是幾個週期,你在服務程式中有3個延時子程式呼叫,每一個延時如果是12m晶振的話,大約390毫秒,所以返回時間理論上約1.2秒左右。
9樓:匿名使用者
不明白定時中斷子程式裡為什麼要關掉tr0,關掉下次就進不去了。
d0:clr tr0 ;????????????...
10樓:
彙編我有好幾年沒看,看到生疏,或許看錯了,
你的主程式執行完了就等待了,你怎麼檢測它返回主程式了,你在等待這裡做異個訊號出來(可以把中段中的p1.7置0以後延時一下,在主程式等待這裡他把重新置1看看)
看p1.7下降沿,到上升沿的時候歷時多久
51微控制器中TCON定時器控制暫存器的位描述
tcon的作用是控制定時器的啟 停,標誌定時器溢位和中斷情況。tcon的格式如下圖所示。其 回中答,tf1,tr1,tf0和tr0位用於定時器 計數器 ie1,it1,ie0和it0位用於中斷系統。各位定義如下 tf1 定時器1溢位標誌位。當定時器1計滿溢位時,由硬體使tf1置 1 並且申請中斷。進...
51微控制器是如何產生PWM波的。。用定時器中斷如何實現
1 設定一個 io 輸出口dao作為 pwm 輸出2 設定一 回個 可調定時答器 如 定時 250 io輸出 0 定時 5 io輸出 1,高電平 窄 或 定時 5 io輸出 0 定時 250 io輸出 1,高電平 寬 即定時器每中斷一次要重灌定時資料 有的微控制器帶有pwm功能,用定時器實現的方法是...
51微控制器用定時器編的流水燈出了些問題請高手
include reg51.h unsigned char s 0,a 128,count 0 void main void t0 srv interrupt 1 using 1p1 a 或者直接用迴圈左移或迴圈右移 include a cror a,1 迴圈右移 void t0 srv inter...