1、可用两个定时器,第一用作定时占空比,并且执行一次就关闭,由另外一个定时器开启,另外一个定时器作为定时周期。
//----------发送命令变量----------------------------
static unsigned int current; //延时计数器
static unsigned char irdata_silent[]={0,1,0,1,2,0,1,0,1,2,0,1,0,1,2}; //kaiji指令
static unsigned char irdata_TurnOn[]={1,0,1,0,2,1,0,1,0,2,1,0,1,0,2};//guanji zhiling
/***************************************************************
*总体格式:静默指令(共三帧指令):0101 S 0101 S 0101 S(左移) ASASAS
* 开启指令(共三帧指令):1010 S 1010 S 1010 S(左移) 5S5S5S
*左移:0101,0x05,开;1010,0x0A,关;“S”代码(STOP):1mS高电平+9mS低电平
***************************************************************/
void SendCommand(unsigned char data)
{
p_irdate = data;
switch(p_irdate)
{
case 0: Timer01_Init(); //1ms
Timer35_Init(); //5ms
break;
case 1: Timer04_Init(); //4ms
Timer35_Init(); //5ms
break;
case 2: Timer01_Init(); //1ms
Timer310_Init(); //10ms
break;
}
T0CONbits.TMR0ON = 1;
T3CONbits.TMR3ON = 1;
Command_Out = 1;
}
/*******************************
*中断处理函数
*******************************/
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm goto high_isr _endasm
}
#pragma code
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
_asm goto low_isr _endasm
}
#pragma code
#pragma interrupt high_isr
void high_isr(void) //TMR0
{
if(INTCONbits.TMR0IF==1)
{
INTCONbits.TMR0IF=0;
Command_Out = !Command_Out;
mLED_1_Off();
T0CONbits.TMR0ON = 0;
}
}
#pragma interruptlow low_isr
void low_isr(void)
{
if(PIR2bits.TMR3IF==1)
{
PIR2bits.TMR3IF=0;
Command_Out = 1;
mLED_1_On();
current++;
if(current<15)
{
SendCommand(irdata_silent[current]);
}
else
{
current =0;
SendCommand(irdata_silent[current]);//
}
//T3CONbits.TMR3ON = 0;
//T0CONbits.TMR0ON = 1;
}
}
|