51微控制器定時器初值用變數設定定時不準確,為什麼,求高手。TH0 65536 X 256,TL0 65536 X

時間 2021-08-30 10:34:50

1樓:南國有兒女

第一種用法是常用的用法,我剛看了一下你的程式,那個x在這個程式中可能就是那個a,a是uint,就是無符整型,而直接用1000,這個是int型,系統預設的,我感覺問題出在這,計算時出錯。你可以把x設成int型,再試試!

2樓:匿名使用者

//工作頻率12m,所以定時器脈衝頻率為1m=1000000

#define f 12

#define it0_cost 11 // 定時器0中斷平均花費時間11us

#define one_second (f*1000000/12) // 機器週期

#define times 50 // 50ms中斷一次

#define oth0 (65536-one_second*times/1000 + it0_cost) / 256

#define otl0 (65536-one_second*times/1000 + it0_cost) % 256

3樓:尚雲社

tl0=(65536-2000)%256和tl0=(65536-a)%256在編譯之後的**是完全不同的,tl0=(65536-2000)%256在編譯之後的**可能會是:mov tl0,#30h。tl0=(65536-a)%256在編譯之後,因為a是變數,所以會有一段兩位元組的減法運算**,而且th0=(65536-a)/256和tl0=(65536-a)%256還可能會計算兩次。

所以在執行的時候,時間差異會比較大。如果把a定義成一個巨集,那就可以得到和前一種方式一樣的結果,而且修改也很方便,缺點就是不能在程式執行過程中改變a的值

4樓:匿名使用者

th0=(65536-1000)%256;

tl0=(65536-1000)%256;

這種定時方式是準確的

但是如果我用變數

x=1000;

th0=(65536-x)%256;//高位tl0=(65536-x)%256

確認對麼?

th0=(65536-x)/256;

5樓:用電知識分享

看一下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

求助,51微控制器定時器初值設定問題

第一句就是將,65536 5000 的高八位賦值給th0 第二句就是將,65536 5000 的低八位賦值給tl0 256就是2的8次方,一個數除以256相當於右移8位。mod是求模的意思。 蘭色星期八 因為定時器分高8位和低8位,所以th0取的是65536 5000的轉換成16進位制的高8位,tl...

51微控制器定時器中斷程式

m愛人 再次重新啟動。用c語言實現的,先要定義好定時器的初值,不管你使用多大的晶振,使用51微控制器,一般都是12分頻出來,也就可以得出一個機器週期,機器週期 12 n n指晶振頻率 假設你要定時的時間為m,那麼定時的初值為 m 機器週期 初值 th0 65536 初值 256 tl0 65536 ...

51微控制器中的定時器中斷是怎麼用的

娛樂小八卦啊 如下 實現led燈一秒亮滅閃爍 void main tmod 0x01 設定定時器0為工作方式1 m1 m0為01 th0 65536 45872 256 裝初值11.0582晶振定時50ms數為45872 tl0 65536 45872 256 ea 1 開總中斷 et0 1 開定時...