zhongvv的笔记 https://bbs.21ic.com/?239819 [收藏] [复制] [RSS]

日志

红外解码STM8 核心C代码

热度 1已有 612 次阅读2017-10-13 16:36 |个人分类:单片机|系统分类:单片机| 红外, 解码, stm8, stm8, 单片机, C语言

定义循环缓冲buf
#define BUF_LEN 128
#define MSG_LEN 67
typedef struct 
{
    u8 ucWrIndx;
    u8 ucRdIndx;
    u16 sWin[BUF_LEN];
}RINGBUF_STRU;

使用C端口进行数据接收
 /*c口上升沿,下降沿触发中断*/
EXTI_CR1=0x30;

/*IO中断*/
INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5)
{
     static u8 i=0;
     /*取得时间*/
     Get_time=TIM1_GetCounter();
     /*计数清零*/
     TIM1_SetCounter(0);
     /*数据送入缓冲*/
    stRingBuf.sWin[stRingBuf.ucWrIndx++]=Get_time;
    /*索引++*/
     stRingBuf.ucWrIndx=(stRingBuf.ucWrIndx%BUF_LEN);
}
/*定时器配置*/
void TIM1_Config(void)
{
   //开启定时器1外设时钟
   CLK_PCKENR1 |= 0x80;
   /*分频 0.01ms记一次数*/
   TIM1_PSCRH = 0; 
   TIM1_PSCRL = 159;
   TIM1_CR1 = 0x01; // 计数器使能,开始计数
   /*缓冲区初始化*/
   stRingBuf.ucWrIndx=0;
   stRingBuf.ucRdIndx=0;

}


/*消息判断*/
void IrCheck()
{
        u16 usHead1;
        u16 usHead2;
        u8 ucDataLen;
       
        u8 i;
        /*有消息*/
        if(stRingBuf.ucRdIndx!=stRingBuf.ucWrIndx)
        {
             /*长度判定*/
            if(stRingBuf.ucWrIndx>=stRingBuf.ucRdIndx)
            {
                       ucDataLen=stRingBuf.ucWrIndx-stRingBuf.ucRdIndx;
           }
           else
           {
                       ucDataLen=stRingBuf.ucWrIndx+BUF_LEN-stRingBuf.ucRdIndx;
           }

           /*最小长度*/
           if(ucDataLen<MSG_LEN)
           {
                      return;
           }   
                /*head1*/
                usHead1=stRingBuf.sWin[stRingBuf.ucRdIndx++];
               stRingBuf.ucRdIndx=(stRingBuf.ucRdIndx%BUF_LEN);
                if((usHead1>925)||(usHead1<875))
                {
                        return;
                }
               
                /*head2*/
                usHead2=stRingBuf.sWin[stRingBuf.ucRdIndx++];
                stRingBuf.ucRdIndx=(stRingBuf.ucRdIndx%BUF_LEN);
                if((usHead2>475)||(usHead2<425))
                {
                        return;
                }
                /*消息内容*/
                for(i=0;i<65;i++)
                {
                        IrDat[i]=stRingBuf.sWin[stRingBuf.ucRdIndx++];
                        stRingBuf.ucRdIndx=(stRingBuf.ucRdIndx%BUF_LEN);       
                }

                /*消息解析*/
                IrAnalysis();

        }
}

/*集中解码*/
void IrAnalysis(void)
{
   u8 i;
   u8 ucFlag;
   static u8 ucPp=0;
   static u8 ucMode=4;
   /*解码地址*/
   usAddr=0;
   /*解码地址*/
   usDat=0;

   for(i=0;i<16;i++)
   {
              /*处理16位数据,*/
                if((IrDat[(i<<1)]+IrDat[(i<<1)+1])<56)
              {
                          return;
              }
              esle if((IrDat[(i<<1)]+IrDat[(i<<1)+1])<168)
               {
                        ucFlag=0;
               }
                else if if((IrDat[(i<<1)]+IrDat[(i<<1)+1])<275)
                {
                        ucFlag=1;
                }
                else
               {
                     return;
               }
               
                usAddr|=(ucFlag<<(15-i));
   }
   
   /*解码数据*/
   for(i=0;i<16;i++)
   {         
                if((IrDat[(i<<1)+32]+IrDat[(i<<1)+33])<56)
               {
                       return;
               }
              else if((IrDat[(i<<1)+32]+IrDat[(i<<1)+33])<168)
               {
                        ucFlag=0;
               }
                else if((IrDat[(i<<1)+32]+IrDat[(i<<1)+33])<275)
                {
                        ucFlag=1;
                }
                else
               {
                       return ;
                }
                usDat|=(ucFlag<<(15-i));
   }

}

再配置串口,可以做红外解析工具.

路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (1 个评论)

回复 shang21ic 2017-12-7 09:36
做红外遥控解码,推荐用YiRTX02,万能,空调也可以解码。