上篇文章太長(zhǎng)了,快上4K字了,我要新開一篇繼續(xù)寫。
繼續(xù)寫這個(gè)定時(shí)器,注意的是,崽每個(gè)機(jī)器周期完成的時(shí)候計(jì)數(shù)。S5P2的時(shí)候如果采樣到高變低的情況,認(rèn)為是個(gè)脈沖。在下一個(gè)機(jī)器周期的S3P1進(jìn)行計(jì)數(shù)。
除12,計(jì)數(shù)頻率就是1Mhz,也就是微妙的級(jí)別
反過來(lái)就是裝載值
結(jié)構(gòu)框圖
TH,TL X2+TMOD+TCON,就這點(diǎn)東西。
TH 高8位,TL 低8位。,合起來(lái)就是16位的寄存器。
用來(lái)放T1計(jì)數(shù)器的初值,T1可以當(dāng)作波特率的生成器
是一個(gè)單獨(dú)的器件
8位的寄存器,44分開,高走1,低走0,M1M0搭配選功能
CT這里就是選擇定時(shí)器的作用,GATE是外部引腳的干預(yù)
還有的就是TCON,TF是溢出標(biāo)志位,可以用軟件查這位,滿的時(shí)候?yàn)?,查完寫0?,中斷的時(shí)候?yàn)橹袛鄻?biāo)志位,自動(dòng)清0.
TR是啟動(dòng)位置,ET是中斷控制。
方式0
此時(shí)為13位的定時(shí)器,低5高8,低5溢出的時(shí)候向高8進(jìn)位,高8滿的時(shí)候,觸發(fā)TF位。
CT是決定工作模式
0的位置是,12分頻后的計(jì)數(shù)信號(hào)。1是計(jì)時(shí)器。
還有門
GATE恒為0,A的點(diǎn)位恒為1,B點(diǎn)就取決于TR1這個(gè)位置。
計(jì)數(shù)脈沖加到T1的時(shí)候,允許T1計(jì)數(shù),TRX為0,B為低電位,電子開關(guān)斷開,禁止T1計(jì)數(shù)。
其實(shí)就是開關(guān),前面不管多亂,后面就在安安靜靜的數(shù)數(shù),一個(gè)倆個(gè)
方式1的話,就是TL,TH都啟用了,全16位。剩下都一樣了。
方式2?,感覺很高級(jí)的一種
0,1方式在溢出后,計(jì)數(shù)器為0,在循環(huán)定時(shí)的時(shí)候需要重新裝載這個(gè)計(jì)數(shù)器的初值。這個(gè)動(dòng)作要耗費(fèi)時(shí)間,而且你看,編程也麻煩。
那就有了這第二種做法,自動(dòng)的裝載初值。
TH高位做常數(shù)緩存器,低位溢出的時(shí)候,在把這個(gè)溢出的信號(hào)(TF=1)送出的時(shí)候,自動(dòng)把TH中的常數(shù)送給TL,TL現(xiàn)在就有開始工作了。
好好記住是TL位置溢出的時(shí)候,TH裝載
最后一種我就不說了,感覺現(xiàn)在說了沒有意義。
。。。還是說了吧,0,1,2其實(shí)都是一個(gè)定時(shí)器搭配的使用。
這個(gè)模式就對(duì)T0生效,TL0和TH0就相當(dāng)于2個(gè)八位的定時(shí)器。
現(xiàn)在有三個(gè)定時(shí)器了
此時(shí)T1做波特率發(fā)生器,同時(shí)把TF1的溢出位也占用了。
由于確定一次負(fù)跳變,需要兩個(gè)機(jī)器周期,因此外部的脈沖頻率最高位為1/24,12Mhz的晶體,可以輸入的脈沖是500KHz,占空比沒有限制,不過為了在給點(diǎn)電平變化前采樣一次,這一電平至少也得保持一個(gè)機(jī)器周期。
Tcy是一個(gè)機(jī)器周期
如何輸出一個(gè)方波,使用定時(shí)器。周期使用定時(shí)器T0來(lái)確定,使用中斷。
在T0里面設(shè)置一個(gè)時(shí)間的常數(shù)(初值),沒1ms中斷一次,CPU響應(yīng)以后,在ISR里面給IO取反。
初值的計(jì)算,機(jī)器周期=12/頻率。
公式:(216– X)× 12 ÷ 晶振頻率 = 定時(shí)時(shí)間(默認(rèn)單位us)
———————————————————————————————
X是未知量
———————————————————————————————
216是根據(jù)方式選擇的,可以自行選擇,方式1為16位
方式0 :213 (少用)
方式1 :216 (最常用)
方式2 :28 (常用)
?
1s=1000ms,1ms=1000us
定時(shí)器T0工作在方式一,晶振頻率為11.0592MHZ,需要定時(shí)時(shí)間0.5s怎么做?
1. 1s=1000ms,1ms=1000us。
2. 此時(shí)計(jì)算最大的計(jì)數(shù)間隔(216-0)× 12 ÷ 11.0592=71ms,定時(shí)時(shí)間最大只能算到71ms,而0.5s=500ms,距離需要的時(shí)間還差429ms
3. 所以算5ms再循環(huán)個(gè)100次,這樣就可以得到5ms*100=500ms(0.5s)
500ms先換算成us單位就是5000us公式:(216-X)× 12 ÷ 11.0592=5000(us)
?X=60928把十進(jìn)制60928轉(zhuǎn)換為16進(jìn)制=0xee00,分配高8位TH=0xee,低8位TL=0x00
開始使用自減結(jié)構(gòu),減完做判斷,在100次完成后,重新裝載i值。
剩下就是具體應(yīng)用的細(xì)節(jié),我當(dāng)然還會(huì)繼續(xù)寫。
接下來(lái)可能會(huì)寫ESP32的定時(shí)器或是ESP8266的,不管怎么說,有了51的基礎(chǔ),剩下的都是So easy。
明顯就是一個(gè)現(xiàn)代的MCU的定時(shí)器配置了
審核編輯: 劉清
評(píng)論
查看更多