#include <pic.h>
//該程序用于使CCP1模塊產(chǎn)生分辨率為10位的PWM波形,占空比為50%,根據(jù)PWM_WIDE計(jì)算頻率。proteus仿真通過
//CCP1(CCP2相同設(shè)置)模塊的PWM工作方式初始化子程序(中斷為什么不行呢?)
#define CCP1
#define PWM_WIDE 0x7F
#define PWM_TOTAL PWM_WIDE<<1
void CCPINIT()
{
#ifdef CCP1
CCPR1L = PWM_WIDE;
CCP1CON = 0X3C; //設(shè)置CCP1模塊為PWM工作方式,且其工作
//循環(huán)的低2位為11,高8位為01111111=7F
TRISC &= 0XFB; //設(shè)置CCP1引腳為輸出方式
#else
CCPR2L = PWM_WIDE;
CCP2CON = 0X3C; // CCP2
TRISC &= 0XFD; //設(shè)置CCP2引腳為輸出方式
#endif
PR2=PWM_TOTAL; //設(shè)置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,
//同時(shí)開始輸出PWM波形
while(1) //系統(tǒng)開始輸出PWM波形。如果系統(tǒng)是多任務(wù)的,則可以在此執(zhí)行其它任務(wù),而不會(huì)影響PWM波形的產(chǎn)生
{
if(RD0 == 1)
{
DelayMs(5);
if(RD0 == 1)//設(shè)置條件停止發(fā)送脈沖,中止(步進(jìn)電機(jī)等)設(shè)備
{
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;
}
}
}
}