1.工作模式2的使用
這里我們順便講解一下定時(shí)器0的工作模式2,也就是使用“小試管”的方式,TMOD的初始化就為“TMOD=0x02;”。
我們知道工作模式2的最長(zhǎng)溢出時(shí)間僅為256*(12/11059200)=0.000277秒=277微秒。
我們想實(shí)現(xiàn)間隔51ms的流水燈實(shí)驗(yàn)該怎么做,首先我們定義一個(gè)變量cnt用來(lái)記錄每次的溢出次數(shù),然后我們的定時(shí)時(shí)間為51微秒(因?yàn)樽畲蠖〞r(shí)只有278微秒),cnt記錄的值等于1000的時(shí)候,證明時(shí)間已經(jīng)過(guò)去了51ms,于是再去執(zhí)行流水燈的任務(wù)。
我們已經(jīng)知道工作模式2是不需要在溢出之后再填充初始值的,比如我們定時(shí)的時(shí)間為51微秒,那么計(jì)算出“距離溢出的刻度”就為47(實(shí)際計(jì)算出的是47.0016,所以定時(shí)為51微秒誤差就不大)。
所以給TL0賦初值為256-47=209=0xD1。那么TH0也是給初值為0xD1,這是保證每次TL0溢出之后新的初始值是等于TH0的值的,所以定時(shí)器工作模式2又叫做8位自動(dòng)重裝載模式。相關(guān)概念還需讀者再去另外學(xué)習(xí)這些理論知識(shí)。
2.工作模式2的代碼
#include <reg52.h> #include <function.h>//詳見(jiàn)第六章第8講 void main() { u8 i; u16 cnt; LED_Init(); //初始化LED硬件模塊 TMOD = 0x02; //設(shè)置定時(shí)器0為工作模式2 TH0 = 0xD1; TL0 = 0xD1; //定時(shí)51us TR0 = 1; //啟動(dòng)定時(shí)器0 while(1) { if (TF0 == 1) //每隔51us就可以進(jìn)入一次這個(gè)if語(yǔ)句 { TF0 = 0; //定時(shí)器0溢出后,清零中斷標(biāo)志 cnt++; //記錄溢出次數(shù) } if(cnt>=1000) //時(shí)間過(guò)去了51ms { cnt=0; P0=~(0x01<<i); i++; } if(i>=8)i=0; } }
大家對(duì)照上一講的工作模式1的代碼會(huì)發(fā)現(xiàn),工作模式2在while循環(huán)中不再出現(xiàn)TH0和TL0的身影,TL0每次溢出之后,初值又變?yōu)門H0初始時(shí)候的值了,所以定時(shí)時(shí)間在while循環(huán)之前就已經(jīng)決定好了。
大家可以嘗試著把“if(cnt>1000)”里的1000改為10000就是間隔510ms的流水燈了。
往后我們做的題目定時(shí)時(shí)間一般最少都是要定時(shí)1毫秒以上,所以用工作模式1的機(jī)會(huì)會(huì)很多,而工作模式2在我們前期教程里會(huì)很少運(yùn)用,等學(xué)到串口通信相關(guān)知識(shí)時(shí)我們?cè)僦厥斑@個(gè)知識(shí)點(diǎn)。
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語(yǔ)法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程