英飞凌单片机XC866-2FR红外接收程序(状态机)

发布者:iota19最新更新时间:2012-08-31 来源: 51hei关键字:单片机  XC866-2FR  红外接收  状态机 手机看文章 扫描二维码
随时随地手机看文章
这是本人在外参与的第一个项目,主要负责红外发送与接收部分,本程序为接收部分适用于英飞凌单片机XC866-2FR芯片,在和大家分享分享,稍加删减便可为你所用。
#include "MAIN.H"

#define State_Free   0    //定义的五种状态
#define State_Start  1
#define State_Data   2
#define State_Stop   3
#define State_Error  4
#define Rx_Lg        13   //定义的最大接收数据


uword T2_Counter=0;    //计算进入定时器T2的中断次数
ubyte Bit_Counter=0;     //接收8bit变量
ubyte State=0;               //状态变量
ubyte Date_Rx=0;         //数据接收变量
ubyte Table_Cnt;          //接收数据个数变量
ubyte Send_Flag=0;     //发送标志位
ubyte Free_Error=0;     //在空闲状态下出错标志位
ubyte Stop_Error=0;     //在停止状态下出错标志位

ubyte Get_Cnt=0;         //通过串口发送数据的个数变量
uword Data_Ch1=0,Data_Ch2=0; 

ubyte Table_Rx[14]={0};   //接收数组


 

//****************************************************************************
// @Controller      Infineon XC866-2FR
// @Compiler       Keil
// @Function       T2_vInit(void)
// @Description   通过串口发送数据
// @Input             无
// @Output          无

// @Auth0r           KEVIN
// @Date             2010-11-25
// @Version        1.0
//****************************************************************************
void T2_vInit(void)
{
        T2_RC2L      =  0x20;           // load timer 2 reload/capture register,   
        T2_RC2H      =  0xEF;         // load timer 2 reload/capture register,   
        T2_T2MOD   =  0x10;         // load timer 2 mode register

        ET2 = 1;                              // Enable interrupt

        TR2 = 1;                              //   start timer

} 
//****************************************************************************
// @Controller    Infineon XC866-2FR
// @Compiler      Keil
// @Function      Send_Data() 
// @Description  通过串口发送数据
// @Input            无
// @Output         无

// @Auth0r          KEVIN

// @Date            2010-11-25
// @Version       1.0
//****************************************************************************
void Send_Data()
{
    Data_Ch1=(Table_Rx[1]-0x30)+(Table_Rx[3]-0x30)*16+(Table_Rx[2]-0x30)

                                 +(Table_Rx[7]-0x30)*4096+(Table_Rx[6]-0x30)*256

                                 +(Table_Rx[5]-0x30)*16+(Table_Rx[4]-0x30);
             Data_Ch2=(Table_Rx[11]-0x30)*4096+(Table_Rx[10]-0x30)*256

                                 +(Table_Rx[9]-0x30)*16+(Table_Rx[8]-0x30);
  
             if(Data_Ch1!=Data_Ch2)
             {
                      Table_Rx[13]=1;
             }

             for(Get_Cnt=0;Get_Cnt<14;Get_Cnt++)            //通过串口,发送该16个数据
             {
                          UART_vSendData8(Table_Rx[Get_Cnt]);           //发送缓冲区数据
                          while(!TI);             //等待发送完成
                          TI=0;              //发送完成,清标志位
            }
           Table_Rx[13]=0; 
}

//****************************************************************************
// @Controller    Infineon XC866-2FR
// @Compiler      Keil
// @Function      T2_viTmr(void) 
// @Description  定时器T2中断函数,接收红外发送的数据
// @Input            无
// @Output         无

