【定时器/中断/PWM】利用一个定时器实现一路PWM波的输出---点亮LED

来源:互联网 发布:mac资料库文件夹在哪 编辑:程序博客网 时间:2024/05/16 08:05

------------------------------------------凑热闹的分割线------------------------------------------------

/*点亮led0(P1^0)和led7(P1^7) 其中led0以5v电压正常点亮
 led1利用pwm和按键实现可调亮度*/#include<reg52.h>#define ui unsigned int#define uc unsigned charsbit led0=P1^0;sbit led1=P1^7;sbit up=P3^0;sbit down=P3^1;ui n=0;//定义了每个周期有几小段uc pwm=20; //定义了占空比(pwm越大 低电平占比越大) 数据类型范围0~256void delay();void init_timr0();void scan();void main(){init_timr0(); //初始化定时器led0=0; //正常点亮一个led 用于比较scan();}/*主函数*/void init_timr0(){TMOD=0x02; //设置定时0 工作方式2TH0=TL0=210; //周期中每段时间50usEA=1;ET0=1;TR0=1;}/*延时函数*/void delay(){uc x,y;for(x=10;x>0;x--)for(y=120;y>0;y--);}/*循环扫描检测是否要变亮或变暗*/void scan(){while(1){if(!up) //按下灯变亮(){delay();  //防抖if(!up)if(pwm<=250) //限制了pwm的范围不能大于255 否则溢出后变为最小pwm++;}delay(); //使按键调速更慢些if(!down){delay();if(!down)if(pwm>0) //限制了pwm的范围不能小于0 否则跳变到最大pwm--;}delay(); }}/*中断服务程序*/void timer0()interrupt 1{n++;if(n==250) //设置周期有250段 则 周期=n*定时器溢出时间{n=0;led1=0; // 0-pwm的时间内P1^7输出低电平}if(n==pwm)led1=1; // pwm-250的时间内P1^7输出高电平}
------------------------------------------搞事情的分割线------------------------------------------------
折腾了好久,PWM这块总算是有点明白了。接下来打算用一个定时器实现两路PWM波输出。继续加油!

0 0
原创粉丝点击