标题: 红外遥控码值测试 [打印本页]

作者: benbens    时间: 2015-7-15 00:18
标题: 红外遥控码值测试
本帖最后由 benbens 于 2015-7-15 00:19 编辑

       前不久迷上了红外遥控解码,虽然自己在学校时曾经研究过,但一直没有搞清楚。温故而知新,加上得到一大神指点,让我茅塞顿开。
       当一个红外遥控器的按键按下去时,共有四组数据发送出去了,第一组是低8位用户码, 第二组是高8位用户码,第三组是数据码, 第四组是数据反码。  用户码也叫引导码,用来区别不同的遥控器,数据码也叫按键码,用来区别不同的按键。数据反码就是数据码取反之后,用来进行数据校验的。
        自己手头的有一块0802的液晶显示模块,刚好利用起来,做一个红外遥控码值测试的工具。 主控芯片用的是STC89C52RC单片机, 用它主要是因为这片单片机一直闲置在这里,大家也可以把程序移植到其它型号的单片机上(移植时注意延时函数)。想到只用来测试红外遥控码值太可惜这片单片机和0802液晶显示屏了,何不加上其它功能?手上有DS1302时钟芯片,用来做一个万年历在合适不过了,再用一个拨动开关来切换码值测试功能和时钟功能(拨动开关后要重启一下)。STC89C52RC有好多IO口,索性再加蜂鸣器和LED。

码值测试功能:当解码出四组数据后蜂鸣器滴一声,LED闪烁一下。
时钟功能:1.当按键按下蜂鸣器滴一声 2.每当到整点的时候,蜂鸣器滴一声(整点报时)。
以下是实物效果图:

依次是 年 月 日 星期 时 分

照片名称:红外解码-1
所属相册:电子DIY

首次开机,没有接收到红外信号时显示

照片名称:红外解码-3
所属相册:电子DIY

接收到红外信号并成功解码时
引导码:0x00ff    按键码:0x01  按键反码:0xfe

照片名称:红外解码-2
所属相册:电子DIY

整体效果图

照片名称:红外解码-4
所属相册:电子DIY

供电电源采取USB供电,直接插电脑或者手机充电器就行了。。。。   
        我是直接现场发挥,没有画电路图,大家也可以从我的程序里看出电路的连接,鉴于我菜鸟般的编程能力,我就不全部把程序公布出来,只给出关键程序。需要的童鞋也可以留下邮箱,我可以发给你。

1. IO接口定义
unsigned char IR_code[4] = {0,0,0,0};//存放四组数据
sbit fmq=P1^0;//蜂鸣器接口
sbit RS=P1^1;
sbit RW=P1^2;
sbit EN=P1^3;
sbit mode=P1^4;//模式选择接口
sbit IR_Out = P3^2;   // 此口为红外信号输入MCU口
sbit led=P3^7;
sbit mos_key=P1^6;
sbit up_key=P1^5;
sbit down_key=P3^6;

sbit CE=P2^5;                     //DS1302片选口
sbit IO=P2^6;                     //DS1302数据口
sbit SCLK=P2^7;                   //DS1302时钟口
2. 0802液晶驱动程序
void write_com(unsigned char com) //写指令
{
         RW=0;
         RS=0;
         EN=0;
         P0=com;
         EN=1;
         delayms(5);
         EN=0;
}
void write_dat(unsigned char dat)//写数据
{
         RW=0;
         RS=1;   
         EN=0;
         P0=dat;
         EN=1;
         delayms(5);
         EN=0;
}
void lcdIR_init()
{
     EA = 1;               // CPU准许中断
     delayms(400);
     write_com(0x3c); //8位数据总线,两行显示模式,5*10点阵
     write_com(0x01); //清显示
     write_com(0x0c); // 开显示,关闭光标,关闭闪烁
     write_com(0x80);
     write_dat('B');
     write_dat('C');
     write_dat(':');
     write_com(0x80+5);
     write_dat('-');
     write_com(0xc0);
     write_dat('K');
     write_dat('C');
     write_dat(':');
     write_com(0xc0+5);
     write_dat('-');
}
void lcdtime_init()
{
     EA = 0;               // CPU不准许中断
     delayms(400);
     write_com(0x3c); //8位数据总线,两行显示模式,5*10点阵
     write_com(0x01); //清显示
     write_com(0x0c); // 开显示,关闭光标,关闭闪烁
     write_com(0x80);
     write_dat(' ');
     write_dat(' ');
     write_dat('-');
     write_dat(' ');
     write_dat(' ');
     write_dat('-');
     write_dat(' ');
     write_dat(' ');
}
3. 红外解码程序
/*------------------------------------------------------------*-
  函数名称:Int0()
  函数输入:无(容许中断时,外部触发)
  函数输出:无
  函数说明:外部中断0中断处理
-*------------------------------------------------------------*/
void Int0() interrupt 0
{
     unsigned char i,j;
     EX0 = 0;   // 关闭外部中断0
     i = 10;    // 0.793ms延时,运行10次
     while( --i )
     {
          // 定时0.793ms,延时0.793ms*10=7.93ms
          Delay793us();
          // 这7.93ms期间只要IR_Out变高电平,就非合法的红外信号,跳出
          if( IR_Out )
          {
               EX0 = 1; // 准许中断
               return ;
          }
     }

// 程序进行到这里,表明是合法的红外信号(利用9ms判断)
while( !IR_Out ); // 等待9ms低电平过去
// 程序进行到这里,表明经过9ms低电平
Delay2305us();     // 延时2.305ms
// IR_Out 为低表明是连发码,不予理睬,跳出
if( !IR_Out )
{
      EX0=1;
      return;
}
// 程序进行到这里,表明是引导码,等待4.5ms高电平的过去
while( IR_Out );
// 开始接收四组数据
for(i=0; i<4; i++)
  {
      for(j=0; j<8; j++)
      {
           while( !IR_Out ); // 等待低电平过去
               IR_code[ i] >>= 1;  // 把上次的数据位右移一位
         Delay793us();     //延时0.793ms
       // 若为数据"1",则延时后IR_Out为高电平
         if( IR_Out )
          {
                IR_code[ i] |= 0x80;  // 所有数据位1放最高位
                while( IR_Out ); // 等待高电平过去
          }
      }
   }  
//IR_code[0]低8位用户码,IR_code[1]高8位用户码,IR_code[2]为数据码,IR_code[3]为数据反码----dat为二进制
  if (IR_code[2]!=~IR_code[3]) //数据码校验
    {
          EX0=1;
          return;
     }
         fmq=led=0;
         diaplay_IRcode(0,0x80+3);
         diaplay_IRcode(1,0x80+6);
         diaplay_IRcode(2,0xc0+3);
         diaplay_IRcode(3,0xc0+6);
          EX0=1;  // 开中断
        return;
}
4. 主函数
void main()
{  
     IR_Out = 1;              // 此口为MCU输入口,故需要置1
     IT0 = 1;              // 外部中断0,下降沿触发
     EX0 = 1;              // 准许外部中断
     while(1)
     {  
           while(mode==1)
           {
                    lcdIR_init();
                   while(1)
                        fmq=led=1;
          }
          while(mode==0)
          {
                   lcdtime_init();
                   while(1)
                        display_settime();
          }
     }
}




