• 專注電子技術學習與研究
    當前位置:單片機教程網 >> 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;
       }  
      } 
     }
    }

    關閉窗口
    亚洲一区二区制服在线|在绩专区欧美自拍日韩|青春娱乐网97超碰人人射|在线观看国产网址你懂的