找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2221|回复: 7
收起左侧

谁有风扇遥控器红外解码的单片机程序,要正确值的

[复制链接]
ID:796012 发表于 2023-3-2 15:40 | 显示全部楼层 |阅读模式
       试了好多个论坛的程序,没有能够正确解码出来的。

        这个遥控发送的红外光很快,几乎不闪,也很短,就像是一速光。

        一般的遥控都是间隔一闪一闪的,用手机摄像头看到的,这种类型论坛的程序都能解码吧。

        这个风扇遥控器试了之后,每次编码都不一样,那肯定就不是正确值啦!

        不知道是什么格式,看久电脑眼睛累,要是还戴耳机听歌那准失眠睡不着。

        就像在论坛搞一个合适的程序,居然也找不到合适的……

        肯定会有特别高明的黒友,嘻嘻!

风扇遥控器

风扇遥控器
回复

使用道具 举报

ID:814525 发表于 2023-3-2 20:59 | 显示全部楼层
/********************************************
Title       :    main.c
McuBody     :    STC15
Author      :   
Updata      :    2020-12-09
Version     :    Ver1.00
********************************************
NOTE:
  1. P11 PCA采样,红外遥控解码

********************************************/
#include "xtimer[v032].h"
#include "TM1638.h"
#include "PCA.h"

/************************外部变量***************************/

/************************本地全局变量***********************/
#define MAIN_Fosc                12000000UL        //定义主时钟
#define Timer0_Reload_1ms   (MAIN_Fosc / 1000)      //Timer 0 中断频率, 1000次/秒

#define ID_IR_USER 0x00

u8  IR_Rxbuff[4]={0};                //第一字节:地址  第二字节:地址反码        第三字节:按键值(命令) 第四字节:命令反码
u8  IR_RXCnt = 0;
bit Flag_IrStart = 0;
bit Flag_IrHold = 0;
bit Flag_RecvOk = 0;  
bit flagAction=0;
u8        Displaybuff[8]={0};
/*******************Private function defines*****************/
xTIMER_TypeDef Task1(void);
xTIMER_TypeDef Task2(void);

/************************************************************
Function : Mcu_IO_Config
Stacks   :
Note     : Pxn_standard-双向  Pxn_push_pull-推挽  Pxn_pure_input-高阻         Pxn_open_drain-开漏
Updata   : 2020-06-18
************************************************************/
void Mcu_IO_Config(void)
{
                P1n_pure_input(Pin5);
                P5n_pure_input(Pin4);
}
/************************************************
Function : PCA_config
Stacks   :
Note     : PWM频率= PCA时钟源 / 2^n     (n为PCA模式6/7/8)
                                         PWM占空比最小为1/2^n
Updata   : 2020-12-08
PCA_P12_P11_P10_P37  0x00  CCP 在[ECI-P1.2,CCP0-P1.1,CCP1-P1.0,CCP2-P3.7]  
PCA_P34_P35_P36_P37  0x10  CCP 在[ECI-P3.4,CCP0_2-P3.5,CCP1_2-P3.6,CCP2_2-P3.7]
PCA_P24_P25_P26_P27  0x20  CCP 在[ECI-P2.4,CCP0_3-P2.5,CCP1_3-P2.6,CCP2_2-P2.7]  
************************************************/
void        PCA_config(void)
{
        PCA_InitTypeDef                PCA_InitStructure;

        PCA_InitStructure.PCA_Clock    = PCA_Clock_12T;                //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI
        PCA_InitStructure.PCA_IoUse    = PCA_P12_P11_P10_P37;        //PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27
        PCA_InitStructure.PCA_Interrupt_Mode = ENABLE;                //ENABLE, DISABLE
        PCA_InitStructure.PCA_Polity   = PolityLow;                        //优先级设置        PolityHigh,PolityLow
        PCA_InitStructure.PCA_RUN      = DISABLE;                        //ENABLE, DISABLE
        PCA_Init(PCA_Counter,&PCA_InitStructure);

        PCA_InitStructure.PCA_Mode     = PCA_Mode_Capture;                //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
        PCA_InitStructure.PCA_PWM_Wide = 0;                //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
        PCA_InitStructure.PCA_Interrupt_Mode = PCA_Fall_Active|ENABLE;                //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
        PCA_InitStructure.PCA_Value    = 0;                        //对于PWM,高8位为PWM占空比
        PCA_Init(PCA0,&PCA_InitStructure);

//        PCA_InitStructure.PCA_Mode     = PCA_Mode_PWM;                //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
//        PCA_InitStructure.PCA_PWM_Wide = PCA_PWM_8bit;                //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
//        PCA_InitStructure.PCA_Interrupt_Mode = DISABLE;                //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
//        PCA_InitStructure.PCA_Value    = 128 << 8;                        //对于PWM,高8位为PWM占空比
//        PCA_Init(PCA1,&PCA_InitStructure);

//        PCA_InitStructure.PCA_Mode     = PCA_Mode_PWM;                //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
//        PCA_InitStructure.PCA_PWM_Wide = PCA_PWM_6bit;                //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
//        PCA_InitStructure.PCA_Interrupt_Mode = DISABLE;                //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
//        PCA_InitStructure.PCA_Value    = 32 << 8;                        //对于PWM,高8位为PWM占空比
//        PCA_Init(PCA2,&PCA_InitStructure);

        CR = 1;
}

