单片机学习小组
直播中

高媛

7年用户 162经验值
私信 关注

PIC16F914输出可调占空比PWM波形程序

#include
typedef unsigned int uint;
typedef unsigned char uchar;
#define KEY0_DOWN()  (RB4==0)//定义按键按下
__CONFIG(0X1014);//内部时钟
uchar KEY0_FLAG=0;
/*************************/
//OSC SET; INTER 4MHZ PERIOD 1US
/*************************/
void OSC_INIT()
{
   OSCCON=0X67;//设置内部时钟4MHZ
}
/*************************/
//DELAY FUNCtiON();
/*************************/
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}
/*************************/
//GPIO SET;
/*************************/
void GPIO_INIT()
{
   TRISC5=0;//RC5 SET PWM OUT;
   TRISD2=0;//RD2 SET PWM OUT;
   RC5=RD2=0;
   TRISB4=1;
   IOCB4=1;//使能RB4电平变化中断
   WPUB=0X10;//使能上拉
   RBIE=1;
   RBIF=0;
   PEIE=1;
   GIE=1;
}
/*************************/
//PWM MODEL INIT;
/*************************/
void PWM_INIT()
{
   CCP1CON=0B00001100;//PWM 模式
   CCP2CON=0B00001100;//PWM 模式
   T2CKPS1=1;
   PR2=155;//PWM周期=【PR2+1】*4*TOSC*T2预分频值 故PWM频率=1/周期=400HZ
   TMR2ON=1;
   CCPR1L=0;//占空比=CCPR1L:CCP1CON<5:4>/4(PR2+1);
   CCPR2L=0;//占空比=CCPR2L:CCP2CON<5:4>/4(PR2+1);
}
void main()
{
   GPIO_INIT();
   PWM_INIT();
   while(1);//初始化完毕等中断响应就OK
}  

//中断响应入口
void interrupt ALL_ISR()//输出10%-100%占空比的PWM波形
{
   if(RBIF)
     {
      delay(5);
      if(KEY0_DOWN())
         {
             KEY0_FLAG++;
             if(KEY0_FLAG==11)KEY0_FLAG=0;
         }
      switch(KEY0_FLAG)
           {
              case 0:CCPR1L=CCPR2L=0;break;
              case 1:CCPR1L=CCPR2L=16;break;
              case 2:CCPR1L=CCPR2L=32;break;
              case 3:CCPR1L=CCPR2L=47;break;
              case 4:CCPR1L=CCPR2L=62;break;
              case 5:CCPR1L=CCPR2L=78;break;
              case 6:CCPR1L=CCPR2L=94;break;
              case 7:CCPR1L=CCPR2L=109;break;
              case 8:CCPR1L=CCPR2L=125;break;
              case 9:CCPR1L=CCPR2L=141;break;
              case 10:CCPR1L=CCPR2L=156;break;
              default:break;
           }
        RBIF=0;
    }

}

更多回帖

发帖
×
20
完善资料,
赚取积分