;
文章:行业新闻EDA文摘电源技术无线通信测量仪表嵌入式类电子技术制造技术半导体网络/协议展会实验家电维修  
  下载:EDA教程电源技术电子书籍电子元件无线通信通信网络电路图纸嵌入式类单片机传感/控制电子教材模拟数字
.... 音视频类
消费电子机械电子行业软件C/C++FPGA/ASIC规则标准家电维修DSPIC资料ARM软件电路图电子技术论坛
 
位置:电子发烧友 > 行业新闻 > 嵌入式类 > 单片机类 >遥控器程序 退出登录 用户管理
栏目导航


· 单片机类 · 接口/总线/驱动
· ARM · DSP
· FPGA/ASIC技术 · 设计应用
· 嵌入式操作系统 · 电视卡
热门文章
· [组图] 电子元器件基础知识...
· [图文] USB接口定义
· [图文] 三极管开关电路图
· [组图] RS232 RS485接口原理...
· [组图] [组图]电动车充电器...
· [组图] 电子捕鱼器电路图
· [组图] 高品质音调电路的制...
· [组图] JRC4558电路
· [图文] M51134P低音炮电路图...
· [图文] TL494脉宽调制控制电...
相关文章

· [图文] 910CH型洗衣机程序控...
· THE MATHWORKS公司实...
· [组图] 18b20程序及应用
· [图文] 用Atmega8实现8路键...
· AVR 模数(AD)转换范...
· 6*128 LED点阵屏C程...
· [图文] led点阵显示程序
· [图文] 16 16点阵显示程序(...
· [图文] 8X8 LED点阵显示原理...
· [图文] 8 8点阵汉字显示电路...

遥控器程序
作者:本站  来源:本站原创  发布时间:2008-1-11 23:23:10 减小字体 增大字体
遥控解码的原理:我们知道遥控是采用38KHZ的脉冲通过红外发光二极管调制发送出去的 。我们的主
目的是怎样将从空气中传送来的遥控信息,进行解码。对于遥控里面的最底层原理,我就不多介绍啦 , 网
友可以参考相关书籍。在这里简单的说一下遥控解码的注意事项:
     引导码的时间为:13.5ms,高电平时间为9ms,低电平时间为4.5ms。
     低电平时间周期为:用L表示低 L=1.125ms
     高电平时间周期为:用H表示高 H=2.25ms
     发送一串数据大约58.5---76.5ms
     遥控码是由:引导码、用户码、用户反码、键盘码、键盘反码 几部分组成。
    
相关源程序:(C语言版本)
            unsigned char th1_val = 0, th1_old = 0;

            unsigned char c_last=0;

            unsigned char c_bits = 8;

            unsigned char c_index = 0;

            unsigned char c_code ,c_last1,c_last2,c_last3=0;

            bit c_error = 0;

            #define T_100US (F_OSC/12/10000)

            #define T_ZERO_MIN (T_100US*10)

            #define T_ZERO_MAX (T_100US*18)

            #define T_ONE_MIN (T_100US*20)

            #define T_ONE_MAX (T_100US*28)

            #define T_REP_MIN (T_100US*110)

            #define T_REP_MAX (T_100US*120)

            #define T_START_MIN (T_100US*130)

            #define T_START_MAX (T_100US*150)

            #define TH_ZERO_MIN (T_ZERO_MIN>>8)

            #define TH_ZERO_MAX (T_ZERO_MAX>>8)

            #define TH_ONE_MIN (T_ONE_MIN>>8)

            #define TH_ONE_MAX (T_ONE_MAX>>8)

            #define TH_REP_MIN (T_REP_MIN>>8)

            #define TH_REP_MAX (T_REP_MAX>>8)

            #define TH_START_MIN (T_START_MIN>>8)

            #define TH_START_MAX (T_START_MAX>>8)

            #define CODE1 0x0a
            #define CODE2 0xf5

            #define INIT_T0 (65536L - (F_OSC/12)/HZ)
            #define INIT_TH0 (INIT_T0 >> 8)
            unsigned int remocnt=0;
            extern bit menu1flag;

            void int0_bh(void)
            {
            unsigned char temp = th1_val;
            th1_val -= th1_old;
            if (temp < th1_old)
                th1_val -= INIT_TH0;
                th1_old = temp;

            // if (th1_val > TH_START_MAX)
            // goto err_out;
            if (th1_val >= TH_START_MIN)
                goto reset_out;
            if (th1_val > TH_REP_MAX)
                goto err_out;
            if (th1_val >= TH_REP_MIN) {
            if (key_last == KEY_INC || key_last == KEY_DEC||key_last == KEY_MENU){
                key_on = 1;
                if(key_last==KEY_MENU) key_on=0;
                      if(++remocnt>40) { keymenu=1;
                           key_on=1;
                           remocnt=0;
                }
                else keymenu=0;
                  if(menu1flag) key_on=0;
              }
              goto reset_out;
            }
            if (c_error)
                return;
            if (th1_val > TH_ONE_MAX)
                goto err_out;
            if (th1_val >= TH_ONE_MIN) {
                c_last >>= 1;
                c_last |= 0x80;
                goto bit_rcv;
            }
            if (th1_val > TH_ZERO_MAX)
                goto err_out;
            if (th1_val >= TH_ZERO_MIN) {
                c_last >>= 1;
                goto bit_rcv;
            }
                goto err_out;
            bit_rcv:
            if (--c_bits)
                return;
              //c_index++;
            switch (c_index++) {
            case 0:
                 { if (c_last == CODE1)
                       goto out;
                   else { goto out;}
                 }
            case 1:
                 { if (c_last == CODE2)
                       goto out;
                       // c_last2=c_last;
                   else {goto out;}
                 }
            case 2: {
                     c_code = c_last;
                     goto out;
                    }
            case 3: {
                      if (c_last != ~c_code)
                         goto err_out;
                         // c_last3=c_last;
                         break;
                      }
                    }

            if (key_on) {
                     goto reset_out;
                       }
            switch (c_code) {
            case 0x12:
                     key_last = KEY_POWER;
                     break;
            case 0x03:
                     {
                     key_last = KEY_MENU;
                     keymenu=0;
                     remocnt=0;
                     }
                     break;
            case 0x06:
                     key_last = KEY_VIDEO;
                     break;
            case 0x13:
                     key_last = KEY_INC;
                     break;
            case 0x48:
                     key_last = KEY_DEC;
                     break;
            case 0x09:
                     key_last = KEY_ZOOM;
                     break;
            default:
                     key_last = KEY_INVALID;
                     goto reset_out;
            }       
                     key_on = 1;
                     goto reset_out;
            err_out:
                     c_error = 1;
                     goto out;
            reset_out:
                     c_error = 0;
                     c_index = 0;
                     goto out;
           out:
                     c_last = 0;
                     c_bits = 8;
          }

[] [返回上一页] [打 印] [收 藏]
 
下一篇文章:单片机简谱程序
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
 
关于本站- 意见反馈 - 网站导航 - 帮助 - 隐私政策 - 联系我们 - 使用条款 - 安全承诺 - 友情连接
站长QQ:39550527 Powered by: 飓风网络(电路图
Copyright 2006-2008 Elecfans.Com.电子发烧友: 粤ICP备07065979号All Rights Reserved