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;
}
}
}
}