pic单片机ccp脉冲捕捉c语言程序,pic单片机CCP脉冲(PWM)输出

#include 

//该程序用于使CCP1模块产生分辨率为10位的PWM波形,占空比为50%,根据PWM_WIDE计算频率。proteus仿真通过

//CCP1(CCP2相同设置)模块的PWM工作方式初始化子程序(中断为什么不行呢?)

#define CCP1

#define PWM_WIDE   0x7F

#define PWM_TOTAL PWM_WIDE<<1

void CCPINIT()

{

#ifdef CCP1

CCPR1L = PWM_WIDE;

CCP1CON = 0X3C;      //设置CCP1模块为PWM工作方式,且其工作

//循环的低2位为11,高8位为01111111=7F

TRISC  &= 0XFB;      //设置CCP1引脚为输出方式

#else

CCPR2L = PWM_WIDE;

CCP2CON = 0X3C;   // CCP2

TRISC  &= 0XFD;      //设置CCP2引脚为输出方式

#endif

PR2=PWM_TOTAL;       //设置PWM的工作周期

INTCON &= 0X00;      //禁止总中断和外围中断

}

void DelayMs(unsigned int ms)

{

unsigned char i;

while(--ms)

{

for(i=110;i>0;--i);

}

}

//主程序

main()

{

TRISD = 0xff;

CCPINIT();        //CCP1模块的PWM工作方式初始化

T2CON |= 0X04;    //打开TMR2,且使其前分频为0,

//同时开始输出PWM波形

while(1)          //系统开始输出PWM波形。如果系统是多任务的,则可以在此执行其它任务,而不会影响PWM波形的产生

{

if(RD0 == 1)

{

DelayMs(5);

if(RD0 == 1)//设置条件停止发送脉冲,中止(步进电机等)设备

{

T2CON &= 0xFB;

#ifdef CCP1

CCPR1L=0;

#else

CCPR2L=0;

#endif

PR2=0;

while(!RD0);

}

else

{

T2CON |=0X04;

#ifdef CCP1

CCPR1L = PWM_WIDE;

#else

CCPR2L = PWM_WIDE;

#endif

PR2 = PWM_TOTAL;

}

}

}

}