目錄標題
- 1.定時器初步
- 2.定時器使用
- 3.中斷系統
- 4.使用中斷
1.定時器初步
時鐘周期:時序中最小的單位,1/時鐘源頻率
機器周期:單片機完成一個操作需要的最短時間
STC15系列的機器周期:
12T模式 一個機器周期=12個時鐘周期
1T模式 一個機器周期=1個時鐘周期
對于常用的12M晶振:
12T模式 一個機器周期為1us
1T模式 一個機器周期為1/12us
. 機器周期是1us,就是說每1us產生一次計數,就拿50ms來說,這是你想要的計時,意思是,對機器周期進行50000計數就可以得到我想要的,可T0是一個可以對機器周期能進行65536次計數,也就是說我想要的50ms不能讓T0溢位,怎么辦,那么先給這個定時器里面放些數,放多少,就是我們想要的50ms再加上一個多少就能等于65536,也就是65536和50000的差值,這個值就是我們說的初值,
. 為什么除以256,因為我們的計時器是兩個8位組成的,那么要把那些差值裝進這兩個8位,那么低8位最多能裝256個機器周期,那么256計滿了就用高8位的,就是說低8位滿一次高8位加1,那么高8位裝多少,低8位就滿了幾次,演算法就是用差值除一下256取其整數,剩下的,就是還剩了小于256次數的就放在低8位,就是差值 的余數,如果我要放一個超過256的數,肯定是超過先放高八位,把剩下的部分放在低八位中了,TH0=(65536-50000)/256就是把TL0中放不下的部分放在TH0中,再把剩下的部分放在TH0中,
oid timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
flag++;
if(flag==20)//當定時到1秒時執行花括號里面的陳述句
{
}
}
單片機通常有2個16位可編程定時/計數器,即定時器T0和T1,T0和T1均可分為高8位TH和低8位TL,與定時/計數器相關的有兩個特殊功能暫存器:模式控制暫存器TMOD和控制暫存器TCON,它們控制了定時器的作業,如下圖:

2.定時器使用
計時器作業方式暫存器TMOD
TMOD:8位分為兩組,高四位控制T1,低四位控制T0
(1)GATE——門控位
0:以TRx(x=0,1)來啟動定時器/計數器運行
1:以外中斷和TRx來啟動定時器/計數器運行
(2)C/T*——計數器模式和定時器模式選擇位
0:定時器模式
1:計數器模式
(3)M1、M0——作業方式選擇位
| M1 | M2 | 作業方式 |
|---|---|---|
| 0 | 0 | 方式0,13位定時器/計數器 |
| 0 | 1 | 方式1,16位定時器/計數器 |
| 1 | 0 | 方式2,8位常數自動重新裝載 |
| 1 | 1 | 方式3,T0分成兩個8位計數器,T1停止計數 |
模式控制暫存器TCON
| TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
|---|
低四位與外部中斷有關,高四位功能如下:
TF1、TF0——計數溢位標志位:
定時器T0或T1計數溢位時,由硬體自動將此位置為1
TFx可以由程式查詢,也是定時中斷的請求源
TR1、TR0——計數溢位標志位:
TRx=1:啟動定時器/計數器作業
TRx=0:停止定時器/計數器作業
3.中斷系統

EA:控制總中斷
TRx:TCON的控制位,控制計時器Tx中斷
例如使用T0計時器的初始化函式:
void init()//定時1ms
{
TMOD=0x01;//設定作業方式1
TH=(65536-1000)/256;//設定TH初始值
TL=(65536-1000)%256;//設定TL初始值
ET0=1;//開啟計時器T0中斷
EA=1;//開啟總中斷
TR0=1;//開啟計時器T0
}
4.使用中斷
中斷的實作
當定時器T0/T1計數計滿溢位時,會導致TCON的TF置位并向CPU申請中斷,CPU回應中斷,執行中斷函式,
中斷函式:一種當有中斷發生時自動執行的函式,它不需要由主函式呼叫執行,執行完中斷函式后,定時器/計數器重新計數,
函式定義:
void fun()interrupt N
{
}
其中,interrupt N中N指的是中斷的優先級,例如T0優先級高于T1,優先級高的先產生中斷
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292266.html
標籤:其他
上一篇:國潮崛起!RT-Thread國產MCU移植貢獻活動!
下一篇:簡易版掃雷原理
