您的位置:首页 > 其它

stm8 红外解码 使用TL IO中断与定时实现(芯片用103)

2012-04-04 10:20 519 查看
void EXTI_init(void)
{
EXTI_CR1_PCIS = 2;           // PC口下降沿触发中断
}

void TIM1_init(void)
{
CLK_PCKENR1|=0x80;       //开启定时器1外设时钟

TIM1_PSCRH = 0;       // 8M系统时钟经预分频f=fck/(PSCR+1)
TIM1_PSCRL = 15;       // PSCR=0x1F3F,f=8M/(15+1)=1/2MHz,每个计数周期2US
TIM1_ARRH  = 0xff;       // 自动重载寄存器ARR=0xffff=130ms
TIM1_ARRL  = 0xff;
TIM1_IER_UIE = 1;         // 允许更新中断
TIM1_EGR_UG  = 1;          //产生更新事件
TIM1_CR1_ARPE   = 1;       // 自动装载
TIM1_CR1_CEN    = 0;       // 禁止计数 定时器1关

}

#pragma vector=0x02
__interrupt void EXTI_PC3_TLI(void)
{
switch(IR_ID)
{
//解码开始
case 0:
{
IR_ID=1;
TIM1_CR1_CEN =1;
TIM1_CNTRH=0;
TIM1_CNTRL=0;
}
break;
//同步码头
case 1:
{
TIM1_CR1_CEN =0;                  //定时器1关
HIGH_WORD=TIM1_CNTRH;             //保存高低字节
LOW_WORD=TIM1_CNTRL;
TIM1_CNTRH=0;
TIM1_CNTRL=0;
TIM1_CR1_CEN =1;                  //定时器1开
SURGE_INTERVAL=0;                 //测量数据整开
SURGE_INTERVAL=(u16)HIGH_WORD;
SURGE_INTERVAL=SURGE_INTERVAL<<8;
SURGE_INTERVAL=SURGE_INTERVAL|LOW_WORD;
bak1=SURGE_INTERVAL;
nop();
//引导码捕捉
if(SURGE_INTERVAL>=6300&&SURGE_INTERVAL<=7300)
{
IR_ID=2;                       //遥控头获得位置1
SURGE_COUNT=0;
}
else
{
IR_ID=0;
}
}
break;
//解码
case 2:
{
TIM1_CR1_CEN =0;                  //定时器1关
HIGH_WORD=TIM1_CNTRH;             //保存高低字节
LOW_WORD=TIM1_CNTRL;
TIM1_CNTRH=0;
TIM1_CNTRL=0;
TIM1_CR1_CEN =1;                 //定时器2开
SURGE_INTERVAL=0;                //测量数据整开
SURGE_INTERVAL=(u16)HIGH_WORD;
SURGE_INTERVAL=SURGE_INTERVAL<<8;
SURGE_INTERVAL=SURGE_INTERVAL|LOW_WORD;
if(SURGE_COUNT<32)
{
if(SURGE_INTERVAL>=500&&SURGE_INTERVAL<=650)//0码
{
IR_CODE=IR_CODE<<1;
SURGE_COUNT++;
}
else if(SURGE_INTERVAL>=1000&&SURGE_INTERVAL<=1300)//1码
{
IR_CODE=IR_CODE<<1;
IR_CODE=IR_CODE|0x0001;
SURGE_COUNT++;
}
else
{
IR_ID=0;
IR_CODE=0;
SURGE_COUNT=0;
}
break;
}
else
{
IR_COMPLAT=1;
IR_ID=3;
SURGE_COUNT=0;
IR_REPEAT_COUNT=0;             //IR重复码清零
break;
}
}
break;
case 3:
{
TIM1_CR1_CEN =0;                  //定时器1关
HIGH_WORD=TIM1_CNTRH;             //保存高低字节
LOW_WORD=TIM1_CNTRL;
TIM1_CNTRH=0;
TIM1_CNTRL=0;
TIM1_CR1_CEN =1;                 //定时器1开
SURGE_INTERVAL=0;                //测量数据整开
SURGE_INTERVAL=(u16)HIGH_WORD;
SURGE_INTERVAL=SURGE_INTERVAL<<8;
SURGE_INTERVAL=SURGE_INTERVAL|LOW_WORD;
if(SURGE_INTERVAL>=5000&&SURGE_INTERVAL<=8000)      //100ms为连加信号
{
IR_REPEAT_FOLLOW_UP=1;
IR_ID=3;
if(IR_REPEAT_COUNT<250)
{
IR_REPEAT_COUNT++;
}
}
}
break;
default:
break;
}
}

#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF(void)
{
TIM1_SR1 = 0;                   // 清除更新中断标记
TIM1_CNTRH=0;
TIM1_CNTRL=0;
IR_ID=0;
printf("连按次数: %d\n\r", IR_REPEAT_COUNT);
TIM1_CR1_CEN =0;
IR_REPEAT_COUNT=0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: