|
51單片機(jī)除了一部分型號(hào)可以自帶pwm波輸出,其他型號(hào)只有用軟件模擬輸出。而其中一般用定時(shí)器中斷的方式來(lái)設(shè)置。
第一種方式是用兩個(gè)相同周期的定時(shí)器來(lái)產(chǎn)生。
先產(chǎn)生兩個(gè)高低數(shù)字信號(hào)
捕獲.PNG (1.35 KB, 下載次數(shù): 58)
下載附件
2019-5-6 11:32 上傳
兩個(gè)定時(shí)器輸出的信號(hào)值不一樣,但其初相相同。若先產(chǎn)生高電平,則后面的輸出全為低電平,同理相反。
捕獲1.PNG (5.49 KB, 下載次數(shù): 53)
下載附件
2019-5-6 11:32 上傳
捕獲2.PNG (5.7 KB, 下載次數(shù): 63)
下載附件
2019-5-6 11:33 上傳
如果這樣的話只有兩種輸出結(jié)果,要么恒為1要么恒為0沒(méi)有什么意義,而我們要實(shí)現(xiàn)占空比的話,只有控制其初相。
捕獲3.PNG (22.02 KB, 下載次數(shù): 72)
下載附件
2019-5-6 11:33 上傳
代碼實(shí)現(xiàn)
- #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;//設(shè)置兩個(gè)定時(shí)器的工作方式16位
- EA=1;
- while(1){
- yanchi(5);
- ab(a);
- a++;
- if(a==100)
- a=0;
- }
-
- }
- void ab(int a){//a為占空比,也就是上面兩個(gè)定時(shí)器輸出信號(hào)的時(shí)間差
-
- 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++);
- }
復(fù)制代碼
第二種實(shí)現(xiàn)方法只用一個(gè)定時(shí)器來(lái)實(shí)現(xiàn)
用一個(gè)定時(shí)器產(chǎn)生一個(gè)確定周期的數(shù)字信號(hào),在其中斷程序中進(jìn)行操作,下面以產(chǎn)生兩路pwm信號(hào)來(lái)說(shuō)明。
程序如下
- #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為控制輸出信號(hào)的周期的常量 輸出周期=中斷周期*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++);
- }
復(fù)制代碼
|
-
捕獲3.PNG
(22.02 KB, 下載次數(shù): 73)
下載附件
2019-5-6 11:34 上傳
評(píng)分
-
查看全部評(píng)分
|