1.兩種“試管”
這種“試管”有65535個(gè)刻度的型號(hào),也有255個(gè)刻度的型號(hào),不過(guò)我們的導(dǎo)管水流流速是永遠(yuǎn)不變的。
如果我們用的是大試管(65535個(gè)刻度),那么溢出時(shí)間我們可以控制的長(zhǎng)一些,也就是定時(shí)時(shí)間可以多一點(diǎn)。我們要是想定時(shí)36個(gè)單位刻度的時(shí)間,那就先往試管裝好65500個(gè)刻度的水量先,這樣等到水位到達(dá)65535那個(gè)刻度時(shí),再加一個(gè)刻度就溢出了,這時(shí)溢出的就是36個(gè)單位刻度的時(shí)間。
“試管”每次水溢出,試管里的水就會(huì)消失不見(jiàn)(歸0),如果我們還想定時(shí)36個(gè)單位刻度的時(shí)間,還需要重新把65500個(gè)刻度的水量再次裝好給“試管”。
如果我們用的是小試管(255個(gè)刻度),雖然它的定時(shí)時(shí)間遠(yuǎn)遠(yuǎn)沒(méi)有大試管的定時(shí)時(shí)間長(zhǎng),但是只要我們第一次裝好水量,每次它溢出之后,不會(huì)馬上歸0,而是試管里的水重新歸為我們第一次那個(gè)時(shí)候裝好的水量,所以只要在第一次確定了水量,也就確定了以后的所有定時(shí)時(shí)長(zhǎng)。
這種叫做“試管”的東西就是我們單片機(jī)內(nèi)部的另一個(gè)寄存器,51單片機(jī)有兩個(gè)定時(shí)器,分別叫做定時(shí)器0和定時(shí)器1,跟外部中斷有 0和1的兩個(gè)硬件資源一樣。這里我們先拿定時(shí)器0來(lái)講解,定時(shí)器1大體原理都一樣。
2.“試管”的選擇
而我們想選用哪個(gè)“試管”作為定時(shí)時(shí)長(zhǎng),首先需要初始化寄存器TMOD相對(duì)應(yīng)的位的值。先看到下面這張圖
可以看到圈出來(lái)的左右兩個(gè)紫色框,4~7位是管定時(shí)器1的,0~3位是管定時(shí)器0的。
第2和第3位我們還沒(méi)學(xué)到,此時(shí)不需要理會(huì),主要看第0和第1位,這兩個(gè)位決定的是我們?cè)撨x用哪個(gè)“試管”。
如果M1=0,M0=1,選用的是“大試管定時(shí)模式”。
如果M1=1,M0=0,選用的是“小試管定時(shí)模式”。
因?yàn)槲覀儠簳r(shí)沒(méi)有使用到定時(shí)器1,所以4~7位(俗稱高4位)可以全置為0,2~3位用不到,也是置為0,我們先選擇大試管作為定時(shí)時(shí)間先,所以TMOD這個(gè)寄存器初始化就是“TMOD=0x01;”
這里要注意,因?yàn)椤癕1”和“M0”在“#include<reg52.h>”頭文件中并沒(méi)有“sbit M0=TMOD^0;”的內(nèi)容,所以我們初始化只能是“TMOD=0x01;”一次操作8個(gè)位,而在程序里書(shū)寫(xiě)“M1=0;”和“M0=1;”是錯(cuò)誤的。
我們把使用“大試管”稱為定時(shí)器的工作模式1,使用“小試管”稱為定時(shí)器的工作模式2。
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫(xiě)的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫(xiě)出一個(gè)爬蟲(chóng)的Python編程課程
只會(huì)語(yǔ)法寫(xiě)不出代碼?手把手帶你寫(xiě)100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門(mén)課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程