打印

CMS5104的解码程序(第二次总是读不对)

[复制链接]
998|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
浚凡小子|  楼主 | 2016-4-27 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位,请帮忙分析一下以程序,解码总是不对,不知为何
//========================================================
//********************************************************
//========================================================
#include <SN8P2501B.h>                         // 头文件
#include "global.h"                            //

//========================================================
//********************************************************

//**** BIT变量定义 ***************************************
sfr      Flag0         =0x2f;
sbit     IR_ST_Code_bz =Flag0:0;               //1101
sbit     IR_NO_Code_bz =Flag0:1;               //没有代码一直保持高电平
sbit     IR_2B_Code_bz =Flag0:2;               //两次帧码档志


uchar    IR_Cnt        =0;                     
uchar    IR_12Code     =0;                     //位码计数器
uchar    IR_Code       =0;                     //新代码
uchar    IR_Code1      =0;                     //旧代码  
uchar    IR_H_Cnt      =0;                     //高电平计数器  
uchar    IR_L_Cnt      =0;                     //低电平计数器
//***** <IR > ********************************************
sbit     IR_Prot       =0xd0:0;                // 红外接收口

sbit     LED1          =0xd2:5;                // P2.5  
sbit     LED2          =0xd2:4;                // P2.4   
sbit     LED3          =0xd2:3;                // P2.3
//********************************************************
//函数声明
//********************************************************
//void Sys_Init(void);                         // 系统初始化
//void TimeDeal(void);                         // 时间处理
//void KeyeDeal(void);                         // 按键处理
//void KeyeScan(void);                         // 按键扫描
//void KeyPress(void);                         // 按键保护
   
//void DispDeal(void);                         // 显示处理
//void DispAll_Off(void)                       // 显示关闭
//void DispAll_On(void);                       // 显示全显
//void Display_A( uchar SMG_Data);             // 共阳显示
//void LoadDeal(void);                         // 负载处理
//void KeyPress(void);

//********************************************************
//系统初始化
//********************************************************
void Sys_Init(void)                            //
{   //--- Fcpu Config ------------------------------------
    Clr_WDT();                                 // 清看门狗
    OSCM = 0x00;                               // 普通模式(双时钟)        
    INTEN= 0x00;                               //
    INTRQ= 0x00;                               //
    P1OC = 0x00;                               // 0禁止漏极输出
        //--- I0 Config --------------------------------------
        P0UR = 0x00;                               // 0=不上拉 1=上拉
        P1UR = 0x00;                               //
        P2UR = 0x00;                               //
        P5UR = 0x00;                               //

        P0M  = 0x00;                               // 0=输入   1=输出
        P1M  = 0xFF;                               //
        P2M  = 0xFF;                               //  
        P5M  = 0xFF;                               //

        P0   = 0x01;                               // 0=低电平 1=高电平
        P1   = 0xFF;                               //
        P2   = 0x00;
        P5   = 0xFF;                               //

        //--- TC0 Config--------------------------------------
    TC0M   = 0x64;                             // 16MHz/4=  Fcpu/4/125
    TC0R   = 131;                              //
        TC0C   = 131;                              //     
    FTC0IEN=1;                                 // Enable TC0 Interrput
        FTC0ENB=1;                                 // 定时器开启
    //--- Int0 Config-------------------------------------
    //PEDGE  =0x10;                              // 下降沿触发
    //FP00IRQ=0;                                 //
    //FP00IEN=1;                                 // 允许Int0
    //----Start Run---------------------------------------
    FGIE   = 1;                                // Enable all Interrput
        //----------------------------------------------------
}

void DelayUs(ulong k)
{
    while(k--);
}

//********************************************************
//时间处理
//********************************************************
void TimeDeal(void)                            //
{                                
}

//********************************************************
//红外5104解码处理()
//********************************************************
void IRM_Deal(void)
{   
        if(Key_bz )
        {   Key_bz=0;
            if(KeyVal==0x81)
           {
               if(IR_bz)LED1=0,IR_bz=0;
                   else LED1=1,IR_bz=1;
            }
       
        }
}


