单片机 定时器/计数器
單片機 定時器/計數器
一、簡述
????MCS—51系列單片機內部有兩個16位定時器/計數器,即定時器T0和定時器T1。它們都具有定時和計數功能,可用于定時或延時控制,對外部事件進行檢測、計數等。
????定時器/計數器是一個加“1”計數器,來一脈沖即做加1計數,直至寄存器各位全為1,再來一脈沖,計數器回0且使TF0(定時器T0)TF1(定時器T1)置1表示定時時間到,計數值乘以單片機的機器周期就是定時時間。
? ? ?計數器:工作在方式1,可以從0數到65536(2的16次方),超過65535產生中斷;如果想要數10000個數,可以設置計數器的初值為55536,這樣從初值55535數到65535就是10000個數。
? ? ?計數器又叫定時器:晶振產生脈沖信號,一個脈沖信號過來,計數器就數1,頻率高,產生脈沖信號就快,計數器數數就快,計數器每數了一個數說明過去了xx秒,那么讓計數器數10000個數,對應過去了10000乘以xx秒。這樣我們想要在10秒之后做某件事情,設置好計數器初值(設定計數器要數多少個數)、設置好頻率(確定產生一個脈沖的時間),計數器數到65535之后,產生溢出信號、引起中斷,然后執行中斷服務(可以是我們自己編寫的中斷函數)。
? ? ? 如:頻率是12MHZ,也就是1秒可以產生12000000個脈沖,也就是1秒可以數12000000個數。如果設置計數器的初值為65524(65535-12),也就是數12個數。數12000000個數用時1秒,那么數12個數用時12/12000000=0.000000.1秒=1微秒。(1秒=1000000微秒),想要定時1ms,那么可以讓計數器數12000個數,設置計數器的初值為65535-12000=53535。
二、TMOD控制寄存器
????GATE=1時,“與門”的輸出信號K由INTx輸入電平和TRx位的狀態一起決定(即此時K=TRx·INTx),當且僅當TRx=1,INTx=1(高電平)時,計數啟動;否則,計數停止。
????當INT0引腳為高電平時且TR0置位,TR0=1;啟動定時器T0;
????當INT1引腳為高電平時且TR1置位,TR1=1;啟動定時器T1。
????GATE=0時,“或門”輸出恒為1,“與門”的輸出信號K由TRx決定(即此時K=TRx),定時器不受INTx輸入電平的影響,由TRx直接控制定時器的啟動和停止。
三、TCON控制寄存器
?
| 設定好了定時器/計數器的工作方式后,它還不能進入工作狀態,必須通過設置控制寄存器TCON中的某些位來啟動它工。要使定時器/計數器停止運行,也必須通過設置TCON中的某些位來實現。當定時器/計數器計滿溢出,或有外部中斷請求時,TCON能標明溢出和中斷情況。 設定好了定時器計數器/的工作方式后,它還不能進入工作狀態,必須通過設置控制寄存器TCON中的某些位來啟動它工。要使定時器/計數器停止運行,也必須通過設置TCON中的某些位來實現。當定時器/計數器計滿溢出,或有外部中斷請求時,TCON能標明溢出和中斷情況。控制寄存器TCON每位的含義:? ? TF1:定時器T1溢出標志位。當定時器T1溢出時,由硬件自動使TF1置1,并向CPU申請中斷。CPU響應中斷后,自動對TF1清零。TF1也可以用軟件清零。? |
四、初值計算
?
機器周期:
? ? 時鐘周期(振蕩周期) = 1秒/晶振頻率? ? ? ? ?(T = 1/f)
????機器周期 = 12*振蕩周期
????機器周期?= 12秒/晶振頻率?
????如果系統晶振頻率為12M,那么機器周期=1us
?
五、例子
?
定時函數
void Delay1ms(unsigned int count) {unsigned int i;TMOD=0x01; //選用定時器0且工作在方式1TH0=0x3c; //設置初值0x3cb0TL0=0xb0;TR0=1; //開啟定時器for(i=0;i<count;i++) //循環count次,每次定時50ms,總共count*50ms{ while(TF0!=1);// 每次定時50ms (溢出時才會跳出循環)TH0=0x3c; //重置初值0x3cb0TL0=0xb0;TF0=0; //軟置溢出位} TR0=0; //關閉定時器 }定時1s:Delay1ms(20);
?
?
總結
以上是生活随笔為你收集整理的单片机 定时器/计数器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 拦截windows弹窗广告
- 下一篇: 交换机千兆和百兆对网速影响_千兆网线和百