作者: bhjyqjs    时间: 2015-7-16 16:22
思路清晰,好程序
作者: wgw020    时间: 2015-9-25 10:36
能把电路图和程序发给我学习吗
作者: HEIZI555    时间: 2015-11-17 15:14
写得不错,把完事程序发与我吧,邮箱 185478492@qq.com
作者: robter    时间: 2016-6-30 11:45
很好很好,也想做一个,我的邮箱:912503475@qq.com,谢谢
作者: robter    时间: 2016-6-30 14:21
做工不错,找时间也做一下
作者: 张明明    时间: 2016-9-11 10:18
1430969765@qq.com  谢谢啦
作者: dxa572862121    时间: 2016-9-20 16:21
搞懂了挺简单的。
作者: lzydtj    时间: 2016-9-27 14:32
很好!也想做一个,我的邮箱:158916715@qq.com,谢谢
作者: at87c573    时间: 2016-10-11 13:42
能否发一份给我参考一下,正需要这样的东西来测试编码,是否所有的编码都能解出?请发160222849@qq.com,谢谢!
作者: 梦想家1314    时间: 2016-10-12 19:05
楼主,你这只是NEC协议的,你试一下空调100多位杂乱的编码试试看能不能显示!欢迎讨论
作者: lanyue51hei    时间: 2017-8-1 11:28
程序解释很详细,学习了
作者: 不要加香菜    时间: 2017-8-1 15:51
我也想学习一下1101769421@qq.com谢谢啦
作者: @小二    时间: 2017-8-6 11:54
谢谢楼主分享!给我发一下好吗?821267649@qq.com
作者: licu    时间: 2017-8-9 00:59

謝謝樓主分享!給我發一下好嗎 licuoo@yahoo.com.tw

作者: licu    时间: 2017-8-9 01:46
謝謝樓主分享!給我發一下好嗎?
licuoo@yahoo.com.tw
謝謝
作者: jjj12345    时间: 2017-8-11 06:31
写的很好,不错
作者: topzjm    时间: 2017-8-11 10:34
好程序啊
作者: sgq657785    时间: 2017-9-5 09:48
很好啊,很容易看懂的程序,大神发给我学习一下,1107572536@qq .com 谢谢!
作者: raymondau    时间: 2017-9-5 12:27
楼主能附上相关电路图吗?谢谢!
作者: 232046    时间: 2017-9-24 13:00
1339294327@qq.com谢谢麻烦给张电路图
作者: gpdt3209    时间: 2018-4-10 16:05
好东西呀!能否发我一份程序?邮箱gpdt3209@126.com     谢谢
作者: lele88888    时间: 2018-7-7 16:50
思路清晰,好程序
作者: 茹谷涵今    时间: 2018-7-13 17:06
楼主可以把程序发我下吗?1131103911@qq.com
作者: hslcac    时间: 2018-8-5 21:25
程序解释很详细,学习了
作者: Mr.zhangz    时间: 2018-8-19 15:44
谢谢分享,学习一下我邮箱292785968@qq.com
作者: suneve    时间: 2019-1-23 22:13
这位朋友,你好!麻烦你把红外遥控测码器的全部源程序发给我,谢谢!我的邮箱是:394162308@qq.com

                                                                      再次表示最真诚地感谢!!!
作者: suneve    时间: 2019-1-23 22:36
楼主你好!麻烦把完整程序发给我好吗?邮箱:394162308@qq.com    谢谢!!!
作者: TAPASMONK    时间: 2019-6-7 11:10
学习了 ,楼主你好,可以把完整程序我发吗 ?316487650@qq.com




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1