应该有相当一部分电扇的遥控器不是NEC编码的,需要用学习型的红外模块来做 |
lkc8210 发表于 2023-3-2 21:05 这个确实好用;我刚学红外遥控发射和解码的时候也买了一个 27元, 抓到波形后可以直接在电脑上就能手动算出来;很直观的可以看到起始信号,用户码 键值码 反码 重复码; 然后就会发现自己的程序是哪里出了问题; 调试利器 值得买一个! ![]() |
不想买示波器可以上逻辑分析仪,我45某一个宝包邮的,感觉还不错 |
示波器抓波形分析。 别说没有示波器,国产双通道100M的才1K多,或者300+的手持示波器,买一个。现代学电子技术,没个示波器怎么行。 |
三十块包邮的逻辑分析仪,你值得拥有 |
/******************************************** 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计数寄存器和捕获数据寄存器 } |