51單片機(jī)學(xué)習(xí)筆記:定時(shí)器產(chǎn)生PWM可調(diào)方波,控制led燈亮度
掃描二維碼
隨時(shí)隨地手機(jī)看文章
使用定時(shí)器T0產(chǎn)生PWM方波,
用按鍵調(diào)整占空比,20級(jí)可調(diào)
控制led燈的亮度等級(jí).
C代碼
#include"my51.h"
#include"timer0.h"
#definegrading20//亮度20級(jí)變化
sbitkeyS3=P3^5;//按鍵調(diào)整占空比,PWM_keyChange++
sbitkeyS4=P3^6;//PWM_keyChange--
u8PWM_keyChange=10;//初值,按鍵調(diào)整在1~20之間變化
//占空比PWM_keyChange/grading
voidT0_work()//本函數(shù)由T0定時(shí)器中斷函數(shù)調(diào)用
{
if(timeMultiple1Flag)
{
led=off(7);//關(guān)閉7號(hào)燈
timeMultiple1Flag=0;//清定時(shí)器復(fù)用置位標(biāo)志
}
if(timeMultiple2Flag)
{
led=on(7);//打開(kāi)7號(hào)燈
timeMultiple2Flag=0;//清定時(shí)器復(fù)用置位標(biāo)志
}
}
voidmain()//測(cè)試
{
u8keyFlag=1;//程序中沒(méi)有消抖處理,只是簡(jiǎn)易的按鍵進(jìn)出自鎖標(biāo)志
led0=ledon;//先打開(kāi)0號(hào)燈,用于和7號(hào)燈對(duì)比亮度
initT0(1,10,grading);//1毫秒的基本定時(shí),亮的時(shí)間1*10毫秒,暗1*(grading-10)毫秒
while(1)
{
if(0==keyS3)
{
if(keyFlag)//防止一次按鍵中多次執(zhí)行
{
keyFlag=0;//清標(biāo)志,類(lèi)似同步鎖
if(++PWM_keyChange>grading)
{
PWM_keyChange=grading;//占空比最大100%
}
initT0(1,PWM_keyChange,grading);
}
}
elseif(0==keyS4)
{
if(keyFlag)
{
keyFlag=0;
if(0==--PWM_keyChange)//占空比減小
{
PWM_keyChange=1;//最小占空比1/20
}
initT0(1,PWM_keyChange,grading);//占空比減小
}
}
else
{
keyFlag=1;//按鍵鎖釋放標(biāo)志,下一次按鍵時(shí)允許調(diào)整占空比
}
}
}
C代碼
#ifndef_MY51_H
#define_MY51_H
#include
//#include
#include
#include
#include"mytype.h"
#ifndef_51LED_
#define_51LED_
#defineledP1//P1總線連8個(gè)led燈,燈連573鎖存器,P1置低電平點(diǎn)亮
#defineLEDled
#defineON(x)P1&(~(1<<(x)))//打開(kāi)某個(gè)燈,開(kāi)多個(gè)燈用ON(m)&ON(n)
#defineOFF(x)P1|(1<<(x))//關(guān)閉某個(gè)燈,關(guān)多個(gè)燈用OFF(m)|OFF(n)
#defineon(x)ON(x)//包含大小寫(xiě)
#defineoff(x)OFF(x)
#defineledon0//某個(gè)燈,打開(kāi)
#defineledoff1//某個(gè)燈,關(guān)閉
sbitled0=P1^0;
sbitled1=P1^1;
sbitled2=P1^2;
sbitled3=P1^3;
sbitled4=P1^4;
sbitled5=P1^5;
sbitled6=P1^6;
sbitled7=P1^7;
sbitledLock=P2^5;//鎖定當(dāng)前8個(gè)led的狀態(tài),0鎖定,1不鎖定
#endif
/*************二進(jìn)制輸入宏****************************/
#ifndef_LongToBin_
#defineLongToBin(n)
(
((n>>21)&0x80)|
((n>>18)&0x40)|
((n>>15)&0x20)|
((n>>12)&0x10)|
((n>>9)&0x08)|
((n>>6)&0x04)|
((n>>3)&0x02)|
((n ) & 0x01)