无线模块 2272 2262问题

2019-08-17 06:55发布

新手求教
想用PT2262/2272做无线遥控,数据输出高电平,按键后变为低电平,所以我的想法是在PC 0 1 2 3口下拉输入,当输入变为高电平时返回值。
不知道我的思路有没有什么错误
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
liuje
2019-08-17 20:22
更好更省成本的作法是,   直接使用 STM32 解码 ,   只需要RF接收模块就行了.   不需要再用PT解码IC.

原子的教程改一下,  就能轻松处理 T 的编码,  还可以自适应不同的振荡电阻呢!!!!

//检测脉冲宽度
//最长脉宽为20ms
//返回值:x,代表脉宽为x*10us(x=1~2000)
u16 ulse_Width_Check(void)
{
    u16 t=0;  
    while(!RDATA)
    {  
t++;
delay_us(10);  
        if(t==2000)return t; //超时溢出
    }
    return t;
}    



void EXTI9_5_IRQHandler(void)
{       
u16 res,pulse1,pulse2;  
    u8 i;

if (DO_flag) {  //主程序允许接收RF信号时才处理
while (RDATA);              //等待低电平
    res=Pulse_Width_Check();    //量测脉宽宽度
    if(res==2000) goto RemExit;   //超时就直接退出

if(res<1400 && res>1250) {       // 同步码?(4.7M)
    for (i=1; i<=12; i++)  {     //共需解出12bits
           while (!RDATA);          //等待高电平
   while (RDATA);           //等待低电平
       pulse1=Pulse_Width_Check();        //量测脉宽宽度
       if(pulse1==2000) goto RemExit;   //超时就直接退出

           while (!RDATA);            //等待高电平
   while (RDATA);             //等待低电平
       pulse2=Pulse_Width_Check();        //量测脉宽宽度
       if(pulse2==2000) goto RemExit;   //超时就直接退出

       if ((pulse1<50 && pulse1>30) && (pulse2<50 && pulse2>30)) {
      receive<<=1;
              receive+=1;   }            //保存 1           
           else if ((pulse1<135 && pulse1>115) && (pulse2<135 && pulse2>115)) {
            receive<<=1;  }        //保存0 
   else if ((pulse1<135 && pulse1>115) && (pulse2<50 && pulse2>30)) {
            }                      //浮接状态
   else goto RemExit;      
     
     }       
         Remote_Rdy=1;  //译码完成
     goto RemEnd;
}
 
  if(res<1100 && res>900) {         //同步码?(3.3M) 
    for (i=1; i<=12; i++)  {      //共需解出12bits
           while (!RDATA);           //等待高电平
   while (RDATA);            //等待低电平
       pulse1=Pulse_Width_Check();        //量测脉宽宽度
       if(pulse1==2000) goto RemExit;   //超时就直接退出

           while (!RDATA);           //等待高电平
   while (RDATA);            //等待低电平
       pulse2=Pulse_Width_Check();        //量测脉宽宽度
       if(pulse2==2000) goto RemExit;   //超时就直接退出

       if ((pulse1<40 && pulse1>20) && (pulse2<40 && pulse2>20)) {
      receive<<=1;
              receive+=1;   }         //保存 1           
           else if ((pulse1<100 && pulse1>80) && (pulse2<100 && pulse2>80)) {
      receive<<=1;  }           //保存0 
   else if ((pulse1<100 && pulse1>80) && (pulse2<40 && pulse2>20)) {
            }                   //浮接状态
   else goto RemExit; 

         }       
         Remote_Rdy=1;  //译码完成
     goto RemEnd;
}
   
   if(res<550 && res>400) {          // 同步码?(1.5M)
    for (i=1; i<=12; i++)  {     //共需解出12bits
           while (!RDATA);           //等待高电平
   while (RDATA);            //等待低电平
       pulse1=Pulse_Width_Check();        //量测脉宽宽度
       if(pulse1==2000) goto RemExit;   //超时就直接退出

           while (!RDATA);           //等待高电平
   while (RDATA);            //等待低电平
       pulse2=Pulse_Width_Check();        //量测脉宽宽度
       if(pulse2==2000) goto RemExit;   //超时就直接退出

       if ((pulse1<15 && pulse1>5) && (pulse2<15 && pulse2>5)) {
      receive<<=1;
              receive+=1;   }         //保存 1           
           else if ((pulse1<50 && pulse1>30) && (pulse2<50 && pulse2>30)) {
      receive<<=1;  }           //保存0 
   else if ((pulse1<50 && pulse1>30) && (pulse2<15 && pulse2>5)) {
            }                   //浮接状态   
   else goto RemExit;    

         }       
         Remote_Rdy=1;  //译码完成
     goto RemEnd;
}
    }
 RemExit:
    Remote_Rdy=0; 

 RemEnd:
EXTI->R=1<<5;      //清除中断标志位   (INT5)     
}

一周热门 更多>