//ICC-AVR application builder : 2007-10-22 20:27:27
// Target : M32
// Crystal: 4.0000Mhz
/*数据头的时间: Th=9+4.5=13.5ms
数据“0”的时间:T0=0.565+0.56=1.125ms
数据“1”的时间:T1=1.685+0.56=2.245ms
*/
#include <iom32v.h>
#include <macros.h>
#defineuint unsigned int
#defineuchar unsigned char
unsigned int value=0,oldFall=0,temp=0,newFall=0,shuu=0;
unsigned int data1,data0,bitcnt;
unsigned char jia=0,JS_OK=0;
unsigned int shuju={0},pj=0;
void port_init(void)
{
PORTA = 0x00;
DDRA= 0x00;
PORTB = 0x00;
DDRB= 0x00;
PORTC = 0x00;
DDRC= 0x00;
PORTD = 0x40;
DDRD= 0x00;
}
/*//TIMER1 initialize - prescale:1
// desired value: 1mSec
// actual value:1.000mSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xF0; //setup
TCNT1L = 0x60;
OCR1AH = 0x0F;
OCR1AL = 0xA0;
OCR1BH = 0x0F;
OCR1BL = 0xA0;
ICR1H= 0x0F;
ICR1L= 0xA0;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}*/
//TIMER1 initialize - prescale:1
// desired value: 1uSec
// actual value:1.000uSec (0.0%)
//TIMER1 initialize - prescale:1
// desired value: 1uSec
// actual value:1.000uSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFF; //setup
TCNT1L = 0xFC;
OCR1AH = 0x00;
OCR1AL = 0x04;
OCR1BH = 0x00;
OCR1BL = 0x04;
ICR1H= 0x00;
ICR1L= 0x04;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}
#pragma interrupt_handler timer1_capt_isr:7
void timer1_capt_isr(void)
{
uchar i;
newFall=ICR1;
temp=newFall-oldFall; //计算脉冲加间隔的时间
oldFall=newFall;
if(temp>1024 && temp<1225) // "0"信号
{
temp=0;
}
else if(temp>2145 && temp<2345) //“1”信号
{
temp=1;
}
else if(temp>13400 && temp<13600) //header信号
{
bitcnt=0;
data0=0;
data1=0;
return; //返回,等待下次开始接收
}
else ///干扰信号
{
return;
}
bitcnt++;
if(bitcnt<16) //开始接收前16位
{
data0=data0|(uint)temp;
data0=data0<<1;
}
else if(bitcnt==16)
{
data0=data0|(uint)temp;
}
else if(bitcnt<32) //开始接收后16位
{
data1=data1|(uint)temp;
data1=data1<<1;
}
else if(bitcnt==32) //接收完最后一位
{
data1=data1|(uint)temp;
bitcnt=0;
data0=0;
data1=0;
JS_OK=1;
}
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
MCUCR = 0x00;
GICR= 0x00;
TIMSK = 0x20; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//
void main(void)
{
unsigned char i;
init_devices();
DDRC|=0x80;
PORTC|=0x80; // 一开如测试小灯不亮
while(1)
{
if(JS_OK==1) //接收完32们数据后,灯亮
PORTC&=~0x80;
NOP();
}
} 根本就不能捕获到13.5ms的引导码,32位数据就更不用说了!当点一下,摇控器按钮时,读出temp约为9000 ,应该是9 ms 的低电平,可是我明明设置的是下降沿触发,为什么不能捕获到13.5ms的引导码呢;如果长按按键再松开,temp 值为 4500左右,真是奇了怪了,问题很多啊,希望各位高手赐教! mark 以前想搞,但没有搞到,现在记号下,然后回再学习! mark 好东西,正在学,mark 恩 很好。 这个6121编码是PWM。 有没有PPM的。PPM的解码比这个复杂啊,搞半天没搞出来。 做个记号 曾经的梦想。 mark 先记号一下,回头再看看你的和我的有什么区别。 mark 谢谢楼主 mark hao mark 谢谢!已实现红外解码 强! 跟贴学习!顶 先MRAK慢慢看 mark以后有机会学习学习 谢谢 最近再搞!强贴! mark mark 签收 领了,谢谢 这种方法通用性不好,占用资源太多,很多地方不适用, 囧,刚刚发现了一个可以GPS定位手机位置的网站,真不可思议!可以去看看
http://hd.qu365.com/?P346086 mark 学习ing。。。 记号 MARK mark! mark ding mark 学习· 我用这个解码程序来改成icp3的,但是不成功!不知道是何故,数据加到“else if(bitcnt==16) ”这里,就不再执行了???????????? 好~~~~ 先说声谢了!!! 顶一下 mark MARK mark mark!! 谢谢楼主 真的太感谢您啦程序可以 谢谢!!! 标志位检测,好 mark 学习!!!!! mark mark mark 学习 mark! MARK 学习了 mark,正准备做这方面的,谢谢! 帮顶 回复【楼主位】lonelynw 阿水
-----------------------------------------------------------------------
好贴,对我有很大的帮助啊。谢谢了! mark 好东西 学习了,哈哈 请问楼主:
数字机顶盒上的红外遥控器初始使用的时候,和电视的红外是不相匹配的.
需要将和电视匹配的遥控器进行匹配,然后就可以使用.
请问这个机顶盒遥控器和电视机遥控器匹配的过程也是个解码的过程?能详细描述下吗? {:smile:}
mark 啊莫终于恢复正常了!!等了n久 继续为大家贡献资料哦 Mark有空试试
页:
1
[2]