⑴ 51單片機定時計數器四種工作方式哪種可以實現計數初值的自動載入
51單片機定時計數器四種工作方式中,方式2可以實現計數初值的自動載入。
解釋分析:
16位的計數器只用了8位來計數,用TLx來進行計數,而THx用於保存初值,當TLx計滿時則溢出,該方式的溢出狀態一方面使TF變化,另一方面使TH的值再次置入TL,正所謂自動重置定時/計數器
自動裝載初值,無需程序運行賦值,此方式更精確。
此時MAX值為28=256,設計數值為100。
初值為156=10011100B(0x9C)。
TH0=TL0=0x9C。
定時/計數器有如下一些用途:
(1)產生所需頻率的脈沖,如產生頻率1000,占空比1:1的脈沖波。
(2)在累加計數中的應用,計數器可在一段時間內記錄信號A經整形後的脈沖個數。
(3)在頻率測量中的應用,通過測量脈沖寬度或在一定時間內測量脈沖的個數,從而推算出脈沖的頻率。
(4)定時/計數器在計時中的應用,定時/計數器可對時鍾信號,如秒信號進行計數,也可用來倒計時,秒錶計,時間循環等。
⑵ 51單片機各種位數定時器初值計算方法
對12MHz ,1個機器周期 1us ,12/fosc = 1us
。
方式0是13位定時器,最大時間間隔 = 2^13 = 8.192ms
方式1是16位定時器,最大時間間隔 = 2^16 = 65.536ms
方式2是8位定時器,最大時間間隔 = 2^8 = 0.256ms =256 us
方式3 僅適用於T0,此時T0分成兩個8位計數器,T1停止計數
當選用定時器的方式1時,設機器周期為Tcy,定時器產生一次中斷的時間為t,那麼需要計數的個數N=t/Tcy,裝入THX和TLX中的數分別為:
THX = (2^16 - N)/256 TLX = (2^16 -N )%256(此處的X為定時器0或定時器1)
公式為:(2^y - X)*Tcy = t
Tosc= 1/ fosc
一個機器周期 = 12個時鍾周期 = 12/fosc
溢出速率 = 1 / 溢出時間
故:初值X = 2^y – t/Tcy
THX = 高八位
TLX = 低八位
註:
X:定時器初值
N:計數值
y:定時器工作方式
fosc:晶振頻率
Tcy:機器周期,Tosc:時鍾周期
Tcy = 1/Tosc
⑶ 51單片機定時器初值為什麼可以是十進制數
對於51單片機而言,定時器初值本身最終必須是二進制數才會被識別。
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
之所以可以是十進製表述出來,這是由編譯器決定的,也即是說keilc允許這樣表示,編譯時會自動轉換為二進制。
⑷ 51單片機定時器初值公式中的256是什麼
用方式1時,16位的初值要分解成高8位、低8位,分別存放到 TH0、TL0。
對256求模,也就是除以 256 得到的整數商,這就是高八位。
對256求余,也就是除以 256,得到的余數,這就是低八位。
樓主可以把一個二進制數,人工除以2、除以4、...除以16...,
看看商、余數,都是多少位,就知道 8 位數和 256 的關系了。
⑸ 51單片機定時器初值問題
肯定不行,你自己算一下,
由於計數器是向上計數的,定時5ms(假設1個脈沖1US,需5000個脈沖)
初值就是65536-5000,這樣再來5000個脈沖,計數器值就成了65536,產生溢出,發生中斷
因高8位(TH0)的每個1相當於256,所以它裝入的應該是(65536-5000)/256
低8位(TL0)是(65536-5000)%256,也就是不足256的部分
⑹ 51單片機波特率計算公式和定時器初值
51單片機晶元的串口可以工作在幾個不同的工作模式下,其工作模式的設置就是使用SCON 寄存器。它的各個位的具體定義如下:
SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0、SM1 為串列口工作模式設置位,這樣兩位可以對應進行四種模式的設置。串列口工作模式設置。
波特率在使用串口做通訊時,一個很重要的參數就是波特率,只有上下位機的波特率一樣時才可以進行正常通訊。波特率是指串列埠每秒內可以傳輸的波特位數。這里所指的波特率,如標准9600 不是每秒種可以傳送9600個位元組,而是指每秒可以傳送9600 個二進位,而一個位元組要8 個二進位,如用串口模式1 來傳輸那麼加上起始位和停止位,每個數據位元組就要佔用10 個二進位,9600 波特率用模式1 傳輸時,每秒傳輸的位元組數是9600÷10=960 位元組。
51晶元的串口工作模式0的波特率是固定的,為fosc/12,以一個12M 的晶振來計算,那麼它的波特率可以達到1M。模式2的波特率是固定在fosc/64 或fosc/32,具體用那一種就取決於PCON 寄存器中的SMOD位,如SMOD 為0,波特率為focs/64,SMOD 為1,波特率為focs/32。
模式1和模式3的波特率是可變的,取決於定時器1或2(52晶元)的溢出速率,就是說定時器1每溢出一次,串口發送一次數據。那麼我們怎麼去計算這兩個模式的波特率設置時相關的寄存器的值呢?可以用以下的公式去計算。
上式中如設置了PCON寄存器中的SMOD位為1時就可以把波特率提升2倍。通常會使用定時器1工作在定時器工作模式2下,這時定時值中的TL1做為計數,TH1做為自動重裝值,這個定時模式下,定時器溢出後,TH1的值會自動裝載到TL1,再次開始計數,這樣可以不用軟體去干預,使得定時更准確。在這個定時模式2下定時器1溢出速率的計算公式如下:
溢出速率=(計數速率)/(256-TH1初值)
溢出速率=fosc/[12*(256-TH1初值)]
上式中的「計數速率」與所使用的晶體振盪器頻率有關,在51 晶元中定時器啟動後會在每一個機器周期使定時寄存器TH 的值增加一,一個機器周期等於十二個振盪周期,所以可以得知51晶元的計數速率為晶體振盪器頻率的1/12,一個12M 的晶振用在51晶元上,那麼51的計數速率就為1M。通常用11.0592M 晶體是為了得到標準的無誤差的波特率,那麼為何呢?計算一下就知道了。如我們要得到9600 的波特率,晶振為11.0592M 和12M,定時器1 為模式2,SMOD 設為1,分別看看那所要求的TH1 為何值。代入公式:
11.0592M
9600=(2÷32)×((11.0592M/12)/(256-TH1))
TH1=250
12M
9600=(2÷32)×((12M/12)/(256-TH1))
TH1≈249.49
上面的計算可以看出使用12M晶體的時候計算出來的TH1不為整數,而TH1的值只能取整數,這樣它就會有一定的誤差存在不能產生精確的9600 波特率。當然一定的誤差是可以在使用中被接受的,就算使用11.0592M 的晶體振盪器也會因晶體本身所存在的誤差使波特率產生誤差,但晶體本身的誤差對波特率的影響是十分之小的,可以忽略不計。
⑺ 51單片機定時器初值公式
1.簡單說起,256表示一個8位分界點,對它求模得高位位元組存在TH0中,求余得低位位元組放在TL0中,拿十進制打比:15/10得十位1,15%10得個位數5
2.12Mhz時,單周期指令時間為12/fsoc=1us
方式1為16位定時/計數器
故定時1ms為:TH0=(2^16-1000)/2^8,
TL0=(2^16-1000)%256
當為11.0592MHz時,單周期指令時間為12/fsoc=12/11.0592us
由於採用方式0,為13為定時器,TH0高8位和TL0的低5位
故定時1ms為:
TH0=(2^13-1000/(12/11.0592))/2^5,
TL0=(2^16-1000/(12/11.0592))%2^5
這么晚了 寫寫不容易,多給些分以此鼓勵俺
O(∩_∩)O~
⑻ 51單片機串口通信定時器初值怎麼計算公式和計算原理是什麼
串口通信方式1和方式3,要用T1來控制波特率。
T1,使用定時方式2,其初始值,和晶振頻率、波特率、SMOD的關系式如下:
T1初值 = 256 - fosc * (SMOD + 1) / (384 * 波特率)
--我不明白波特率跟這個定時器的關系。麻煩你詳細一點!
這個關系,是由硬體決定的,只有搞微電子的,才能弄明白。
軟體人員,編程的時候,會用這個公式即可,也沒有必要弄明白這個。
基本上,也沒有幾個人,能夠弄明白集成電路內部,究竟是怎麼處理的。
其它的很多人,好像是很明白,其實都是在瞎編理由,包括寫書的那些人。
⑼ 求助,51單片機定時器初值設定問題
第一句就是將,(65536-5000)的高八位賦值給TH0
第二句就是將,(65536-5000)的低八位賦值給TL0
256就是2的8次方,一個數除以256相當於右移8位。MOD是求模的意思。