网上找的呼吸灯程序,自己仿照写的
利用定时器产生pwm,实现呼吸灯
参考呼吸灯程序,同样可以实现控制直流电机的速度,可以到这个网页去看看https://www.zhihu.com/tardis/sogou/art/83373994
pwm波形:
单片机源程序如下:
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- bit flag; //根据flag判断变亮或者变暗
- uchar count; //进入中断次数
- uchar pwm; //根据这个数值来进行点亮或熄灭
- uint updata; //根据这个值来更新占空比,周期120ms
- sbit LED=P2^0; //LED引脚
- void timer0();
- /*********定时器初始化函数***********/
- void timer0_init()
- {
- TMOD=0x02; //定时器0,方式2
- TH0=0xa3; //假设晶振为11.0592M,定时100us
- TL0=0xa3;
- ET0=1; //开定时器0中断
- EA=1; //开总中断
- TR0=1; //开定时器
- }
- void main()
- {
- flag=0; //初始为占空比上升
- count=0;
- pwm=10; //脉冲周期为2ms,初始占空比50%
- updata=0;
- LED=1;
- timer0_init();
- while(1);
- }
- void timer0() interrupt 1
- {
- count++;
- updata++;
- if(count==pwm)
- LED=0;
- if(count==20)
- {
- LED=1;
- count=0;
- }
- if((updata==1200)&&(flag==0)) //120ms到,根据flag更新占空比
- {
- updata=0;
- pwm++; //每次加1,占空比增加5%
- if(pwm==19)
- flag=1;
- }
- if((updata==1200)&&(flag==1))
- {
- updata=0;
- pwm--;
- if(pwm==1)
- flag=0;
- }
- }
复制代码
3-PWM的基本参数 在上图中,频率F的值为1/(T1+T2),占空比D的值为T1/(T1+T2)。通过改变单位时间内脉冲的个数可以实现调频;通过改变占空比可以实现调压。占空比越大,所得到的平均电压也就越大,幅值也就越大;占空比越小,所得到的平均电压也就越小,幅值也就越小。动图演示如图4所示。
|