// @Auth0r          KEVIN
// @Date             2010-11-25
// @Version        1.0
//****************************************************************************
void T2_viTmr(void) interrupt T2INT
{
         if (TF2)
        {
        TF2 = 0;
        T2_Counter++;
        if(T2_Counter>400)   //防止变量溢出
        {
          T2_Counter=400;
       }
                 switch(State)    //状态机
                 {
          case State_Free:    if((HWRx==0)&&(Bit_Counter==0))
               {
                if(T2_Counter>15)    //判断时间是否大于164*16us
                {
                    T2_Counter=0;    //是,清零  
                    State=State_Start;   //将状态转为开始状态
                }
                else       //否则
                {
                   T2_Counter=0;    //清零 
                   Free_Error=1; 
                   State=State_Error;   //将状态转为出错状态
                } 
              }
               break;        //结束
         case State_Start: if((T2_Counter>=2)&&(HWRx==0)

                &&(Bit_Counter==0)) //判断是否满足开始状态
                         {
                            T2_Counter=0;     //满足,清零
                         Bit_Counter=8;     //赋初值
                         State=State_Data;     //将状态转为数据

                                                                                                        接收状态
                          }
                      break;        //结束

         case State_Data:  if((T2_Counter>=5)&&((Bit_Counter>0)

                 &&(Bit_Counter<=8))) //判断数据是否接收完成
                     {
                        T2_Counter=0;     //没有,清零计数变量
                        Date_Rx>>=1;     //左移一位
                        if(HWRx==1)      //判断是否高电平到来
                        {
                           Date_Rx|=0x80;    //是,将对应位置1
                        }
                        Bit_Counter--;     //减一
                        if(Bit_Counter==0)    //判断八位数据是否

                                                                                                         接收完成
                        {
                           State=State_Stop;
                        }
                      }
                                                     break;

         case State_Stop:   if((T2_Counter>=5)&&(Bit_Counter==0)) //判断该                数据的8位是否全部接收完,并且检测到停止位
                    {
                                                              T2_Counter=0;       //清零
                                                              if(HWRx==1)        //判断收完数据是否

                                                                                             HWRx是否被拉高                    {                
                           Table_Rx[Table_Cnt]=Date_Rx;  

                                                                                    //暂存该数据   
                                                                     Date_Rx=0;       //清零,防止影响

                                                                                                  下面的数据
                                                                    Table_Cnt++;      //接收到数据的个数

                                                                                                  自加1
                                                                    if(Table_Rx[0]!=0x40)    //判断第一个

                                                                         接收的数据是否为0x40,不是则丢弃
                                                                    {
                                                                            Table_Cnt=0;
                                                                     }
                                                                     State=State_Free;     //将状态转为

                                                                                                             空闲状态          
                                                                    if(Table_Cnt>=Rx_Lg)    //判断16个

                                                                                                数据是否接收完成
                                                                   {
                                                                           Table_Cnt=0;     //是,则清零
                                                                           Send_Flag=1;     //置发送标志位
                                                                   }
                                                           }
                                                          else         //否则,将进入出错状态
                                                          {
                                                                    State=State_Error;
                                                                    Stop_Error=1;
                                                          }
        
                                               }
                                              break;          //结束

                  case State_Error:  if(Free_Error==1)       

                                                {
                                                        if(T2_Counter>50)
                                                         {
                                                                  Free_Error=0;
                                                                  State=State_Free;
                                                         }   
                                               }
                                               if(Stop_Error==1)
                                              {
                                                      if(T2_Counter>18)
                                                      {
                                                              Stop_Error=0;
                                                              State=State_Free;
                                                       }
                                               }        //是,则将状态转为空闲状态
                                               break; 

                            default :      State=State_Free;       //其它情况均转为空闲状态
                                                break;       
                }
      }

} 
关键字:单片机  XC866-2FR  红外接收  状态机 引用地址:英飞凌单片机XC866-2FR红外接收程序(状态机)

上一篇:DIY 1602时钟可调节显示
下一篇:基于单片机的红外发送程序

推荐阅读最新更新时间:2024-03-16 13:07

PIC16C5X单片机睡眠状态退出方法介绍
   在有些应用场合下,CPU只需间断性工作或对外部事件作出处理,平时处于待机状态。PIC16C5X单片机有一种节能方式,睡眠(SLEEP)方式,在这种状态中,振荡驱动器停止工作, I/O口保持执行SLEEP指令前的状态,从而大大降低系统功耗。由于PIC16C5X单片机无中断功能,要退出睡眠方式,只有两种方法:    (1)“看门狗”(WDT)溢出。   (2)在复位脚加低电平,而使芯片复位。本文采用第二种方法。在图1给出的例子中,PIC16C5X平时处于睡眠态,当任意一键按下时,将它从睡眠状态中唤醒,进行键盘处理。为便于说明,在本例中,SW1按下时,点亮,如下图所示   绿灯;当SW2按下时,红灯亮。
[单片机]
PIC16C5X<font color='red'>单片机</font>睡眠状态退出方法介绍
初步认识51单片机-2.4单片机C语言模块化编程
2.2单片机C语言模块化编程 这里插入一节,讲讲单片机C语言的模块化编程。什么叫做模块化编程。前面我们写的代码全部在led.c文件中,试想一下,如果代码过多,怎么阅读。另外与你合作的人如何看懂你的代码。简单的讲,没有可读性和移植性。模块化编程就是为了解决这个问题。当一个工程量比较大时,我们会把这个工程分成一段一段的任务,每个人完成不同段的任务。同时每个段之间是有联系的。假设开发人员A需要条用B的某个功能模块,那么A只要关注模块的功能和如何调用就行了,至于这个功能是如何实现的,可以不用理会。另外,对于单个人员开发完某个工程,下一个工程可能需要同样的功能模块,同样只需要知道如何调用该模块就可以了,无需再去研究该段代码实现功能的过程。还有
[单片机]
初步认识51<font color='red'>单片机</font>-2.4<font color='red'>单片机</font>C语言模块化编程
用插值调整法设计单片机串行口波特率
    摘要: 传统方法设计单片机串行口波特率时,往往要使用特殊频率的晶振。本文在分析MCS-51单片机串行口工作原理的基础上,提出基于12MHz晶振的单片机系统,通过编程实现所需波特率的插值调整设计方法。     关键词: 单片机 串行口 波特率 调整 引言 单片机在当今的仪表及工业测控设备上应用相当广泛,在构成分布式系统进行较长距离数据通信或是要求用有限的硬件资源进行数据交换时,都要用到串行口。也正是串行口使得MCS-51单片机增色不少,成为单片机开发应用中不可缺少的部分。 1 MCS-51单片机串行口工作原理 MCS-51单片机串行口采用异步通信方式。异步通信方式是以字为单位来传送数据的。每
