专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

pic单片机CCP脉冲(PWM)输出

作者:佚名   来源:不详   点击数:  更新时间:2014年08月31日   【字体:

#include  <pic.h>
//该程序用于使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;
   }  
  } 
 }
}

关闭窗口