/************************************************
Function : Mcu_OutIO_Init
Stacks   :
Note     :
Updata   : 2020-09-13
************************************************/

void Mcu_Port_Init(void)
{
                P15=0;
                P54=0;
}

/************************************************
Function : Timer0_Init
Stacks   :
Note     :         period as 1ms auto load
Updata   :         2020-09-13
************************************************/
void Timer0_Init(void)
{
        TR0 = 0;
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式16位自动重装
        TH0 = (u8)((65536UL - Timer0_Reload_1ms) / 256);
        TL0 = (u8)((65536UL - Timer0_Reload_1ms) % 256);
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                 //允许T0中断
        EA = 1;
}

/************************************************
Function : Task1
Stacks   :
Note     : 红外接收处理
Updata   : 2020-09-13
************************************************/
xTIMER_TypeDef Task1(void)
{       
                _xBEGIN
                while(1)
                {       
                        if (Flag_RecvOk)
                        {
                                if ((IR_Rxbuff[2] == ~IR_Rxbuff[3])&& (IR_Rxbuff[0] == ID_IR_USER))
                                        {
                                                        flagAction = 1;
                                        }
                                Flag_RecvOk = 0;
                        }
                        xDelay(10);                                                                                       
                }
}

/************************************************
Function : Task2
Stacks   :
Note     : 显示接收的NEC码
Updata   : 2020-09-13
************************************************/
xTIMER_TypeDef Task2(void)
{                static u8 i;
                static u8 j;
       
                _xBEGIN
                while(1)
                {         
                        if(flagAction)
                        {
                                i=IR_Rxbuff[0];       
                                Displaybuff[0]=        i/16;
                                Displaybuff[1]=        i%16;       
                               
                                i=IR_Rxbuff[1];       
                                Displaybuff[2]=        i/16;
                                Displaybuff[3]=        i%16;       
                               
                                i=IR_Rxbuff[2];       
                                Displaybuff[4]=        i/16;
                                Displaybuff[5]=        i%16;       
                               
                                i=IR_Rxbuff[3];       
                                Displaybuff[6]=        i/16;
                                Displaybuff[7]=        i%16;       
                               
                                flagAction=0;
                        }
               
                        for(j=0;j<8;j++)
                        {                                                                       
                                Write_DATA(j<<1,tab[Displaybuff[j]]);                                
                        }
                       
                        for(j=0;j<10;j++)
                        {                                                                       
                                        xDelay(25);                                                //250mS更新一次显示                               
                        }
                }
}


/************************************************
Function : System_Init
Stacks   :
Note     :
Updata   : 2020-09-13
************************************************/
void System_Init(void)
{
        Mcu_IO_Config();
        Mcu_Port_Init();
        init_TM1638();
        PCA_config();
        Timer0_Init();
}
/************************************************
Function : xTimerCallback
Stacks   :
Note     :
Updata   : 2020-09-13
************************************************/
void xTimerCallback(void)
{       
                NOP(1);
}       

