这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 通讯及无线技术 » 单片机如何对ISM工频的无线电接收模块进行解码?

共6条 1/1 1 跳转至

单片机如何对ISM工频的无线电接收模块进行解码?

工程师
2020-10-15 21:07:01     打赏

最近在学习无线的单片机解码。
示波器测试 :有的遥控器是24位脉冲 ,有是28位脉冲 有的遥控器是32位脉冲 汽车遥控器的脉冲数更多。 同步头也不同  

使用2个接收模块 测出来的波形也不相同 有一个MPS单片机的遥控器测出来相位相反  其他ev1527  2262 其他sop14单片机做的测出来相位相同。


这2个接收模块分别是PT4302  和SYN480 芯片的波形图:

image.png




关键词: 单片机     无线电     接收某款     工频     ISM    

工程师
2020-10-15 21:26:11     打赏
2楼

用第三个接收模块 (τ 宝买的超再生)却根本接收不到这款的****信号,其它的接收都正常,包括汽车遥控,滚动码,三个波形都一致。滚动码的脉冲多达95个。


工程师
2020-10-15 21:31:55     打赏
3楼

这份是从网上找的,程序中没有同步码解码  ,楼主可以参考一下!

#include<reg52.h>                 //库文件
#include< stdio.h>
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型

uint addr,key;
uchar cntint;//外部中断0计数


void eint0(void) interrupt 0//外部中断0
{
        static uint tempaddr;//接收地址缓存
        static uint tempkey;//接收数据缓存
        uint timecnt;
        timecnt=TH0*256+TL0;
        TH0=0;
        TL0=0;
        if(cntint<16)//接收地址码
        {
                tempaddr=tempaddr<<1;//将接收的到最低位移到最高位
                if(timecnt>1000)//210为宽脉冲与低脉冲界线,当振荡电阻为1M时,窄脉冲为110uS,宽脉冲为320uS
                {
                tempaddr|=1;//宽脉冲为1
                }
                cntint++;//中断次数加1
        }
        else if(cntint<24)//接收数据码
        {
                tempkey=tempkey<<1;
                if(timecnt>1000)
                {
                tempkey|=1;
                }
                cntint++;
        }
        else//cntint大于24也就是中断了25次时,关闭外部中断0,等待同步码
        {
                TMOD&=0xf0;//设定时器0为定时方式
                TMOD|=0x01;
                TH0=0xf9;
                TL0=0x66;
                cntint=0;
                EX0=0;//关外部中断0
                addr=tempaddr;
                key=tempkey;
                tempaddr=0;
                tempkey=0;
        }
        
}
void timer0(void) interrupt 1//定时器0中断,只有初始化时,空闲时和同步码到来时才中断
{
        TMOD&=0xf0;//将定时器0的工作方式设为门控定时,用以检测脉宽。
        TMOD|=0x09;
        cntint=0;//外部中断0中断次数设为0
        TH0=0;//设定时器0定时初值为0
        TL0=0;
        EX0=1;//允许外部中断0
        IE0=0;//清除外部中断0标志
}
void main(void)
{
       // void sendd(unsigned int intnum);
        unsigned int i;
        TMOD=0x21;//设定定时器0和定时器1,定时器1用来驱动串口
        TH0=0xf9;//设定定时器的初始值,这个值必小于同步码
        TL0=0x66;
//        TH1=243;//12M晶振时,串口波特率为2400
//        TL1=243;
                TH1=0xdc;//11.0592M晶振时,串口波特率为9600
          TL1=0xdc;
        SCON=0x50;//设定串口工作方式
        TI=1;//要用printf就将其设为1
        EA=1;//开所有中断
        ET0=1;//开定时器0中断
        EX0=0;//关外部中断0,在Timer0中断里面将其打开
        IT0=1;//外部中断0设为跳变触发
        TR0=1;//定时器0启动
        TR1=1;//定时器1启动
        while(1)
        {
//                P2=key;
//                P0=key>>8;
             printf("%u\n",addr);//输出解码地址
            printf("%u\n\n",key);//输出解码数据
                for(i=0;i<65500;i++);//这个用来防止串口不同步
        }
        
}

        
/********************************************************************
                              结束
*********************************************************************/


工程师
2020-10-15 22:04:21     打赏
4楼

感谢您的分享


工程师
2020-10-15 22:22:57     打赏
5楼

很复杂看起来


工程师
2020-10-18 22:50:42     打赏
6楼

代码写的很不错


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]