如何利用单片机自带的PWM功能产生可调PWM波,求相应程序,谢谢!!

如题所述

#include<reg52.h>
sfr CCON =0xD8;
sfr CMOD =0xD9;
sfr CCAPM0 =0xDA;
sfr CCAPM1 =0xDB;
sfr CCAPM2 =0xDc;
sfr CCAPM3 =0xDd;
sfr CL =0xE9;
sfr CH =0xF9;
sfr CCAP0L =0xEA;
sfr CCAP0H =0xFA;

sfr CCAP1L =0xEb;
sfr CCAP1H =0xFb;
sfr CCAP2L =0xEc;
sfr CCAP2H =0xFc;

sfr CCAP3L =0xEd;
sfr CCAP3H =0xFd;
sbit CR =0xDE;
voidinit_pwm()
{
//定时器的来源CPS1,CPS0
CMOD=0x02;//Setup PCA timer
CL=0x00;
CH=0x00;

}
//控制占空比
voidpulse_0(unsigned char p_on)
{
CCAP0L=p_on;//Set the initial value same asCCAP0H
CCAP0H=p_on;//
//CCAPMn.1使能脉宽调制模式,EC0M必须=1
CCAPM0=0x42;//0100,0010 Setup PCA module 0in PWM mode
}
voidpulse_1(unsigned char p_on)
{
CCAP1L=p_on;//Set the initial value same asCCAP0H
CCAP1H=p_on;//25% Duty Cycle
//CCAPMn.1使能脉宽调制模式,EC0M必须=1
CCAPM1=0x42;//0100,0010 Setup PCA module 0in PWM mode
}
voidpulse_2(unsigned char p_on)
{
CCAP2L=p_on;//Set the initial value same asCCAP0H
CCAP2H=p_on;//25% Duty Cycle
//CCAPMn.1使能脉宽调制模式,EC0M必须=1
CCAPM2=0x42;//0100,0010 Setup PCA module 0in PWM mode
}
voidpulse_3(unsigned char p_on)
{
CCAP3L=p_on;//Set the initial value same asCCAP0H
CCAP3H=p_on;//25% Duty Cycle
//CCAPMn.1使能脉宽调制模式,EC0M必须=1
CCAPM3=0x42;//0100,0010 Setup PCA module 0in PWM mode
}
voiddelay(int a)
{
int i;
for(i=0;i<a;i++);
}
voidmain(void)
{
unsigned char i=0;
init_pwm();
CR=1; //Start PCA Timer
while(1)
{
while(++i)
{
pulse_0(i+50);
pulse_1(i+100);
pulse_2(i+150);
pulse_3(i+200);
delay(1000);

}
while(--i)
{
pulse_0(i+50);
pulse_1(i+100);
pulse_2(i+150);
pulse_3(i+200);
delay(1000);

}
}
}
温馨提示:答案为网友推荐,仅供参考