//********************************************************
//主程序
//********************************************************
void main(void)                                // 主程序
{                                            
   Sys_Init();                                 // 系统初始化
   while(1)                                    // 主循环程序
   {   Clr_WDT();                              // 看门狗      
   }                                           //
}                                              //

//********************************************************
//中断处理                                       
//********************************************************
void __interrupt[0x8] ISR(void)                // 125us
{
    if(FTC0IRQ)                                // TC0 interrput
    {        FTC0IRQ=0;                             // Clr  flag                
        T_2msCnt++;
                 //IR--------------------------------------------
                if(IR_Prot)                            //
                {   if(IR_L_Cnt==0)IR_NO_Code_bz=1;    // 一直为高电平
            else
                        {   if(IR_L_Cnt>=8)                // 判断遥控码是高还是低125*8=1ms
                            {   if(IR_Code>0)              //
                                    {   IR_Code<<=1;           //
                                            IR_Code++;             // 大于1ms为1,小于为0                                                                                                    
                                        }else IR_Code=1;           //
                                }else IR_Code<<=1;             // 0
                            //IR_L_Cnt=0;
                       
                                //---------------------------------------
                                if(IR_ST_Code_bz)              // 已经有启始码标志
                {   IR_H_Cnt=0;
                                    IR_L_Cnt=0;                //
                                    IR_12Code++;
                                        if(IR_12Code==8)
                                        {   
                                            if(IR_Code==IR_Code1)
                                            {   
                                                    if(IR_2B_Code_bz==0)
                                                    {   KeyVal=IR_Code;
                                                            IR_2B_Code_bz=1;
                                                                Key_bz=1;
                                                        }                                       
                                                }
                                            else //还没收到2帧相同的码
                                                {   IR_Code1=IR_Code;
                                                    IR_H_Cnt=0;                                                    
                                                }
                                        }
                                }
                else //没有收到启始码
                                {   IR_L_Cnt=0;                //
                                    IR_Code &=0x0F;            //
                                        if(IR_Code==0x0D)          // 是否等于启始码1101  
                                    {   IR_ST_Code_bz=1;       // 是
                                            IR_12Code=0;           //
                        IR_Code=0;             //
                                                IR_H_Cnt=0;            //  
                                        }
                                        else IR_NO_Code_bz=1;      // 没码           
                                }
                        }
            //------------------------------------------
            if(IR_NO_Code_bz)                  //
                        {   IR_NO_Code_bz=0;               //
                            IR_L_Cnt=0;                    //
                            IR_H_Cnt++;                    //   
                            if(IR_H_Cnt>=127)              // 如果大于16ms
                                {   IR_2B_Code_bz=0;           // 2次帧码标志清0
                                    IR_Code1=0;                // 旧代码清0
                                        IR_H_Cnt=0;                // 高电平计数清0
                                }
                                else if(IR_H_Cnt>=31)          // 如果大于4ms,启始码错误
                                {   IR_Code=0;                 //
                                    IR_ST_Code_bz=0;           //
                                }                            
                        }               
                }else IR_L_Cnt++;                      // 低电平计数                                                                
    }                                          //
}                                              //

//********************************************************
// ---------end------------------------------------------
//********************************************************

相关帖子

沙发
浚凡小子|  楼主 | 2016-4-30 08:41 | 只看该作者
请各大侠帮忙分析一下,那里出了问题,多谢

使用特权

评论回复
板凳
tyw| | 2016-4-30 10:04 | 只看该作者
浚凡小子 发表于 2016-4-30 08:41
请各大侠帮忙分析一下,那里出了问题,多谢

这么长一段,估计没人有耐心看完.
若第一次正常,第二次不对,你就分析二次读取的差异,再进一步寻找差异原因.自已试试.每个人都会有这第一次的.哈哈

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
浚凡小子 + 3 赞一个!
地板
浚凡小子|  楼主 | 2016-5-3 20:14 | 只看该作者
tyw 发表于 2016-4-30 10:04
这么长一段,估计没人有耐心看完.
若第一次正常,第二次不对,你就分析二次读取的差异,再进一步寻找差异原因 ...

多谢,以找到问题点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

86

帖子

1

粉丝