采用中断方式,通过两个脉冲之间的间隔来确定0和1,用一个定时器来量两个脉冲之间的时间。
#include "config.h" /* lib configuration header */ #include "remote_drv.h" #include "lib_mcu imer imer_drv.h" /* timer driver definition */ #include "lib_mculcdlcd_drv.h" #include "lib_mcukbdkey_drv.h" /* Keyboard driver definition */ #include <stdio.h>
INT8U gl_rmt; bit gl_rmt_ok;
INT32U u32RmtValue; /*用于存放接收到的遥控信号*/ INT8U u8BitPoint; INT8U u8ReceiveEnd;
///////////////////////////////////////////////////////////////////////////// void remote_disable(void) { EX1 = 0; }
///////////////////////////////////////////////////////////////////////////// void remote_enable(void) { u32RmtValue = 0; //32bit receive value = 0 u8ReceiveEnd = 0; //not start to receive u8BitPoint = 0; //bit point reset gl_rmt = 0xff; gl_rmt_ok = FALSE; EX1 = 1; //enable ext1 interrupt }
///////////////////////////////////////////////////////////////////////////// void t1_remote_init(void) { T1_init(0,0,0x10); //T1工作于方式1,16BIT计数器 T1_start(); //开计数器1,用于判断遥控脉冲周期 IT1 = 1; //外部中断INT1管脚电平下降沿触发中断 remote_enable(); }
///////////////////////////////////////////////////////////////////////////// INT8U remote_value(void) { INT8U u8Value;
if(gl_rmt_ok == TRUE) { switch(gl_rmt) { case 0x90: u8Value = REMOTE_0; break; case 0x00: u8Value = REMOTE_1; break; case 0x10: u8Value = REMOTE_2; break; case 0x08: u8Value = REMOTE_3; break; case 0x18: u8Value = REMOTE_4; break; case 0x04: u8Value = REMOTE_5; break; case 0x14: u8Value = REMOTE_6; break; case 0x0c: u8Value = REMOTE_7; break; case 0x1c: u8Value = REMOTE_8; break; case 0x80: u8Value = REMOTE_9; break; case 0x50: u8Value = REMOTE_CHUP; break; case 0x48: u8Value = REMOTE_CHDN; break; case 0x4c: u8Value = REMOTE_MUTE; break; case 0x40: u8Value = REMOTE_POWN; break; case 0x44: u8Value = REMOTE_VOUP; break; case 0x54: u8Value = REMOTE_VODN; break; case 0xd8: u8Value = REMOTE_CALL; break; case 0xcc: u8Value = REMOTE_LUUP; break; case 0xdc: u8Value = REMOTE_LUDN; break; case 0x88: u8Value = REMOTE_10UP; break; case 0xe8: u8Value = REMOTE_TIME; break; case 0xec: u8Value = REMOTE_NONE; break; default : u8Value = REMOTE_NONE; break; } remote_disable(); return (u8Value); } else return (0xff); }
////////////////////////////////////////////////////////////////////////////////// Interrupt(remote_int(void), IRQ_INT1) { INT8U bTbit; INT8U i; INT16U u16TimeValue;
EX1 = 0; //关中断
T1_stop(); //关定时器 u16TimeValue = TH1; //取定时器值 u16TimeValue <<= 8; u16TimeValue += TL1; TH1 = 0x00; TL1 = 0x00; T1_start(); //开定时器
if((u16TimeValue > 1800)&&(u16TimeValue < 2200)) bTbit = 1; else if((u16TimeValue > 900)&&(u16TimeValue < 1100)) bTbit = 0; //判断出得到的位是1还是0 if(u8BitPoint < 32) { u32RmtValue += bTbit; u8BitPoint ++; u32RmtValue <<= 1; } else { u8ReceiveEnd = 1; u8BitPoint = 0; }
if(u8ReceiveEnd == 1) //收满4个字节的数据后,进行字节内容判断 { for(i=0; i<16; i++) { if((u32RmtValue & 0xff000000) == 0xe2000000) { gl_rmt = (u32RmtValue >> 16); gl_rmt_ok = TRUE; break; } else { u32RmtValue <<= 1; } } u8ReceiveEnd = 0; u32RmtValue = 0; }
EX1 = 1; } |