您的位置:首页 > 其它

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

2014-12-21 13:13 531 查看
// http://blog.csdn.net/yingqiyingqi/article/details/7425047
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: