在51單片機(jī)的學(xué)習(xí)過(guò)程中,我們經(jīng)常會(huì)發(fā)現(xiàn)中斷、計(jì)數(shù)器/定時(shí)器、串口是學(xué)習(xí)單片機(jī)的難點(diǎn),對(duì)于初學(xué)者來(lái)說(shuō),這幾部分的內(nèi)容很難理解。但是我個(gè)人覺(jué)得這幾部分內(nèi)容是單片機(jī)學(xué)習(xí)的重點(diǎn),如果在一個(gè)學(xué)期的課堂學(xué)習(xí)或者自學(xué)中沒(méi)有理解這幾部分內(nèi)容,那就等于還沒(méi)有掌握51單片機(jī),那更談不上單片機(jī)的開(kāi)發(fā)了,我們都知道在成品的單片機(jī)項(xiàng)目中,有很多是以這幾部分為理論基礎(chǔ)的,萬(wàn)年歷是以定時(shí)器為主的,報(bào)警器是以中斷為主的,聯(lián)機(jī)通訊是以串口為主的。
在這幾部分內(nèi)容中,計(jì)數(shù)器/定時(shí)器對(duì)于初學(xué)者說(shuō)很容易搞混淆,下面我將對(duì)這方面的內(nèi)容結(jié)合自己的學(xué)習(xí)經(jīng)驗(yàn)談幾點(diǎn)看法。
計(jì)數(shù)器和定時(shí)器的本質(zhì)是相同的,他們都是對(duì)單片機(jī)中產(chǎn)生的脈沖進(jìn)行計(jì)數(shù),只不過(guò)計(jì)數(shù)器是單片機(jī)外部觸發(fā)的脈沖,定時(shí)器是單片機(jī)內(nèi)部在晶振的觸發(fā)下產(chǎn)生的脈沖。當(dāng)他們的脈沖間隔相同的時(shí)候,計(jì)數(shù)器和定時(shí)器就是一個(gè)概念。
在定時(shí)器和計(jì)數(shù)器中都有一個(gè)溢出的概念,那什么是溢出了。我們可以從一個(gè)生活小常識(shí)得到答案,當(dāng)一個(gè)碗放在水龍頭下接水的時(shí)候,過(guò)了一會(huì)兒,碗的水滿了,就發(fā)生溢出。同樣的道理,假設(shè)水龍頭的水是一滴滴的往碗里滴,那么總有一滴水是導(dǎo)致碗中的水溢出的。在碗中溢出的水就浪費(fèi)了,但是在單片機(jī)的定時(shí)計(jì)數(shù)器中溢出將導(dǎo)致一次中斷。
在定時(shí)器計(jì)數(shù)器中,我們有個(gè)概念叫容量,就是最大計(jì)數(shù)量。
方式0是2的13次方,
方式1是2的16次方,
方式2是2的8次方,
把水滴比喻成脈沖,那么導(dǎo)致碗中水溢出的最后一滴水的就是定時(shí)計(jì)數(shù)器的溢出的最后一個(gè)脈沖。
在各種單片機(jī)書本中,在介紹定時(shí)計(jì)數(shù)器時(shí)都講到一個(gè)計(jì)數(shù)初值,那什么是計(jì)數(shù)初值呢?在這里我們還是假設(shè)水滴碗。假設(shè)第一百滴水能夠使碗中的水溢出,我們就知道這個(gè)碗的容量是100。
舉例1,我如何才能使碗接到10滴水就溢出呢?我可以想象,如果拿一個(gè)空碗去接水,那么還是得要100滴水才能溢出,但是如果我們拿一個(gè)已經(jīng)裝有水的碗拿去接,那就不用100滴了。到此我們可以算出,要使10滴水讓碗中的水溢出,那么碗中就先要裝90滴水。在定時(shí)計(jì)數(shù)器中,這90滴水就是我們所謂的初始值。
舉例2,在一個(gè)車間我們?nèi)绾卫脝纹瑱C(jī)對(duì)100件產(chǎn)品進(jìn)行計(jì)件,并進(jìn)行自動(dòng)包裝呢?我們可以利用計(jì)數(shù)器計(jì)數(shù)100,在中斷中執(zhí)行一個(gè)自動(dòng)包裝的動(dòng)作就可以了。
在這里計(jì)數(shù)初值有3個(gè),假設(shè):
方式0:計(jì)數(shù)初值=8192(2的13次方)—100=8092。
方式1:計(jì)數(shù)初值=65536(2的16次方)—100=65436。
根據(jù)所得的初始值,再將其轉(zhuǎn)換為16進(jìn)制,就可以進(jìn)行計(jì)數(shù)或者定時(shí)了。后面講解定時(shí)器初值的計(jì)算方法。