搜索
bottom↓
回复: 7

LGT ICP红外解码 可解重复码(写得比较简单)

[复制链接]

出0入0汤圆

发表于 2012-8-19 16:11:07 | 显示全部楼层 |阅读模式
本帖最后由 liujian6f 于 2012-8-19 21:43 编辑

今天写了下ICP红外解码的程序  可解芯片upd6121 6122 pt2222 sc6121 hs6222 6221

内部16M时钟 红外头数据口 接LGT ICP(PD6)引脚  解码值直接发送到串口显示
水平有限只能这么地写了。
以下是程序
  1. #include <avr/io.h>
  2. #include <lgt.h>
  3. #define F_CPU 16000000
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>

  6. #define uchar unsigned char
  7. #define uint  unsigned int
  8. #define ulong unsigned long
  9. #define delayms(x) _delay_ms(x)
  10. #define delayus(x) _delay_us(x)

  11. uchar i,flag,j,f,icpdat;
  12. uchar irtemp[32]={0};
  13. uchar ircode[4]={0};

  14. void usart_init(ulong buad)
  15. {
  16.         UCSR0A=0X00;
  17.         UBRR0H=(F_CPU/(16*buad)-1)/256;
  18.         UBRR0L=(F_CPU/(16*buad)-1)%256;
  19.         UCSR0B=0X18;
  20.         UCSR0C=0X06;
  21. }
  22. void usart_t(uchar dat)
  23. {
  24.         while(!(UCSR0A&0X20));
  25.         UDR0=dat;
  26. }
  27. void icp_init()
  28. {
  29.         DDRD&=~(1<<6);
  30.         PORTD&=~(1<<6);
  31.         TCCR1A=0X00;
  32.         TCCR1B=0X85;  //开ICP 1024分频 计数一次为 1/16000000/1024=0.064ms
  33.         TIMSK1=0X20;  //开ICP中断
  34.         TIFR1=0X00;
  35.         SREG|=0X80;
  36. }
  37. SIGNAL(TIMER1_CAPT_vect)
  38. {
  39.         TCNT1=0;
  40.         icpdat=ICR1L;                    //只读ICR1L  ICR1H都为0不读  
  41.         if((icpdat>205)&&(icpdat<215))   //判断引导码9+4.5=13.5MS (13.5/0.064=210)
  42.         {
  43.                 f=1;
  44.                 j=0;
  45.         }
  46.         if(f)
  47.         {
  48.                 irtemp[j-1]=icpdat;
  49.                 if(j++==33){j=0;flag=1;f=0;}
  50.         }
  51.         if((icpdat>172)&&(icpdat<177))    //判断重复码9+2.25=11.25MS(11.25/0.064=175)
  52.         {
  53.                 usart_t(0xaa);                      //串口发送重复码标志       
  54.         }
  55.         ICR1L=0;
  56. }
  57. void ir()
  58. {
  59.         uchar i,j;
  60.         for(i=0;i<4;i++)
  61.         {
  62.                 for(j=0;j<8;j++)
  63.                 {
  64.                         ircode[i]>>=1;
  65.                         if(irtemp[i*8+j]>25)      //“0”为1.125MS(1.125/0.064=17)  "1"为 2.25MS(2.25/0.064=35) 大于25为1 小于25为0
  66.                         {
  67.                                 ircode[i]|=0x80;
  68.                         }
  69.                 }
  70.         }
  71. }
  72. int main(void)
  73. {
  74.         CLKPR=0X80;
  75.         CLKPR=0X80;
  76.         icp_init();
  77.         usart_init(9600);
  78.         while(1)
  79.         {
  80.                 if(flag)
  81.                 {
  82.                         ir();
  83.                         for(i=0;i<4;i++)
  84.                         {
  85.                                 usart_t(ircode[i]);       
  86.                         }
  87.                         flag=0;
  88.                 }
  89.                 delayms(1);
  90.         }
  91. }
复制代码

出0入0汤圆

发表于 2012-8-19 16:37:11 | 显示全部楼层
进来学习学习

出0入0汤圆

发表于 2012-8-19 20:53:40 | 显示全部楼层
大力支持。

出0入0汤圆

发表于 2012-8-20 11:47:18 | 显示全部楼层
ICP是挺方便的

出0入0汤圆

发表于 2012-8-28 23:11:51 | 显示全部楼层
留个记号,以后可能用的上

出0入0汤圆

发表于 2013-3-8 00:55:31 | 显示全部楼层
留个记号,以后可能用的上

出0入0汤圆

发表于 2013-3-9 00:30:12 | 显示全部楼层
调试了好长时间。应该是片内的误差比较大,
if((icpdat>205)&&(icpdat<215))   //判断引导码9+4.5=13.5MS (13.5/0.064=210)
用这个范围的引导时间,试了几个遥控器 都不是很灵敏

现在用这个
        if((icpdat>200)&&(icpdat<220))   //判断引导码9+4.5=13.5MS (13.5/0.064=210)
就非常灵敏。。

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 09:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表