51单片机学习笔记:定时器产生PWM可调方波,控制led灯亮度
扫描二维码
随时随地手机看文章
使用定时器T0产生PWM方波,
用按键调整占空比,20级可调
控制led灯的亮度等级.
C代码
#include"my51.h"
#include"timer0.h"
#definegrading20//亮度20级变化
sbitkeyS3=P3^5;//按键调整占空比,PWM_keyChange++
sbitkeyS4=P3^6;//PWM_keyChange--
u8PWM_keyChange=10;//初值,按键调整在1~20之间变化
//占空比PWM_keyChange/grading
voidT0_work()//本函数由T0定时器中断函数调用
{
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)//防止一次按键中多次执行
{
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;//按键锁释放标志,下一次按键时允许调整占空比
}
}
}
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的状态,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)