[工业控制]
6课:单片机并行口结构
上两次我们做过两个实验,都是让P1.0这个管脚使灯亮,我们能设想:既然P1.0能让灯亮,那么其它的管脚可不能呢?看一下 图1 ,它是8031单片机管脚的说明,在P1.0旁边有P1.1,P1.2….P1.7,它们是否都能让灯亮呢?除了以P1开头的外,还有以P0,P2,P3开头的,数一下,一共是32个管脚,前面我们以学过7个管脚,加上这32个这39个了。它们都以P字开头,只是后面的数字不一样,它们是否有什么联系呢?它们能不能都让灯亮呢?在我们的实验板上,除了P10之外,还有P11 - P17都与LED相连,下面让我们来做一个实验,程序如下: MAIN: MOV P1,#0FFH LCALL DELAY MOV P1,#00H LC
[单片机]
6课:<font color='red'>单片机</font>并行口结构
德州仪器推出具有 ARM® Cortex™-M3 微控制器的业界最高集成度 ZigBee® 单芯片解决方案满足智能能源基础设施、家庭楼宇自动化以及智能照明系统需
日前,德州仪器 (TI) 宣布推出 CC2538 片上系统 (SoC),简化支持 ZigBee® 无线连接功能的智能能源基础设施、家庭楼宇自动化以及智能照明网关开发。业界最高度集成度 ZigBee 解决方案 CC2538 在单个硅芯片上高度集成 ARM®Cortex™-M3 MCU、存储器以及硬件加速器,具有极高的成本效益。CC2538 支持 ZigBeePRO、ZigBee Smart Energy 及 ZigBee Home Automation 以及照明标准,能与现有及未来 ZigBee 产品实现互操作。此外,该 SoC 还支持采用 IEEE 802.15.4 及 6LoWPAN IPv6 网络的 IP 标准化开发,可实现最
[单片机]
基于单片机的正弦信号发生器的设计
   一.方案   1. 常见信号源制作方法:采用DDS,即直接数字频率合成,其原理方框图如图0所示,   它以有别于其它频率合成方法的优越性能和特点成为现代频率合成技术中的佼佼者。具体体现在相对带宽、频率转换时间短、频率分辨率高、输出相位连续、可产生宽带正交信号及其他多种调制信号、可编程和全数字化、控制灵活方便等方面,并具有极高的性价比。   2.调幅电路:用增益可变运放AD603,其传输带宽高达90MHZ,完全可以满足输出信号频率的要求。   3.调频电路 :压控振荡器   压控振荡器的输出频率是随着输入电压的改变而改变的,鉴于此,如果用调制信号来控制压控振荡器的输入电压,即可实现调频。这样显然简单而容易控制,且
[单片机]
基于<font color='red'>单片机</font>的正弦信号发生器的设计
51单片机基础结构
·8位CPU·4kbytes程序存储器(ROM) (52为8K) ·128bytes的数据存储器(RAM) (52有256bytes的RAM) ·32条I/O口线·111条指令,大部分为单字节指令 ·21个专用寄存器 ·2个可编程定时/计数器·5个中断源,2个优先级(52有6个) ·一个全双工串行通信口 ·外部数据存储器寻址空间为64kB ·外部程序存储器寻址空间为64kB ·逻辑操作位寻址功能·双列直插40PinDIP封装 ·单一 5V电源供电 CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器; RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及
[单片机]
基于单片机C8051F021和时钟芯片实现定时采集存储系统的设计
随着科技的高速发展,现代工业测控领域的很多应用中都需要实现大量数据的定时采集存储。以为海流计设计的海流数据采集存储接口电路为例,介绍一种定时采集存储系统的工作原理及其实现方法。 1 总体结构 在很多情况下,尤其是恶劣的工作环境下,高性能的单片机和大容量的Flash存储器是数据采集存储系统的最佳选择,本文介绍的系统也是基于这样的考虑。系统硬件结构并不复杂,包括高性能单片机C8051F021、实时时钟芯片SD2300、大容量Flash存储器K9G8G08及其外围电路,如图1所示。工作原理也较为简单,通过串口将单片机C8051F021与海流计相连,通过对单片机的编程实现对海流计的控制和使用。同时,为了实现定时采集和数据存储的功能,还
[单片机]
基于<font color='red'>单片机</font>C8051F021和时钟芯片实现定时采集存储系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved