51单片机除了一部分型号可以自带pwm波输出,其他型号只有用软件模拟输出。而其中一般用定时器中断的方式来设置。
第一种方式是用两个相同周期的定时器来产生。
先产生两个高低数字信号
两个定时器输出的信号值不一样,但其初相相同。若先产生高电平,则后面的输出全为低电平,同理相反。
如果这样的话只有两种输出结果,要么恒为1要么恒为0没有什么意义,而我们要实现占空比的话,只有控制其初相。
代码实现
- #include<reg52.h>
- sbit abc=P1^3;
- void ab(int);
- void yanchi(int);
- int ac=0;
- void main(){
- int a=0;
- abc=1;
- TMOD=0X22;//设置两个定时器的工作方式16位
- EA=1;
- while(1){
- yanchi(5);
- ab(a);
- a++;
- if(a==100)
- a=0;
- }
-
- }
- void ab(int a){//a为占空比,也就是上面两个定时器输出信号的时间差
-
- ET0=0;
- TR0=0;
- ET1=0;
- TR1=0;
- abc=1;
- TH0=(65536-1100)/256;
- TL0=(65536-1100)%256;
- TH1=(65536-a*11)/256;
- TL1=(65536-a*11)%256;
- ET0=1;
- TR0=1;
- ET1=1;
- TR1=1;
- }
- void T0TIME()interrupt 1
- {
- abc=1;
- TH0=(65536-1100)/256;
- TL0=(65536-1100)%256;
- }
- void T1TIME()interrupt 3
- {
- abc=0;
- TH1=(65536-1100)/256;
- TL1=(65536-1100)%256;
- }
- void yanchi(int a){
- int b,c;
- for(b=0;b<=a;b++)
- for(c=0;c<=110;c++);
- }
复制代码
第二种实现方法只用一个定时器来实现
用一个定时器产生一个确定周期的数字信号,在其中断程序中进行操作,下面以产生两路pwm信号来说明。
程序如下
- #include<reg52.h>
- sbit ja=P1^3;
- sbit ja1=P1^4;
- void pwmkz(int);
- void pwmkz1(int);
- void yanchi(int);
- int a=0,b=0;
- int c=0;
- void main(){
- int f=0;
- TMOD=0x22;
- TH0=(65536-11)/256;
- TL0=(65536-11)%256;
- EA=1;
- ET0=1;
- TR0=1;
- while(1){
- f+=5;
- if(f==100)
- f=0;
- pwmkz(f);
- yanchi(15);
- //pwmkz1(100);
- }
- }
- void pwmkz(int d){
- a=d;
- }
- void pwmkz1(int e){
- b=e;
- }
- void pwmdin()interrupt 1
- {
- c++;
- TH0=(65536-11)/256;//初值控制中断周期
- TL0=(65536-11)%256;//
- if(c==100)//100为控制输出信号的周期的常量 输出周期=中断周期*100(可以改变)
- c=0;
- if(c<a)//a为第一路的占空比
- ja=1;//控制电平
- else
- ja=0;
- if(c<b)//b为第二路占空比
- ja1=1;
- else
- ja1=0;
- }
- void yanchi(int a){
- int b,c;
- for(b=0;b<=a;b++)
- for(c=0;c<=110;c++);
- }
复制代码
|