/**********************************************************************
                                                                                                        main program zone
**********************************************************************/
void main(void)
{
        System_Init();
        xTimerInit(20);
        while(1)
        {
                xTimerProcess(Task1," ", ID_0);                        //将Task1函数装入0号  
                xTimerProcess(Task2," ",  ID_1);                        //将Task2函数装入1号
        }       
}

/**********************************************************************
                                                                                                interrupt program zone
**********************************************************************/
void TM0_Isr(void) interrupt 1         //1ms
{       
        xTimerUpdata(xTimerCallback);
}

/**********************************************************************

**********************************************************************/
void PCA_()interrupt 7                                                //PCA中断入口
{       
        u8 i;
        CF=0;
       
        if(CCF0)                                                                //捕获中断
        {                  
                CCF0=0;

                if (CCAP0H> 0x32&& CCAP0H < 0x37)                //确认收到起始信号 12.8-14.335mS
                {
                        IR_RXCnt = 0;
                        Flag_IrStart = 1;               
                }
                else if (!Flag_IrStart )
                {
                        if((CCAP0H > 0x29) && (CCAP0H < 0x2e))                                //长按信号 10.496-12.031mS
                          Flag_IrHold = 1;               
                }
                else
                {
                        if ((CCAP0H  < 0x02) || (CCAP0H  > 0x0c))                                // < 0.767mS 或 > 3.072mS
                        {
                                Flag_IrStart = 0;
                        }
                        else if(Flag_IrStart )
                        {
                                i=IR_RXCnt/8;
                                IR_Rxbuff[i]>>=1;
                                if (CCAP0H > 0x06)
                                {
                                        IR_Rxbuff[i]|= 0x80;
                                }
                                else
                                {
                                        IR_Rxbuff[i] &= ~0x80;
                                }
                                IR_RXCnt++;
                                if (IR_RXCnt >= 32)
                                {
                                        if (!Flag_RecvOk) Flag_RecvOk = 1;
                                        Flag_IrStart = 0;
                                }
                        }                       
                }
        }
        CCAP0L=CCAP0H=CL=CH=0;                                        //清零PCA计数寄存器和捕获数据寄存器
}








回复

使用道具 举报

ID:161164 发表于 2023-3-2 21:05 | 显示全部楼层
三十块包邮的逻辑分析仪,你值得拥有
回复

使用道具 举报

ID:1034262 发表于 2023-3-2 22:38 | 显示全部楼层
示波器抓波形分析。
别说没有示波器,国产双通道100M的才1K多,或者300+的手持示波器,买一个。现代学电子技术,没个示波器怎么行。
回复

使用道具 举报

ID:969868 发表于 2023-3-3 16:54 | 显示全部楼层
不想买示波器可以上逻辑分析仪,我45某一个宝包邮的,感觉还不错
回复

使用道具 举报

ID:230500 发表于 2023-3-4 09:55 | 显示全部楼层
lkc8210 发表于 2023-3-2 21:05
三十块包邮的逻辑分析仪,你值得拥有

这个确实好用;我刚学红外遥控发射和解码的时候也买了一个 27元, 抓到波形后可以直接在电脑上就能手动算出来;很直观的可以看到起始信号,用户码 键值码 反码 重复码; 然后就会发现自己的程序是哪里出了问题; 调试利器 值得买一个!
1db568243740772279cb67e38a6fcfd.jpg


回复

使用道具 举报

ID:648281 发表于 2023-3-5 12:31 | 显示全部楼层
应该有相当一部分电扇的遥控器不是NEC编码的,需要用学习型的红外模块来做
回复

使用道具 举报

ID:796012 发表于 2023-3-14 16:59 | 显示全部楼层
51hei**1140 发表于 2023-3-5 12:31
应该有相当一部分电扇的遥控器不是NEC编码的,需要用学习型的红外模块来做

开风速键红外波形图.png

这是波形图,也看不懂,哈哈。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表