|
发表于 2009-7-11 11:08:06
|
显示全部楼层
#include <pic.h>
const unsigned int Sin[100] = {100,100,101,103,105,107,109,112,116,120,124,128,133,139,144,150,157,163,170,178,185,193,202,210,219,229,238,248,258,268,279,289,300,312,323,334,346,358,370,382,394,407,419,432,445,457,470,483,496,509,521,534,547,560,572,585,598,610,623,635,647,659,671,683,694,705,717,728,738,749,759,769,779,788,798,807,815,824,832,839,847,854,860,867,873,878,884,889,893,897,901,905,908,910,912,914,916,917,917,917};
static unsigned int step;
unsigned long int longbuf;
unsigned int tempint;
unsigned char tempchar, datamul;
bit Fbit;
unsigned char adcnt;
void main (void)
{
//-------------------------------------var initlize.
step = 49;
Fbit = 1;
datamul = 255; //must be low 63.
//-------------------------------------initlize.
PORTB = 0xFF;
TRISB = 0x00;
TRISA0 = 1;
TRISC2 = 0; // 883的RC2
TMR2 = 0;
T2CON = 0x08;
PR2 = 251; //100; //频率修改 251-----51.10HZ
TMR2IF = 0;
TMR2IE = 1;
CCP1CON = 0x8F;
PWM1CON = 0x8f; //死区控制 84 ---0.8US 85 ----1US
ECCPAS = 0x05;
TMR2ON = 1;
ADCON0 = 0xC1;
ADCON1 = 0x04;
ADIF = 0;
ADIE = 0;
PEIE = 1;
GIE = 1;
//-------------------------------------main code.
while(1)
{
NOP();
if(adcnt > 32)
{
adcnt = 0;
ADIF = 0;
GODONE = 1;
NOP();
NOP();
NOP();
// if(ADIF == 1) // AD控制
// datamul = ADRES; // AD控制
}
adcnt ++;
}
}
void interrupt ISR (void)
{
if (TMR2IE && TMR2IF)
{
TMR2IF = 0;
// = 1;
if (Fbit)
{
step ++;
if(step == 100)
{
Fbit = 0;
//step --;
}
}
else
{
step --;
if (step == 1)
{
Fbit = 1;
// step ++;
}
}
longbuf = Sin[step -1];
if (step > 50)
{
longbuf = (longbuf - 509) * datamul;
tempint = longbuf >> 8;
tempint += 509;
}
else
{
longbuf = (509 -longbuf) * datamul;
tempint = longbuf >> 8;
tempint = 509 - tempint;
}
//longbuf =longbuf * datamul;
//tempint = longbuf >> 8; //datamul <= 255;
CCPR1L = tempint >> 2;
tempchar = tempint;
tempchar <<= 4;
CCP1CON = (CCP1CON & 0xCF) | (tempchar & 0x30);
RB4 = 0;
}
} |
|