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