![]() |
發布時間: 2024-8-19 09:38
正文摘要:各位大哥,問下有誰寫過無線遙控接收的嗎?目前用了334MHZ的晶振。發射的是五段引導碼+32位波形,如下,怎么寫?給個思路。 |
1481509156 發表于 2024-8-21 20:01 用示波器看下定時時間對不對, 簡單一些用那種8路輸入的邏輯分析儀也可以的 |
你這個是無解的. 放棄吧, 遙控分固定碼和滾動碼. 看波形, 你這每一幀都不一樣的. 是滾動碼, 不懂它的滾動算法, 是不能解碼的 |
xmcolong 發表于 2024-8-21 19:00 我這配置有問題嗎?我這邊IO腳收到波形,然后也能進入中斷(在中斷點燈和定時器判斷為1時關燈,燈是閃爍的),但解碼部分解不出來 |
我用100us 都可以的, 50us也是沒有問題的 |
xmcolong 發表于 2024-8-21 02:02 那個注釋是錯誤的,我這里定時器1是定時50us檢測一次的 |
if(INTFbits.T1IF) // 定時器0中斷 132 = 1MS ................................................................................................................. 定時時間太長了, 改us的! |
fj51hei 發表于 2024-8-20 16:59 是的,電平脈寬高一樣,是由低電平時長部分決定0/1 |
coody_sz 發表于 2024-8-20 15:31 這個只是脈寬不同吧? |
xiaobendan001 發表于 2024-8-20 08:30 大佬,我按照如下模式寫了解碼,沒生效,幫忙看下哪里的問題 void main(void) { GPIO_INIT(); DISI(); // 禁用所有未屏蔽的中斷 //AWUCON = 0X80; //0010 0000 // TMR0 = 0; // 加載0x00到TMR0(初始定時器寄存器) //T0MD = 0X01; // 將precaler0賦給Timer0, precaler0分割率= 1:8,時鐘源為指令時鐘 //INTE = 0X01; // 使能定時器0中斷&PABIE狀態變化中斷 //;啟用Timer0和全局中斷位 //PCON1 = C_TMR0_En; // 啟用Timer0 ENI(); while(1) { CLRWDT(); RX_SHUT=0; CLRWDT(); Timer1_INIT(); soft_decodetask(); } } void isr(void) __interrupt(0) { if(INTFbits.T1IF) // 定時器0中斷 132 = 1MS { if(RFDecodeOK == 0) { if(!RX_DATA) { IR_Time_L++; IR_Time_H=0; if(JumpFlag && IR_Time_L > 4) { JumpFlag=0; } } else { IR_Time_H++; if(!JumpFlag && IR_Time_H > 4) { JumpFlag=1; soft_decode(); IR_Time_L=0; IR_Time_H=0; } } } INTF= (unsigned char)~(C_INT_TMR1); // 清除T0IF標志位 } } /******************************定時器配置*************************************************/ void Timer1_INIT(void) { TMRH = 0; TMR1 = 50; //50us T1CR1 = 0x03; T1CR2 = C_TMR1_ClkSrc_Inst | C_PS1_Div4; INTE = 0x08; } /******************************中斷*************************************************/ void soft_decode() //解碼 { static unsigned char RxBitCnt = 0; //接收數據位 static unsigned long RxData = 0; //數據緩沖 if(IR_State==0) { if((IR_Time_L >= 19) && (IR_Time < 25)) { IR_State=1; RxData=0; RxBitCnt=0; } else { IR_State=0; } } else if(IR_State==1 && RxBitCnt < 32) { if((IR_Time_L > 6) && (IR_Time_L < 9)) { RxData = RxData<<1; RxBitCnt++; } else if((IR_Time_L > 11) && (IR_Time_L < 14)) { RxData = RxData<<1; RxData |=1; RxBitCnt++; } else { RxBitCnt=0; IR_State=0; } if(IR_cnt>=32) { RxBitCnt=0; IR_State=0; RxUserCode = RxData >> 24; if(RxUserCode == K1_NUM1) { RFDecodeOK = 1; RX_flag = 1; } else if(RxUserCode == K1_NUM2) { RFDecodeOK = 1; RX_flag = 2; } else if(RxUserCode == K2_NUM1) { RFDecodeOK = 1; RX_flag = 3; } else if(RxUserCode == K2_NUM2) { RFDecodeOK = 1; RX_flag = 4; } } } } void soft_decodetask(void) { static unsigned int RxTimerCnt = 0; if(RFDecodeOK) { RFDecodeOK = 0; if(RX_flag==1){LED123=0;} if(RX_flag==2){LED123=1;} if(RX_flag==3){LED123=0;} if(RX_flag==4){LED123=1;} } if(RFDecodeOK) { RxTimerCnt++; if(RxTimerCnt >= 2000) { RxTimerCnt=0; RFDecodeOK=0; } } } |
coody_sz 發表于 2024-8-20 15:31 大哥,幫忙看下我這程序為啥不生效 |
coody_sz 發表于 2024-8-20 15:31 void main(void) { GPIO_INIT(); DISI(); // 禁用所有未屏蔽的中斷 //AWUCON = 0X80; //0010 0000 // TMR0 = 0; // 加載0x00到TMR0(初始定時器寄存器) //T0MD = 0X01; // 將precaler0賦給Timer0, precaler0分割率= 1:8,時鐘源為指令時鐘 //INTE = 0X01; // 使能定時器0中斷&PABIE狀態變化中斷 //;啟用Timer0和全局中斷位 //PCON1 = C_TMR0_En; // 啟用Timer0 ENI(); while(1) { CLRWDT(); RX_SHUT=0; CLRWDT(); Timer1_INIT(); soft_decodetask(); } } void isr(void) __interrupt(0) { if(INTFbits.T1IF) // 定時器0中斷 132 = 1MS { if(RFDecodeOK == 0) { if(!RX_DATA) { IR_Time_L++; IR_Time_H=0; if(JumpFlag && IR_Time_L > 4) { JumpFlag=0; } } else { IR_Time_H++; if(!JumpFlag && IR_Time_H > 4) { JumpFlag=1; soft_decode(); IR_Time_L=0; IR_Time_H=0; } } } INTF= (unsigned char)~(C_INT_TMR1); // 清除T0IF標志位 } } /******************************定時器配置*************************************************/ void Timer1_INIT(void) { TMRH = 0; TMR1 = 50; //50us T1CR1 = 0x03; T1CR2 = C_TMR1_ClkSrc_Inst | C_PS1_Div4; INTE = 0x08; } /******************************中斷*************************************************/ void soft_decode() //解碼 { static unsigned char RxBitCnt = 0; //接收數據位 static unsigned long RxData = 0; //數據緩沖 if(IR_State==0) { if((IR_Time_L >= 19) && (IR_Time < 25)) { IR_State=1; RxData=0; RxBitCnt=0; } else { IR_State=0; } } else if(IR_State==1 && RxBitCnt < 32) { if((IR_Time_L > 6) && (IR_Time_L < 9)) { RxData = RxData<<1; RxBitCnt++; } else if((IR_Time_L > 11) && (IR_Time_L < 14)) { RxData = RxData<<1; RxData |=1; RxBitCnt++; } else { RxBitCnt=0; IR_State=0; } if(IR_cnt>=32) { RxBitCnt=0; IR_State=0; RxUserCode = RxData >> 24; if(RxUserCode == K1_NUM1) { RFDecodeOK = 1; RX_flag = 1; } else if(RxUserCode == K1_NUM2) { RFDecodeOK = 1; RX_flag = 2; } else if(RxUserCode == K2_NUM1) { RFDecodeOK = 1; RX_flag = 3; } else if(RxUserCode == K2_NUM2) { RFDecodeOK = 1; RX_flag = 4; } } } } void soft_decodetask(void) { static unsigned int RxTimerCnt = 0; if(RFDecodeOK) { RFDecodeOK = 0; if(RX_flag==1){LED123=0;} if(RX_flag==2){LED123=1;} if(RX_flag==3){LED123=0;} if(RX_flag==4){LED123=1;} } if(RFDecodeOK) { RxTimerCnt++; if(RxTimerCnt >= 2000) { RxTimerCnt=0; RFDecodeOK=0; } } } |
不歸零碼吧?測量高低電平,判斷在一定范圍內,然后計算占空比,確定0或1。 315、433無線遙控我喜歡用曼徹斯特編碼(歸零碼),歸零碼更適合幅度鍵控類無線遙控,距離更遠,自適應解碼,恢復時鐘方便。 |
測量周期,長短不同 |