找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6710|回复: 3
收起左侧

diy红外遥控解码器

  [复制链接]
ID:85764 发表于 2015-7-18 14:27 | 显示全部楼层 |阅读模式
上次从本坛安鑫老板那买了几个遥控器,质量还不错,昨天没事干,研究了一下,做个接收的程序,暂时能解码了undefined,也不知道对不对,发上来跟大伙共享一下,希望高手再改进改进
082132axtxjo7nn9czjdfn.jpg.thumb.jpg


082122drzsysa6gjyau0xr.jpg.thumb.jpg


082128j2ql8p6xs9hos27i.jpg.thumb.jpg

  1. #ifndef _IR_H_
  2. #define _IR_H_

  3. unsigned char IRkeylong;//遥控按键长按标识
  4. unsigned char IRtime;//红外时间
  5. unsigned char IRrec;//红外接收
  6. unsigned char IRdata[17];//接收到的红外数据(二进制)
  7. unsigned char IRdatabit;//红外数据的位
  8. unsigned char IRrecok;//红外接收完毕标识
  9. unsigned char IRkeycode[2];//红外按键键值(16进制)
  10. unsigned char IRchangeok;//红外码转换完毕标识(二进制转十六进制)

  11. void init_timer0()//初使化定时器0
  12. {
  13.         EA=1;//开总中断
  14.         TMOD=0x02;//定时器工作模式为2(8位初值自动重装的8位定时器)
  15.         TH0=0x00;//赋初值
  16.         TL0=0x00;//赋初值
  17.         ET0=1;//开定时器0中断
  18.         TR0=1;//打开定时器
  19. }

  20. void init_int0()//外部中断0初使化
  21. {
  22.         EA=1;//开总中断
  23.         EX0=1;//开外部中断0中断
  24.         IT0=1;//负跳沿触发方式
  25. }

  26. void IRchange()//红外转换函数(二进制转十六进制)
  27. {
  28.         unsigned char x,y,IRdatabit;
  29.         unsigned char value;//值,用于暂存红外键值用
  30.         IRdatabit=1;//红外数据第0位为引导码(检测用)从第1位开始才是有用的红外码
  31.         if(IRrecok)//开始进行红外转换
  32.         {
  33.                 for(x=0;x<2;x++)//得到2个8位键值码(16进制码)
  34.                 {
  35.                         for(y=0;y<8;y++)//转换二进制的0        和1
  36.                         {
  37.                                 value=value>>1;//右移一次,使最高位为0;
  38.                                 if(IRdata[IRdatabit]>5)//当红外数据数组中的'位'大于1ms时
  39.                                 {
  40.                                         value=value|0x80;//得到最高位
  41.                                 }
  42.                                 IRdatabit++;//数组中的'位'自加1
  43.                         }
  44.                         IRkeycode[x]=value;//将得到值保存到红外键值的数组中
  45.                 }
  46.                 IRchangeok=1;//相反转换标识为1
  47.                 IRrecok=0;//接收标识置0,等待下一次接收
  48.         }
  49. }

  50. void timer0() interrupt 1//定时器中断函数
  51. {
  52.         IRtime++;//红外时间自加1;
  53. }

  54. void int0() interrupt 0//外部中断函数
  55. {
  56.         if(IRrec)//开始接收
  57.         {
  58.                 if(IRtime>10) //检测引导码
  59.                 {
  60.                         IRdatabit=0;
  61.                         IRkeylong=1;//用于检测按键是否长按下
  62.                 }
  63.                 IRdata[IRdatabit]=IRtime;//将得到的红外时间保存到红外数据数组中
  64.                 IRtime=0;//红外时间清0
  65.                 IRdatabit++;//'位'自加1
  66.                 if(IRdatabit==17)//接收完成
  67.                 {
  68.                         IRdatabit=0;//将线外数据中的位清0
  69.                         IRrecok=1;//红外码接收完成标识
  70.                         IRrec=0;//将红外接收置0,准备下次接收
  71.                 }        
  72.         }
  73.         else//起始状态
  74.         {
  75.                 IRrec=1;
  76.                 IRtime=0;
  77.         }
  78. }

  79. #endif
复制代码
  1. #include
  2. #include
  3. #include

  4. #define uint unsigned int//宏定义
  5. #define uchar unsigned char//宏定义
  6. sbit SPEAK=P3^7;

  7. uchar code num[]={"0123456789abcdef"};

  8. void delay_ms(uint z)//延时毫秒
  9. {
  10.         uint x;uchar y;
  11.         for(x=z;x>0;x--)
  12.                 for(y=114;y>0;y--);
  13. }

  14. /*****延时微秒*****/        
  15. void delay_us(uint x)
  16. {
  17.         while(x--);
  18. }

  19. /*****蜂鸣提示*****/
  20. void beep(uchar YD,YC) //YD为音调,YC为音长
  21. {
  22.         uchar x;
  23.         for(x=0;x<yc;x++)
  24.         {
  25.                 SPEAK=~SPEAK;
  26.                 delay_us(YD);//音调
  27.     }
  28.         SPEAK=1;
  29. }

  30. /*****主程序*****/
  31. void main()
  32. {
  33.         uchar clr=1;//清屏用
  34.         init_timer0();//初使化定时器0
  35.         init_int0();//初使化外部中断0
  36.         init12();//初使化12864液晶
  37.         w12_com(0x01);
  38.         dis_str(0x80,"IR解码  By: ain365  ",20);
  39.         dis_str(0x90,"- ^ ^ - 按任意键开始",20);
  40.         while(1)
  41.         {
  42.                 IRchange();
  43.                 if(IRchangeok)
  44.                 {
  45.                         while(clr)//清屏一次
  46.                         {
  47.                                 w12_com(0x01);
  48.                                 clr=0;
  49.                         }
  50.                         beep(50,100);//声音提示
  51.                         dis_str(0x80,"  前 8位码  --  --  ",20);
  52.                         dis_str(0x90,"  后 8位码  --  --  ",20);
  53.                         w12_word(0x87,num[IRkeycode[0]/16],num[IRkeycode[0]%16]);
  54.                         w12_word(0x97,num[IRkeycode[1]/16],num[IRkeycode[1]%16]);
  55.                         
  56.                         IRchangeok=0;
  57.                         IRkeylong=0;
  58.                 }
  59.                 delay_ms(500);
  60.                 IRchange();
  61.                 if(IRkeylong)
  62.                 {
  63.                         beep(50,100);
  64.                         IRkeylong=0;
  65.                 }
  66.         }
  67. }
复制代码


12864中断方式.rar (44.39 KB, 下载次数: 41)
回复

使用道具 举报

ID:92810 发表于 2015-10-23 17:31 | 显示全部楼层
好样的。。。。
回复

使用道具 举报

ID:135832 发表于 2017-3-22 18:58 | 显示全部楼层
插个眼
回复

使用道具 举报

ID:67366 发表于 2017-10-5 12:23 | 显示全部楼层
学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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