51單片機學習筆記:定時器產(chǎn)生PWM可調(diào)方波,控制led燈亮度
使用定時器T0產(chǎn)生PWM方波,
用按鍵調(diào)整占空比,20級可調(diào)
控制led燈的亮度等級.
C代碼
#include"my51.h"
#include"timer0.h"
#definegrading20//亮度20級變化
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ù)調(diào)用
{
if(timeMultiple1Flag)
{
led=off(7);//關閉7號燈
timeMultiple1Flag=0;//清定時器復用置位標志
}
if(timeMultiple2Flag)
{
led=on(7);//打開7號燈
timeMultiple2Flag=0;//清定時器復用置位標志
}
}
voidmain()//測試
{
u8keyFlag=1;//程序中沒有消抖處理,只是簡易的按鍵進出自鎖標志
led0=ledon;//先打開0號燈,用于和7號燈對比亮度
initT0(1,10,grading);//1毫秒的基本定時,亮的時間1*10毫秒,暗1*(grading-10)毫秒
while(1)
{
if(0==keyS3)
{
if(keyFlag)//防止一次按鍵中多次執(zhí)行
{
keyFlag=0;//清標志,類似同步鎖
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;//按鍵鎖釋放標志,下一次按鍵時允許調(diào)整占空比
}
}
}
C代碼
#ifndef_MY51_H
#define_MY51_H
#include
//#include
#include
#include
#include"mytype.h"
#ifndef_51LED_
#define_51LED_
#defineledP1//P1總線連8個led燈,燈連573鎖存器,P1置低電平點亮
#defineLEDled
#defineON(x)P1&(~(1<<(x)))//打開某個燈,開多個燈用ON(m)&ON(n)
#defineOFF(x)P1|(1<<(x))//關閉某個燈,關多個燈用OFF(m)|OFF(n)
#defineon(x)ON(x)//包含大小寫
#defineoff(x)OFF(x)
#defineledon0//某個燈,打開
#defineledoff1//某個燈,關閉
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;//鎖定當前8個led的狀態(tài),0鎖定,1不鎖定
#endif
/*************二進制輸入宏****************************/
#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)