-
使用定時器發出乙個100Hz PWM訊號,同時在定時器中設定另乙個定時器,PWM半小時後脈衝寬度減半,即功率減半。
-
你可以用數字電位器,降低電流,是不是降低功率,這是我的想法,你也可以試試!
-
毫無疑問,使用PWM訊號,但我認為頻率在100Hz時較低。 另乙個問題是,你不一定要使用兩個定時器,你也可以使用PWM訊號週期來加起來。
-
您好親愛的,51微控制器定時器的初始化過程如下:1選擇定時器工作模式:
通常有定時器和計數器兩種工作模式,可根據需要選擇。 2.設定計時器的計數值:
計時器計數值越高,計時器時間越長。 3.選擇定時器時鐘源:
選擇內部或外部時鐘源。 4.設定定時器時鐘分頻因子:
時鐘分頻因子越高,計時器計數速度越慢。 5.啟用定時器中斷:
使能中斷在定時器達到設定點時觸發中斷。 6.啟動定時器:
如果發生中斷,請執行相應的中斷服務子例程。 以上是51微控制器定時器初始化設定的主要過程。 具體步驟可根據開發要求和具體定時器模組的資料表進行調整和補充。
-
一旦設定了計時器,它將被自動計數。
-
tmod = (tmod & 0xf0) |0x01;定時器 0 在模式 1、16 位定時器模式下工作。
0xf0在上述表示式中扮演什麼角色?
1(tmod & 0xf0)其中&是邏輯和指令,位和操作,定時器tmod和上0xf0功能的模式暫存器是上4位保持不變,下4位被清除。 (1 與任何數字相同,與 0 與任何數字相同)。
tmod & 0xf0) |0x01在哪裡 |對於或指令,也稱為邏輯加法。 這裡的效果是上面的 7 位或上面的 0 保持不變。
最低數字或高 1 設定為 1
操作完成後,tmod = 上 4 位保持不變(定時器 1 的模式字保持不變),下 4 位設定為 0001(即定時器 0 設定為定時模式,工作在模式 1)。
總結:表示式中0xf0的作用是,當設定了定時器0的模式字時,不影響不改變定時器1的模式控制字。
-
0xf0是清除低位4位的值,然後高位0x01高4位不受影響,傳輸都是1位中的1位,0位中的0位,所以高位4位的值不會改變。 最底 4 位數字全部變為 0。
最後 |0x01將值 1 分配給較低的 4 位
最主要的是重新分配 t0 而不影響 t1。
-
這意味著報紙 tmod 的前四位數字與原始值保持不變,而後面的四位數字全部更改為 0返回|0x01 是第 0 個位置 1
總體含義是 tmod 的上四位保持不變,下四位設定為 0x01,即定時器 0 在模式 1 下工作
tmod 假設是0x22
tmod&0xf0然後它就變成了0x20
再次|0x01然後它就變成了0x21
明白了嗎,房東?
-
在主程式中:
tmod = 0x01;定時器 0 工作模式 1tl0 = (65536-50000)%256; 時序為50ms(在12MHz外部晶體振盪器)。
th0 = (65536-50000)/256;
et0 = 1;
tr0 = 1;
ea = 1;
定時器中斷:
void timer0() interrupt 1 }
-
取決於此表示式之前的 tmod 值。
-
再次重新啟動。
用C語言實現,首先要定義定時器的初始值,不管你用多大的晶體振盪器,使用51微控制器,一般是12分頻,可以得到乙個機器週期,機器週期=12n(n指晶體頻率),假設你要計時的時間是m, 那麼定時的初始值為:m機週期=初始值;
th0=(65536-初始值)%256;
tl0=(65536-初始值) 256;
將(65536-初始值)得到的值換算成十六進製,高位是th0的值,低位是tl0的值,例如,用12m晶振計算1ms時序如下:
機器週期 = 12 12 * 10 6 = 1us(微秒)。
時序初始值 = (1*10 -3) (1*10 -6) = 1000;
所以:th0=(65536-1000)%256;
tl0=(65536-1000)/256;
將 65536-1000=64536 轉換為十六進製系統為:0xfc18, th0=0xfc, tl0=0x18;
設定初始值後,應設定乙個延遲引數,為一秒,這裡使用1000(時序為1ms),中斷程式為:timer0()中斷1 1ms延遲(
-
這並不難,對吧?
A是明亮的,延遲的,b是明亮的,然後延遲,使用while(1)可以使明亮的過程只進行一次。
晚上我給你做乙個。
你先想一想,你沒辦法晚上給你買乙個。
-
使用定時器方法1時,(65536-x)的計算值超過256,即定時器的16位定時模式,因此需要向th0傳送高8位,向tl0傳送低位,因此要計算(65536-x)的高8位和低8位,(65536-x)256就是計算高8位, 而 (65536-x)%256 是計算低 8 位,所以寫成。
th0 = (65536-x) 256(或 th1)。
tl0 = (65536-x)%256(或 tl1)。
-
這其實很簡單,你只需要知道乙個條件:晶振頻率。
因為51微控制器的機器週期計算公式是12晶振頻率MHz,如果晶體振盪器是12MHz,那麼機器週期是12(12 10 6)=1us,也就是說計數器一次不算1us。
一般來說,在12MHz晶體振盪器下,16位定時器的滿數為65536次,每次1us,最大可以定時,則65536減去多少定時,如(65536-x)256,即定時x微秒。
所以如果晶體振盪器不是12MHz,將上面的x乘以12個晶體振盪器,得到的值就是時序持續時間。 原理是一樣的。
如果您不明白什麼,請隨時回覆我。
-
m是計時器的初始值,即先新增一部分值,然後開始計數,溢位後重新分配初始值。
工作模式 1,即 x 為 16
機器週期 = 12 * 1 時鐘週期 = 12 * 1 12 = 1us 問題要求最大定時時間,則初始值為m=0,即初始值不分配給定時器,定時器與原容量一樣大 2 16us
最大定時時間為 t=2 16us
-
m 是寫入計時器的初始值。
-
應該是你的中斷服務程式有問題,可能會占用太多時間,超過預定時間,所以可能會造成不準確的情況,貼上你的預定中斷程式看看,在定時程式中賦值時最好做到以下幾點:
tr2=0;
分配 tr2=1;
-
51微控制器定時器,晶振為12MHz,12交叉按頻,理論上最短的定時時間為1微秒,但是CPU執行指令需要時間,只要中斷服務程式的執行時間不超過定時器定時時間,並且有一定的餘量,就沒問題,如果沒有餘量, 然後中斷結束並進入中斷,如果超過定時器定時時間,則處理定時為時已晚,不準確。
如果定時時間太短,用 C 語言程式設計可能會導致問題,並且計算在中斷上花費了多少時間並不好。
如果用組合語言程式設計,晶體振盪器是12MHz,12路頻率,只產生乙個方波訊號,30kHz頻率就沒有問題。
當然,加入計數程式後要檢查時間的準確性,一般程式設計時,盡量少占用中斷服務程式中的時間,盡量不要做中斷服務程式中可以處理的任何事情。
在此過程中中斷服務程式。
-
如果你想提高定時精度,你可以提高晶振頻率,如:24MHz,它是否能夠解決你的問題。
-
這種微控制器不是傳統的51微控制器,時鐘比傳統的51時鐘快12倍。
-
1微秒是每條彙編指令所需的時間,定時器中斷涉及堆疊定址出堆疊等操作,天知道用了多少彙編指令,你設定了20個細微的當然有問題,程式還有別的事情要做,比如數碼管顯示(這個東西也很費時間), 不能只是回應你的打擾去...
如果想對中斷有一定的精度,10 20k將達到一般微控制器的頂部。
但是,如果你只是想輸出乙個高頻方波訊號,我建議你不要使用定時器,直接在主程式上加乙個迴圈,去掉必要的**,根據需要的頻率新增不同數量的nop指令,應該能達到更高的頻率。
1.並非所有微控制器都需要晶體振盪器。
晶體振盪器提供精確的頻率,但它也可以連線到現成的時鐘訊號,使用陶瓷振盪器,使用RC振盪器,將其設定為使用內部振盪器(通常是內部RC)等。 >>>More