A. 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 的晶體振盪器也會因晶體本身所存在的誤差使波特率產生誤差,但晶體本身的誤差對波特率的影響是十分之小的,可以忽略不計。
B. 51單片機串口通信定時器初值怎麼計算公式和計算原理是什麼
串口通信方式1和方式3,要用T1來控制波特率。
T1,使用定時方式2,其初始值,和晶振頻率、波特率、SMOD的關系式如下:
T1初值 = 256 - fosc * (SMOD + 1) / (384 * 波特率)
--我不明白波特率跟這個定時器的關系。麻煩你詳細一點!
這個關系,是由硬體決定的,只有搞微電子的,才能弄明白。
軟體人員,編程的時候,會用這個公式即可,也沒有必要弄明白這個。
基本上,也沒有幾個人,能夠弄明白集成電路內部,究竟是怎麼處理的。
其它的很多人,好像是很明白,其實都是在瞎編理由,包括寫書的那些人。
C. 51單片機中斷/定時器/計數器
89C51/52的中斷系統有5個中斷源 ,2個優先順序,可實現二級中斷嵌套 。
1、(P3.2)可由IT0(TCON.0)選擇其為低電平有效還是下降沿有效。當CPU檢測到P3.2引腳上出現有效的中斷信號時,中斷標志IE0(TCON.1)置1,向CPU申請中斷。
2、(P3.3)可由IT1(TCON.2)選擇其為低電平有效還是下降沿有效。當CPU檢測到P3.3引腳上出現有效的中斷信號時,中斷標志IE1(TCON.3)置1,向CPU申請中斷。
3、TF0(TCON.5),片內定時/計數器T0溢出中斷請求標志。當定時/計數器T0發生溢出時,置位TF0,並向CPU申請中斷。
4、TF1(TCON.7),片內定時/計數器T1溢出中斷請求標志。當定時/計數器T1發生溢出時,置位TF1,並向CPU申請中斷。
5、RI(SCON.0)或TI(SCON.1),串列口中斷請求標志。當串列口接收完一幀串列數據時置位RI或當串列口發送完一幀串列數據時置位TI,向CPU申請中斷。
IE寄存器:
中斷允許控制寄存器分為兩層結構,第一級結構為中斷允許總控制EA,只有當EA處於中斷允許狀態,中斷源中斷請求才能夠得到允許;當EA處於不允許狀態時,無論IE寄存器中其他位處於什麼狀態,中斷源中斷請求都不會得到允許。第二級結構為5個中斷允許控制位,分別對應5個中斷源的中斷請求,當對應中斷允許控制位為1時,中斷源中斷請求得到允許。
EX0:外部中斷0允許位。EX0=1,允許外部中斷0中斷;EX0=0,禁止外部中斷0中斷。當EX0=1( SETB EX0 )時,同時單片機P3.2引腳上出現中斷信號時,單片機中斷主程序的執行而「飛」往中斷服務子程序,執行完後通過中斷返回指令RET 動返回主程序。當EX0=0( CLR EX0)時,即使單片機P3.2引腳上出現中斷信程序也不會從主程序「飛」 出去執行,因為此時單片機的CPU相當於被「堵上了耳朵」,根本接收不到P3.2引腳上的中斷信號,但是這並不表示這個信號不存在。如果單片機的CPU有空查一下TCON中的IE0位,若為1就說明有中斷信號出現過。
ET0:T0溢出中斷允許位。ET0=1,允許T0中斷;ET0=0,禁止T0中斷。
EX1:外部中斷1允許位。EX1=1,允許外部中斷1中斷;EX1=0,禁止外部中斷1中斷。當EX1=1( SETB EX1)時,並且外部P3.3引腳上出現中斷信號時,單片機CPU會中斷主程序而去執行相應的中斷服務子程序;當EX1=0( CLR EX1)時使外部P3.3引腳上即使出現中斷信號,單片機的CPU也不能中斷主程序轉而去行中斷服務子程序。 [3] 因此,可以這樣認為,EX0和EX1是決定CPU能否感覺到外部引腳P3.2P3.3上的中斷信號的控制位。
ET1:T1溢出中斷允許位。ET1=1,允許T1中斷;ET1=0,禁止T1中斷。
ES:串列中斷允許位。ES=1,允許串列口中斷;ES=0,禁止串列口中斷。
EA:中斷總允許位。EA=1,CPU開放中斷;EA=0,CPU禁止所有的中斷請求。總允許EA好比一個總開關。EA就相當於每家水管的總閘,如果總閘不開,各個龍頭即使開了也不會有水;反過來,如果總閘開了而各個分閘沒開也不會有水,所當我們想讓P3.2和P3.3引腳上的信號能夠中斷主程序則必須將EA位設置為0(CLR EA)。
TCON寄存器:
各位的標識如下:
TF1:定時器1溢出標志位。當定時器1計滿溢出時,由硬體使TF1置1,並且申請中斷,進入中斷服務程序,有硬體自動清0 ,在查詢方式下用軟體清0.
TR1:定時器運行控制位,TR1置1是開啟定時器1,TR1置0時關閉定時器1.
TF0:定時器0溢出標志位。當定時器0計滿溢出時,由硬體使TF0置1,並且申請中斷,進入中斷服務程序,有硬體自動清0 ,在查詢方式下用軟體清0.
TR0:定時器運行控制位,TR0置1是開啟定時器0,TR0置0時關閉定時器0.
IE1:外部中斷1請求標志位。
IT1:外部中斷1觸發方式選擇位。當IT1置0時,為低電平觸發;當IT1置1時,為下降沿觸發。
IE0:外部中斷0請求標志位。
IT0:外部中斷0觸發方式選擇位。當IT0置0時,為低電平觸發;當IT0置1時,為下降沿觸發。
51單片機外部中斷響應條件:
1、中斷源有中斷請求;
2、中斷源的中斷允許位為1(設置IE寄存器相關位);
3、CPU開中斷(設置IE寄存器開中斷,即EA=1)
CPU時序的有關知識:
振盪周期:為單片機提供定時信號的振盪源的周期(晶振周期或外加振盪周期)
狀態周期:2個振盪周期為1個狀態周期,用S表示。
機器周期:1個機器周期含6個狀態周期,12個振盪周期。
指令周期:完成1條指令所佔用的全部時間,它以機器周期為單位。
定時器的其他知識點:
1、51單片機有兩組定時器/計數器,因為既可以定時,又可以計數,故稱之為定時器/計數器。
2、定時器/計數器和單片機的CPU是相互獨立的。定時器/計數器工作的過程是自動完成的,不需要CPU的參與。
3、51單片機中的定時器/計數器是根據機器內部的時鍾或者是外部的脈沖信號對寄存器中的數據加1。
4、有了定時器/計數器之後,可以增加單片機的效率,一些簡單的重復加1的工作可以交給定時器/計數器處理。CPU轉而處理一些復雜的事情。同時可以實現精確定時作用。
與定時器/計數器有關的寄存器:
1、TMOD寄存器
2、TCON寄存器
3、IE寄存器
4、THx/TL寄存器
工作方式寄存器TMOD:
工作方式寄存器TMOD用於設置定時/計數器的工作方式,低四位用於T0,高四位用於T1。其格式如下:
M1M0:工作方式設置位。定時/計數器有四種工作方式。一般我們廳方式1和方式2:
控制寄存器TCON:
TCON的低4位用於控制外部中斷,已在前面介紹。TCON的高4位用於控制定時/計數器的啟動和中斷申請。其格式如下:
TF1(TCON.7):T1溢出中斷請求標志位。T1計數溢出時由硬體自動置TF1為1。CPU響應中斷後TF1由硬體自動清0。T1工作時,CPU可隨時查詢TF1的狀態。所以,TF1可用作查詢測試的標志。TF1也可以用軟體置1或清0,同硬體置1或清0的效果一樣。
TR1(TCON.6):T1運行控制位。TR1置1時,T1開始工作;TR1置0時,T1停止工作。TR1由軟體置1或清0。所以,用軟體可控制定時/計數器的啟動與停止。
TF0(TCON.5):T0溢出中斷請求標志位,其功能與TF1類同。
TR0(TCON.4):T0運行控制位,其功能與TR1類同。
IE中斷開關寄存器:
用於開啟cpu中斷和對應的中斷位。
THx和TL定時/計數存儲寄存器:
THx存儲高8位數據,TLx存儲低8位數據。
定時器/計算器初值計數公式:
計數個數與計數初值的關系為:X=2^n-N
N是需要計數的值;n與設置定時器/計數器的工作方式有關(可能為8、13、16);X是需要設置在THx和TLx的初值。
使用定時器/計算器的初始化流程:
1、對TMOD賦值,以確定T0和T1的工作方式。
2、計算初值,並將其寫入TH0、TL0或TH1、TL1。
3、中斷方式選擇,則對EA賦值,開放定時器中斷。
4、使TR0或TR1置位,啟動定時/計數器定時或計數。
D. 51單片機用定時器計時應該如何計算求大神支招
這個其實很簡單的,你只需要知道一個條件即可:晶振頻率。
因為51單片機的機器周期計算公式是12/晶振頻率MHz,若晶振為12MHz,則機器周期就是12/(12×10^6)=1us,也就是說計數器沒1us計數一次。
那麼有了這個條件就好辦多了,一般來說,12MHz晶振下,16位定時器滿計數是65536次,每次1us,最大就能計時65.536ms,則65536減去多少就是定時多少,如(65536-X)/256,就是定時X微秒。
那麼如果晶振不是12MHz,就要把上述的X乘以12/晶振,得到的值就是定時時長。原理相同。
有不懂的地方隨時回復我。
希望我的回答能幫助到你。
E. 51單片機定時計數器原理
其實就是計數器原理,所謂的定時器就是用計數器來實現的一個功能而已。
計數器的原理,很簡單,就是給個方波信號,一個方波,就加1即可,最簡單的都能用數字電子技術里的或門,與門,非門來實現的。專門做計數的晶元也是一大堆,這里我們就不討論怎麼用或門,非門,與門,做出一個計數器了吧。
那麼怎麼用計數器實現定時器的功能呢?其實很簡單,只要你給計數器的方波是規律的就可以了啊,比如做一個一秒鍾輸出一個方波的電路,然後把這個方波給計數器,即可,那麼這個計數器就是一個定時器了,假設計數器一開始是0,一個方波以後,計數器就變成了1,對吧,但是計數器的方波來源是穩定的,一秒鍾就給一個方波,那麼這個就是個1s的定時器了吧,我們可以通過計數器的數值,來確定時間了吧,這樣就可以完成定時的功能了吧。
單片機也是通過這種手段來形成的,你可能就要問了,那我單片機不是沒有方波發射的裝置嗎?對不起,單片機晶元內部自己內置了,所以你不需要自己做這個方波發生裝置,那麼單片機是用什麼來形成方波的呢?答案是你外置的晶振,單片機是通過你外部的那個晶振來實現的,而且晶振也是你單片機能跑起來的關鍵,他是單片機的CPU等內部部件工作的時間標准,比如晶振12MHZ,就是這個晶振1秒鍾,能有12M個方波形成懂吧,所以這個頻率是很高的了,但是單片機一般不在這么高的頻率上工作,所以CPU的時間單位,不是晶振的頻率,一般是要進行降頻處理的,也叫分頻,像51單片機,很多都是12分頻的,即外部晶振是12MHZ,內部CPU工作的頻率只有1MHZ,內部的計數器一般也不能在那麼高的頻率下工作,所以也是分頻的,你最需要了解的是計數器或定時器里的數值加1,對應的時間是多少,一般都是1ms這樣的整數倍。
然後計數器呢?計數器就是用晶振分頻後的方波來工作的,晶振工作穩定,頻率穩定,那麼定時器就穩定,而如果你不用定時器的時候呢?那麼計數器的計數端,就和來自晶振的方波,切斷,切換成對應的IO埠的線路即可,而外部的埠,他們的波形和頻率都不確定,所以就不是定時器了,如果你在外部,加個穩定的方波裝置,計數器也就是定時器了,只不過這個需要自己去實現,豈不是麻煩?所以一般都用單片機內部自帶的,方便而已。
F. 簡述MCS-51單片機定時器/計數器四種工作方式
有四種工作方式:
方式0,13位定時/計數方式。
方式1,16位的定時/計數方式。
方式2,自動重裝載8位工作方式
方式3,定時/計數器0被拆成2個獨立的定時/計數器來用。其中,TL0可以構成8位的定時器或計數器的工作方式,而TH0則只能作為定時器來用。
G. 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