1.定時(shí)器中斷實(shí)現(xiàn)間隔切換
在第六章第4講的測(cè)試代碼中提到過(guò)數(shù)碼管微閃爍問(wèn)題,這是由于三八譯碼器的IO端口切換的間隔時(shí)間不均勻?qū)е拢@部分的問(wèn)題宋老師已經(jīng)在《手把手教你學(xué)51單片機(jī)》文檔6.4.2節(jié)有詳細(xì)解釋?zhuān)⒃?.5.2節(jié)里解決了這個(gè)問(wèn)題。數(shù)碼管掃描函數(shù)我們使用定時(shí)器0強(qiáng)制實(shí)現(xiàn)間隔1ms切換三八譯碼器的IO輸出,這樣保證了每個(gè)數(shù)碼管被點(diǎn)亮的時(shí)間都是均勻的。我們?cè)谥骱瘮?shù)里不停地執(zhí)行數(shù)碼管顯示函數(shù)。這里是測(cè)試代碼,用定時(shí)器1實(shí)現(xiàn)add間隔50ms自增1,數(shù)碼管顯示add的值。
#include <reg52.h> #include <function.h> //詳見(jiàn)第六章第8講 #include <timer.h> u32 add=9999; void main() { LED_Init(); //初始化LED硬件模塊 EA = 1; //閉合總中斷開(kāi)關(guān) TIM0_Init(1000,33); //定時(shí)1ms,因?yàn)橹袛嗪瘮?shù)占用時(shí)間多一點(diǎn),所以微調(diào)的值跨度比較大 TIM1_Init(50000,10); //定時(shí)50ms,10是微調(diào)使定時(shí)更精確 while(1) { ShowNumber(add); } } void TIM0_IRQHandler() interrupt 1 { TH0 = T0RH; //重新加載重載值 TL0 = T0RL; SEG_Scan(); //間隔1ms執(zhí)行三八譯碼器的不同IO輸出低電平 } void TIM1_IRQHandler() interrupt 3 { TH1 = T1RH; //重新加載重載值 TL1 = T1RL; add++; }
2.PWM簡(jiǎn)單入門(mén)
PWM概念在《手把手教你學(xué)51單片機(jī)》文檔10.2節(jié)有很好的解釋?zhuān)@里筆者就不費(fèi)筆墨講解了,我們簡(jiǎn)單入門(mén)PWM來(lái)讓8盞小燈實(shí)現(xiàn)較暗地點(diǎn)亮。P0端口輸出如下
代碼實(shí)現(xiàn)如下
#include <reg52.h> #include <function.h> //詳見(jiàn)第六章第8講 #include <timer.h> u8 pwm=0; void main() { LED_Init(); //初始化LED硬件模塊 EA = 1; //閉合總中斷開(kāi)關(guān) TIM0_Init(1000,10); //定時(shí)1ms,10是微調(diào)使定時(shí)更精確 while(1) { if(pwm<=8)P0=0xFF; //pwm在0~8之間都會(huì)執(zhí)行“P0=0xFF;”,也就是占空比為90%,小燈顯示較暗 else P0=0x00; } } void TIM0_IRQHandler() interrupt 1 { TH0 = T0RH; //重新加載重載值 TL0 = T0RL; pwm++; if(pwm>=10)pwm=0; //pwm在0~9之間間隔1ms變化 }
3.淺談例程代碼
在宋老師的lesson10_2例程代碼中的“void ConfigPWM(unsigned int fr, unsigned char dc)”函數(shù)里大家閱讀起來(lái)可能有點(diǎn)吃力,這里筆者解析一下。
我們先再次復(fù)習(xí)一下知識(shí),定時(shí)器每加1經(jīng)過(guò)的時(shí)間是(12/11059200)秒,如果計(jì)數(shù)到11059200(多次溢出),時(shí)間也就過(guò)去了12秒。時(shí)間過(guò)去了1秒的時(shí)候計(jì)數(shù)值就是(11059200/12)。
“ConfigPWM(100, 10);”意味著tmp的數(shù)值周期是(1/100)秒,也就是頻率為100Hz。這個(gè)周期里高電平定時(shí)持續(xù)的時(shí)間為“(1/100)*0.1”秒,低電平定時(shí)持續(xù)的時(shí)間為“(1/100)*0.9”秒。所以占空比為10%。
主函數(shù)里的延時(shí)就是讓這個(gè)PWM波形持續(xù)一段時(shí)間,然后又到下一個(gè)占空比為40%的PWM波形持續(xù)一段時(shí)間。4個(gè)階段的占空比不同,也就表現(xiàn)為小燈的顯示亮度不同。
這里筆者做個(gè)效果圖給大家理解吧
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)課程