《匠人手记》推荐网上购书渠道:
  互动出版网(china-pub)   >>>
  当当网(dangdang)   >>>
  卓越亚马逊网    >>>
  淘宝网(taobao)   >>>
  更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

状态机的典范-HT6222红外遥控芯片接收程序(xwj)
程序匠人 发表于 2006-3-11 12:57:00  阅读全文 | 回复(1) | 引用通告 | 编辑

状态机的典范-HT6222红外遥控芯片接收程序
xwj 发表于 2006-3-10 1:01:00

 /*************************************************************
红外线遥控器按键检测程序.
通过检测两次下降沿之间的时间差判断接受到的数据位.
已经通过了测试,能够正确区分出32bit数据的遥控器按键键值.
具有数据重发功能,但是数据的重发有点频繁.
使用晶震频率为11.0592MHz,所有定时值都是基于这个频率计算.
占用很少量的CPU时间,使用了外部中断0接受数据,定时器0进行计数,
定时器1作为串口的波特率发生器(Band = 9600).
主函数会使MCU进入低功耗模式,如需加入自己的代码需要屏蔽此功能.
状态机:
    1.如果时间差=0,由空闲态进入接受态
    2.如果时间差>1ms and <1.3ms,收到数据0
    3.如果时间差>2ms and <2.5ms,收到数据1
    4.如果时间差>13.2ms and <13.8ms,收到开始位
    5.如果时间差>12.2ms and <12.8ms,收到停止位(没有检测)
    6.如果时间定时器溢出(时间差>20ms),进入空闲状态
*************************************************************/
//        本程序 可以说是状态机的典范                                       //
//        参照了网友高伟能gwnpeter@21cn.com的代码和思路,仅供学习参考       //
//        如有问题请mailto xuwenjun@21cn.com    欢迎与我交流!               //
//--------------------------------------------------------------------------//
//                                                                          //
//                    (c) Copyright 2001-2003 xuwenjun                     //
//                            All Rights Reserved                           //
//                                    V1.00                                 //
//--------------------------------------------------------------------------//
//标 题: Ir_6222遥控芯片接收程序                                           //
//文件名: ir_6222.c                                                         //
//版 本: V1.00                                                             //
//修改人: 徐文军                         E-mail:xuwenjun@21cn.com           //
//日 期: 03-06-14                                                          //
//描 述: Ir_6222遥控芯片接收程序                                           //
//--------------------------------------------------------------------------//
//老版本: 无                             老版本文件名:                      //
//创建人: 徐文军                         E-mail:xuwenjun@21cn.com           //
//日 期: 03-06-14                                                          //
//描 述: Ir_6222遥控芯片接收程序                                           //
//        当ykok=1时,ykcode中的数据就是接收到的遥控码(14位的最后8位)          //
//--------------------------------------------------------------------------//
//占用以下资源:                                                             //
//        1. 遥控使用外部中断0,接P3.2口                                     //
//        2. 遥控使用定时计数器1                                            //
//        3. 5.1字节data RAM                                                //
//        4. 293字节 code ROM                                               //
//--------------------------------------------------------------------------//
//声 明: 
                                                           //
//        以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
//        如用于商业用途请与作者联系.    E-mail:xuwenjun@21cn.com           //
//              本程序参照了网友高伟能gwnpeter@21cn.com的代码,仅供学习参考       //
//        如有问题请mailto xuwenjun@21cn.com    欢迎与我交流!               //
//--------------------------------------------------------------------------//

#i nclude <REG52.H>
#i nclude "Ir_6222.h"                //  ht6222函数原型: 公用函数
//#i nclude "xwj_4led.h"                //  四位LED显示模块  //
//#i nclude    "xwj_pcf8566.h"                         //  I2C总线LCD8566函数声明    //
//#i nclude <stdio.h>
//--------------------------------------------------------------------------//


