1.捕獲高電平時(shí)間
我們利用定時(shí)器0的計(jì)數(shù)功能實(shí)現(xiàn)捕獲外部引腳的高電平時(shí)間。定時(shí)器在不同用法里有不同稱呼,比如我們這次是想得知某段過(guò)程持續(xù)了多長(zhǎng)時(shí)間,用定時(shí)器的計(jì)數(shù)方式的話就叫做計(jì)數(shù)器。
我們這次選用的外部引腳還是P1.6,初始時(shí)先讓該引腳輸出低電平。
我們之前沒(méi)有說(shuō)過(guò)當(dāng)TMOD低四位里的第三位GATE為1時(shí)是什么作用,這里說(shuō)明一下,當(dāng)這個(gè)位被置1的話,如果此時(shí)有“TR0=1;”,且P3.2必須為高電平的時(shí)候,才會(huì)觸發(fā)定時(shí)器0的計(jì)數(shù)(P3.2為低電平時(shí)不會(huì)觸發(fā)),也就是TL0每隔(12/11059200)秒就會(huì)加1,加到256變?yōu)?之后TH0就加1。一直加到65535就會(huì)有“TL0=255;”和“TH0=255;”,再加1就會(huì)全部變?yōu)?,這里復(fù)習(xí)以前講過(guò)的知識(shí)。
所以我們把P1.6和P3.2連接起來(lái),在 TR0置1時(shí),只要P1.6輸出高電平就會(huì)開啟計(jì)數(shù)功能,P1.6輸出低電平時(shí)就會(huì)停止計(jì)數(shù)功能。我們?cè)儆米筮吶齻€(gè)數(shù)碼管顯示TH0的數(shù),右邊三個(gè)顯示TL0的數(shù)。
所以我們打算這樣做
P1.6=0;
TR0=1;
P1.6=1; //開始計(jì)數(shù)
delay_ms(30); //延時(shí)一段時(shí)間
P1.6=0; //停止計(jì)數(shù)
代碼先用軟件測(cè)試一下“delay_ms(30);”到底真正花費(fèi)多少時(shí)間。
所以P1.6保持了41.784ms的高電平時(shí)間。
用杜邦線把P1.6和P3.2連接起來(lái)之后,注意我們的延時(shí)時(shí)間不要超過(guò)71ms,也就是高電平持續(xù)的時(shí)間不能超過(guò)71ms,這跟定時(shí)時(shí)間一次定不了71ms一樣。因?yàn)橛?jì)數(shù)最高只能到65535。
2.代碼
把代碼下載進(jìn)去,觀察數(shù)碼管顯示的數(shù)值。
#include <reg52.h> #include <function.h> //詳見第六章第8講 //請(qǐng)用杜邦線把P1.6和P3.2連接起來(lái) void main() { LED_Init(); //初始化LED硬件模塊 TMOD=0x09; //低四位 1001 BEEP=0; //先讓P1.6輸出低電平 TR0=1; BEEP=1; //開始計(jì)數(shù) delay_ms(30); BEEP=0; //停止計(jì)數(shù) LedBuff[0]=LedChar[TL0%10]; LedBuff[1]=LedChar[(TL0/10)%10]; LedBuff[2]=LedChar[(TL0/100)%10]; LedBuff[3]=0x7F&LedChar[TH0%10];//加上小數(shù)點(diǎn)好區(qū)分 LedBuff[4]=LedChar[(TH0/10)%10]; LedBuff[5]=LedChar[(TH0/100)%10]; while(1) { SEG_Scan();//讀取TH0和TL0的值 } }
數(shù)碼管顯示150.109,所以
(150*256+109)*(12/11059200)= 0.0417849s
捕獲到的高電平時(shí)間為41.7849ms,可以說(shuō)精度相當(dāng)高。
這里大家忘記為什么“150*256”的話,請(qǐng)回去復(fù)習(xí)本章之前的內(nèi)容。
還有TMOD的第七位GATE的功能與第三位的GATE的功能一樣,只不過(guò)用的是定時(shí)器1來(lái)計(jì)數(shù),觸發(fā)開啟計(jì)數(shù)的引腳為P3.3而已。詳細(xì)請(qǐng)參考《手把手教你學(xué)51單片機(jī)》文檔5.2.2節(jié)
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)課程