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