#define TIME_0_00MS        0x0000
#define TIME_1_00MS        0x039a
#define TIME_1_13MS        0x0480
#define TIME_2_00MS        0x0733
#define TIME_2_50MS        0x0900
#define TIME_13_2MS        0x2ecd
#define TIME_20_0MS        0x47ff
#define TIME1_LOAD        (0xffff - TIME_20_0MS)

bit running;
long Irbuf;
unsigned char Irdat;
bit Irok;

void IrInit(void)                                                //遥控接收初始化
{
    //-----init TIME1----
    TMOD |= 0x10;                                          //TMOD T0,T1均选用方式1(16位定时)
    TH1    = TIME1_LOAD >> 8;
    TL1    = TIME1_LOAD & 0xff;
//        SCON=0x00;
        IP|=0x01;                                           //SETB  INT0 中断优先
        TCON |= 0x41;                                    //TCON  EX0下降沿触发,启动T1 //
    TR1    = 1;
        IE|=0x89;                                           //SETB        EX0 0x1  外部中断 0 允许
                                                                        //SETB        ET0 0x8  定时器 1 中断允许
                                                                          //SETB        EA  0x80 开中断
}

unsigned char IrGetcode(void)                        //返回遥控码
{
        Irok=0;
        return(Irdat);
}

bit IrTest(void)                                        //检查有无遥控信号
{
        return(Irok);
}

void int0_isr(void) interrupt 0        //遥控使用外部中断0,接P3.2口
{
    unsigned int timer;
   
    TR1 = 0;
    timer = ((TH1 << 8) | TL1) - TIME1_LOAD;
    TH1 = TIME1_LOAD >> 8;
    TL1 = TIME1_LOAD & 0xff;
    TR1 = 1;
   
    if        (timer > TIME_1_00MS && timer < TIME_1_13MS)    //data 0
        Irbuf = (Irbuf << 1) & 0xfffffffe;
    else if    (timer > TIME_2_00MS && timer < TIME_2_50MS)    //data 1
        Irbuf = (Irbuf << 1) | 0x00000001;
    else if    (timer == TIME_0_00MS || timer > TIME_13_2MS)
        Irbuf = 0x0000;
    running = 1;
}

void time1_isr(void) interrupt 3        //遥控使用定时计数器1
{
//    EA = 0;
//    TR1 = 0;
    TH1 = TIME1_LOAD >> 8;
    TL1 = TIME1_LOAD & 0xff;
//    if    ((((Irbuf >> 24) & 0xff) == (~((Irbuf >> 16)) & 0xff)) &&(((Irbuf >> 8) & 0xff) == (~((Irbuf >> 0)) & 0xff)))
    if    (((Irbuf >> 8) & 0xff) == ((~(Irbuf >> 0)) & 0xff))
    {
        Irdat = (Irbuf>>8) & 0xff;
        Irok = 1;
//        pcf8566_showhh(Irdat);
    }
    else if(Irbuf == 0x00 && Irok == 1)
                  ;
//        pcf8566_showhh(Irdat);
    else
        Irok = 0;
//    IE0 = 0;
//    EA = 1;
    running = 0;
}

/*
//  HT6222测试主函数内容
main()
{
        IrInit();
        led_test();                                        //4LED测试函数
        for(;1;)                                                //主程序
        {
                if (IrTest())
                        led_showhh(IrGetcode());
                led_delay(10);
        }
}

*/
//本程序由xwj设计的UltraEdit脚本加亮显示,如需要脚本访问我的Blog //或发送邮件至:xwjfile@21cn.com
 

看《匠人手记》,与匠人同行!北航出版,正在热卖!

Re:状态机的典范-HT6222红外遥控芯片接收程序(xwj)
访客L52Sk8(游客)发表评论于2008-3-13 1:03:00  个人主页 | 引用 | 返回 | 删除 | 回复

访客L52Sk8(游客)

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    推荐阅读

    往日酷贴

     

    友情连接

     [更多酷站连接]

     

     

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [