|
本帖最后由 dabing89 于 2018-10-14 18:56 編輯
定時(shí)器的使用 ---20181013
好,繼續(xù)更新這個(gè)帖子,前邊我們點(diǎn)亮了流水燈,然而定時(shí)是用DELAY實(shí)現(xiàn)的,實(shí)際上在實(shí)際的項(xiàng)目中,DELAY基本上不會(huì)用,如果一個(gè)程序中,主循環(huán)有大量的DELAY出現(xiàn),那么就不合理了,所以必須要用定時(shí)器 ,保證程序的實(shí)時(shí)性,這一貼,我們寫一個(gè)程序,用定時(shí)器0來(lái)實(shí)現(xiàn)LED間隔500MS閃爍的效果 ,代碼如下:
因?yàn)樵趯?shí)際使用中,定時(shí)器和中斷都是在一起配合使用,所以這兒我們就不分開,但是要說(shuō)的是,定時(shí)器是硬件,是單片機(jī)內(nèi)部存在的一個(gè)模塊,而中斷僅僅是一種處理問(wèn)題的機(jī)制,上面這個(gè)d代碼看著不多,但是消息量很大,我們一點(diǎn)一點(diǎn)解剖,理解了定時(shí)器的的原理,等你上手STM32的時(shí)候,定時(shí)器原理可以直接不看,直接拿來(lái)用就好了。
先從STC89C52RC的開始說(shuō)起,我們知道,STC89C52RC是標(biāo)準(zhǔn)51內(nèi)核,在標(biāo)準(zhǔn)51的體系下,12個(gè)時(shí)鐘周期是一個(gè)機(jī)器周期,啥意思呢?比如你的外部晶振是11.0592MHZ,那么11059200的倒數(shù),也就是周期了,這個(gè)倒數(shù)叫做時(shí)鐘周期,也叫震蕩周期,算一下時(shí)間,1/11059200 = 0.0904US,這就是STC89C52的時(shí)鐘周期,那么51單片機(jī)就規(guī)定,12個(gè)這樣的時(shí)鐘周期為一個(gè)機(jī)器周期,所以在乘以12,那么一個(gè)機(jī)器周期的數(shù)值是1.085US,注意這是在11.0592MHZ下,如果是在12MHZ下,那么一個(gè)機(jī)器周期就是1US,這就是定時(shí)器的時(shí)間基準(zhǔn)。我們?cè)賮?lái)看下,如果我們用STC89C52來(lái)做一個(gè)500MS的定時(shí)器該怎么做呢?配置如下即可實(shí)現(xiàn):
- /*******************************************************************
- * 文件名:void Bsp_Tim0_Init(void)
- * 描述: 定時(shí)器0初始化函數(shù)
- * 功 能
- * 作者:大核桃
- * 版本號(hào):V1.00(2018.09.19)
- ********************************************************************/
- void Bsp_Tim0_Init(void) //1000微秒@11.0592MHz
- {
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TMOD |= 0X01;
- TH0 = 0xFC; //設(shè)置定時(shí)初值
- TL0 = 0x66; //設(shè)置定時(shí)初值
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- ET0 = 1; //使能定時(shí)器0的中斷
- EA = 1; //打開總中斷
- }
- /*******************************************************************
- * 文件名:TIM0_IRQ_Handler
- * 描 述:中斷服務(wù)函數(shù)
- * 功 能 中斷服務(wù)標(biāo)號(hào) INT0 ET0 INT1 ET1 UART1 ADC LVD TIME2
- * 優(yōu)先級(jí): 0 1 2 3 4 5 6 12
- * 版本號(hào):V1.00(2018.09.19)
- ********************************************************************/
- void TIM0_IRQ_Handler(void) interrupt 1
- {
- static uint16 tmr500ms = 0;
- TH0 = 0xFC; //設(shè)置定時(shí)初值
- TL0 = 0x66; //設(shè)置定時(shí)初值
- tmr500ms++;
- if(tmr500ms >= 500)
- {
- tmr500ms = 0;
- flag500ms = !flag500ms; //500MS閃爍
- }
-
-
- }
復(fù)制代碼
還是來(lái)解釋下,首先定時(shí)器的配置步驟是這樣的:
1.先設(shè)置TMOD這個(gè)寄存器,選擇定時(shí)器0的模式寄存器,配置定時(shí)器0為16位不可重裝載模式
2.設(shè)置定時(shí)器的定時(shí)初值,高八位和低八位
3.打開定時(shí)器的運(yùn)行標(biāo)志位,因?yàn)門CON是一個(gè)可位尋址的寄存器,所以直接TR0 = 1;就好。
4.使能定時(shí)器0的中斷ET0
5.打開總中斷EA
OK,這樣就配置好了寄存器,定時(shí)器也可以工作了,然而我們了解定時(shí)器是怎么運(yùn)行的了嗎?沒(méi)有!�。『芏嗳瞬恢罏樯妒沁@個(gè)數(shù)值,而且定時(shí)器的的初值還有好幾種寫法,如果有人用了不一樣的而寫法,你一定要知道是等價(jià)的寫法。
關(guān)于初值的計(jì)算
我們知道定時(shí)器0是一個(gè)16位的定時(shí)器,最大計(jì)數(shù)65536(0-65535)分為高八位和低八位,TH0存儲(chǔ)的是高八位的數(shù)據(jù),TL0存儲(chǔ)的是低八位的數(shù)據(jù),0XFC是一個(gè)16進(jìn)制數(shù)值,換算10進(jìn)制是252,0X66是102,我們知道低八位最大計(jì)數(shù)到255,TH0就變成1,然后進(jìn)位,清零,又開始從0計(jì)數(shù),那么我們可以算算這個(gè)初值是多少?252*256 +102�。健�64614,而64614的16進(jìn)制表示形式就是0XFC66,這樣我們就搞清楚定時(shí)器的計(jì)時(shí)原理了,如下所示,初值代碼可以改寫成這樣:
- TH0 = (65535 - 921) / 256; //設(shè)置定時(shí)初值
- TL0 = (65535 - 921) % 256; //設(shè)置定時(shí)初值
復(fù)制代碼 也就是說(shuō),我們讓單片機(jī)從64614開始計(jì)數(shù),到65535溢出,總共計(jì)數(shù)921個(gè),而我們又知道1個(gè)機(jī)器周期是1.085US,那么921個(gè)機(jī)器周期是多少呢?921*1.085 = 1000US,正好是1MS的定時(shí),我們?cè)诔绦蛑凶屍湟绯?00次,那么不就是500MS了嗎?就是這樣來(lái)的,原理一定要搞清楚。不管什么STM32,64,128都是這樣的原理{:lol:}。關(guān)于中斷使用的時(shí)候,打開使能就好了,EA是總中斷使能位,如果這個(gè)不打開,ET0單獨(dú)打開是沒(méi)用的,這才是一把手。
關(guān)于STC15W系列的定時(shí)器
好了,既然我們搞清楚了,STC89C52的定時(shí)器的原理了,我們來(lái)看下,STC15W的定時(shí)器配置,因?yàn)槲覀兌际嵌〞r(shí)1MS,那么,為啥初值不一樣呢?我們來(lái)算下STC15W的這個(gè)初值對(duì)應(yīng)的10進(jìn)制數(shù)值是多少?是54477,好陌生的數(shù)字,怎么來(lái)的呢?65536-54477 = 11059,也就是說(shuō)在STC15W的內(nèi)核下,我們只要計(jì)數(shù)11059個(gè),就可以達(dá)到1MS的定時(shí),我們知道,STC15W是單周期的時(shí)鐘,也就是說(shuō)我們不12分頻,我們直接就是一個(gè)時(shí)鐘周期就是一個(gè)機(jī)器周期,(1/11059200)*11059 = 1ms,明白了吧?所以,本節(jié)的程序代碼,也可以這樣寫,是一樣的作用的。
- /*******************************************************************
- * 文件名:void Bsp_Tim0_Init(void)
- * 描述: 定時(shí)器0初始化函數(shù)
- * 功 能
- * 作者:大核桃
- * 版本號(hào):V1.00(2018.09.19)
- ********************************************************************/
- void Bsp_Tim0_Init(void) //1000微秒@11.0592MHz
- {
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TMOD |= 0X01;
- // TH0 = 0xD4; //設(shè)置定時(shí)初值
- // TL0 = 0xCD; //設(shè)置定時(shí)初值
- TH0 = (65535 - 11059) / 256;//設(shè)置定時(shí)初值
- TL0 = (65535 - 11059) % 256;//設(shè)置定時(shí)初值
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- ET0 = 1; //使能定時(shí)器0的中斷
- EA = 1; //打開總中斷
- }
復(fù)制代碼
關(guān)于在單片機(jī)中大量存在的& |運(yùn)算的詳細(xì)說(shuō)明
其實(shí)這個(gè),不太想說(shuō),但無(wú)奈上網(wǎng)看到好多初學(xué)者根本不知道& |的作用,還是詳細(xì)的說(shuō)明下比較好,以定時(shí)器0的配置為例。
AUXR |= 0x80; AUXR是一個(gè)輔助寄存器,這不需要多說(shuō),|= 0x80有什么講究呢?|(或),是讓某一位置1的意思,讓那一位置一呢?很明顯,讓是1的那一位置一,0X80不就是最高位是1嗎?那就是讓最高位置一好了,有人說(shuō),這有啥用呢?本來(lái)不就是1嗎?人家還有后半句,而其他位保持不變,其他位?啥位?等于0的那些對(duì)吧?也就是低7位不變了。這樣操作有啥好處呢?我們知道ET0 = 1;TR0 = 1;之所以可以這樣操作,是因?yàn)樗麄兛梢员晃粚ぶ�,可以進(jìn)行單獨(dú)的位操作,而AUXR是不可以進(jìn)行位尋址的,因此一次操作必須操作8個(gè)位,你想想看,AUXR這個(gè)寄存器的功能如下圖:
00009.jpg (104.42 KB, 下載次數(shù): 168)
下載附件
2018-10-13 08:45 上傳
你能保證直接讓AUXR = 0X80,不對(duì)其他位造成影響嗎?現(xiàn)在大家的編程還比較簡(jiǎn)單,只有一個(gè)定時(shí)器,要是用到3個(gè),4個(gè)定時(shí)器呢?這樣不就互相干擾了嗎?扯淡么?所以 & |的重要性也就凸現(xiàn)出來(lái)了。
再來(lái)看后面這2句,很明顯TMOD是不可以位尋址的,按照我們剛才的分析,|是讓某一位置一,那么&,自然就是讓某一位清零了,來(lái)看下0XF0,二進(jìn)制是1111_0000,也就是低4位置0,高4位不要管,因?yàn)?amp;是乘法運(yùn)算啊,只要都是1,那么就是1,很明顯讓低4位清零,下一句是0000_0001,讓最低為置一啊,對(duì)吧,要注意,這里的2句是連續(xù)操作的,不是單獨(dú)的的操作,什么意思?前者的運(yùn)算結(jié)果,又給了后者,所以我們總體來(lái)看這2句代碼,先讓低四位清零,高四位不變,然后將這個(gè)結(jié)果進(jìn)行或運(yùn)算,讓最低位置一,而高7位都不變,因?yàn)槿魏螖?shù)|還是任何數(shù)啊,對(duì)吧,這就達(dá)到了一個(gè)互不干擾的目的,這樣的代碼在STM32上好多好多的,都是起到一個(gè)互不干擾的作用。這樣的做法可以確保定時(shí)器0和定時(shí)器1是獨(dú)立的,如果我們不這樣做,你看看是工作在啥模式?除了定時(shí)器配置在16位不可重裝模式在,定時(shí)器1被配置在了16位自動(dòng)重裝定時(shí)器,我們沒(méi)有使用定時(shí)器1,萬(wàn)一出錯(cuò)怎么辦?這就不好了。
00010.jpg (105.97 KB, 下載次數(shù): 165)
下載附件
2018-10-13 08:45 上傳
關(guān)于自動(dòng)重裝載和不可自動(dòng)重裝模式
其實(shí),沒(méi)啥太大的區(qū)別,如果是自動(dòng)重裝,那么在中斷服務(wù)函數(shù)中,TH0 TL0就不需要去再去重新賦值了,直接刪掉就好,如果不是自動(dòng)重裝,則必須要加。還差點(diǎn)忘了一個(gè)事,你怎么確定你的定時(shí)是500MS呢?答案不能靠眼睛看把,看看示波器觀察的結(jié)果,嗯,是對(duì)的。如下圖,1S 1HZ的方波信號(hào)
00011.jpg (1.34 MB, 下載次數(shù): 152)
下載附件
2018-10-13 08:47 上傳
好了,今天就到這里吧,代碼上傳
004 定時(shí)器的使用.rar
(30.68 KB, 下載次數(shù): 92)
2018-10-14 18:50 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|