文章目录

  • 一、序言
  • 二、HCS301编码芯片TX时序
  • 三、检测摇控器开始发送数据
  • 四、中断中接数据
  • 五、KEELOQ算法的软件实现
  • 六、硬件跟上位机参考
  • 七、资料下载信息

工具购买:
stm32F070工具板

一、序言

最近在做433M无线模块的接收跟发送相关的模块,所以想做一些工具,方便以后使用。本文主要来介绍下433M无线的接收跟解码部分。我做了一个测试板。也做了上位机,现分享给大家。我的摇控器是用HCS301编码的。安全性比较高是用滚码的。还用了KEELOQ加密算法。对于一些固定码的433编码芯片来说,这个相对来说安全性比较高了。可以用在门锁上面,安全性要求比较高的应用上面。话不多说,下面就来介绍下这个实例吧。

二、HCS301编码芯片TX时序

时序如下图所示L:

这里有TP是前导码,了解433模块的应该都知道,433接收模块在静态时都会有一些噪声的干扰信号出来。前导信号起着开始发送的作用。他是占空比为50%的脉冲信号。TE是一个低电平信号。后面的是66bit的数据信号。

三、检测摇控器开始发送数据

由于433静态时存在干扰的特点。所以我们解码时就不能用中断方式进行。我们应该是检测到了发送信号的时候再来打开中断,在中断处理中配合定时器实现解码功能。433的干扰信号如下图所示:
综合考虑后,我决定开一个100us的定时器来检测TG信号。当检测到低电平达到TG信号长度的时候。认为摇控器开始发送数据过来。下面是中断处理函数。

//100us定时调用
void RFMODLE_CheckStart(void)
{//接收数据时,检测停止if(WakeupEnable == 0){return;}//读取电平状态CurrentPinStatus = xBSP_HCS301_GetPIn();//连续低电平累加if((LastPinStatus == CurrentPinStatus) && CurrentPinStatus == 0x00){LowTimeCount++;if(LowTimeCountMax < LowTimeCount){LowTimeCountMax = LowTimeCount;}}else{LowTimeCount = 0;//判断低电平脉冲是否符合TGif(LowTimeCountMax > 100 && LowTimeCountMax <257){//启动接收数据WakeupEnable = 0;//配置为中断模式xBSP_HCS301_IoInt();}LowTimeCountMax = 0;}LastPinStatus = CurrentPinStatus;
}

四、中断中接数据

注意,IO中断是采用双边沿的中断方式。

void xSYS_HCS301_IRQHandler(void)
{static uint16_t CurrentTimeValue;      //当前定时器的值static uint16_t LastTimeValue;         //上次定时器的值static uint16_t DetaTimeValue;         //两次进入函数的时间差static uint32_t PwmCount;               //前导部分PWM的计数值static uint16_t DataBitReceiveIndex;   //接前接收位的位置//清除状态if(HCS301_DecodeStep == 0){CurrentTimeValue = GET_TIMERCOUNT();LastTimeValue = GET_TIMERCOUNT();HCS301_DecodeStep++;PwmCount = 0;}//检测TP跟TH信号else if(HCS301_DecodeStep == 1){CurrentTimeValue = GET_TIMERCOUNT();DetaTimeValue = CurrentTimeValue - LastTimeValue;LastTimeValue = CurrentTimeValue;//TP PWM信号if(DetaTimeValue > 260 && DetaTimeValue < 660){PwmCount++;}//TG 信号else if(DetaTimeValue > 260*10 && DetaTimeValue < 660*10){//实际TP 信号有23个脉冲if(DetaTimeValue > 20){HCS301_DecodeStep++;DataBitReceiveIndex = 0;}else{goto error;}}else{goto error;}}//接收数据部分else if(HCS301_DecodeStep == 2){DataBitReceiveIndex++;CurrentTimeValue = GET_TIMERCOUNT();DetaTimeValue = CurrentTimeValue - LastTimeValue;LastTimeValue = CurrentTimeValue;//通过时间来判断逻辑1或0if(DataBitReceiveIndex%2 == 0){//记录位if(DetaTimeValue > (520) && DetaTimeValue < (1320)){WriteBit((DataBitReceiveIndex / 2) - 1 , 0x01);}else if(DetaTimeValue > (260) && DetaTimeValue < (660)){WriteBit((DataBitReceiveIndex / 2) -1 , 0x00);}else{//err;goto error;}//接收完成退出if(DataBitReceiveIndex == 128){//解密Test_DECRYPT(EncryPortion);//判断识别码值是否跟我烧录时候相同if((EncryPortion_de & 0x03FF0000) == 0x01370000){Sync_Current = EncryPortion_de;//两次同步值要不同才认为是新的按键按下if(Sync_Last != Sync_Current){FixedPortion_de = FixedPortion;gHcs301Code1 = FixedPortion_de;gHcs301Code2 = EncryPortion_de;IsSendCodeToPc = 1;}Sync_Last = Sync_Current;}goto error;}}}return;error://出错WakeupEnable = 1;HCS301_DecodeStep = 0;xBSP_HCS301_IoInput();
}void WriteBit(uint8_t bit , uint8_t value)
{if(bit < 32){if(value){EncryPortion |=  (0x01 << bit);}else{EncryPortion &=  ~(0x01 << bit);}}else if(bit < 64){bit -= 32;if(value){FixedPortion |=  (0x01 << bit);}else{FixedPortion &=  ~(0x01 << bit);}}else{}
}

五、KEELOQ算法的软件实现

/*************************************************************************************************************************/
//以下是加密跟解密相关的函数了。unsigned char NLF[2][2][2][2][2];void init()
{NLF[0][0][0][0][0]=0;NLF[0][0][0][0][1]=1;NLF[0][0][0][1][0]=1;NLF[0][0][0][1][1]=1;NLF[0][0][1][0][0]=0;NLF[0][0][1][0][1]=1;NLF[0][0][1][1][0]=0;NLF[0][0][1][1][1]=0;NLF[0][1][0][0][0]=0;NLF[0][1][0][0][1]=0;NLF[0][1][0][1][0]=1;NLF[0][1][0][1][1]=0;NLF[0][1][1][0][0]=1;NLF[0][1][1][0][1]=1;NLF[0][1][1][1][0]=1;NLF[0][1][1][1][1]=0;NLF[1][0][0][0][0]=0;NLF[1][0][0][0][1]=0;NLF[1][0][0][1][0]=1;NLF[1][0][0][1][1]=1;NLF[1][0][1][0][0]=1;NLF[1][0][1][0][1]=0;NLF[1][0][1][1][0]=1;NLF[1][0][1][1][1]=0;NLF[1][1][0][0][0]=0;NLF[1][1][0][0][1]=1;NLF[1][1][0][1][0]=0;NLF[1][1][0][1][1]=1;NLF[1][1][1][0][0]=1;NLF[1][1][1][0][1]=1;NLF[1][1][1][1][0]=0;NLF[1][1][1][1][1]=0;
}//获取source第n个位数
unsigned char getBit(unsigned char source[],int n)
{unsigned char temp0=(unsigned char)1<<(n%8);unsigned char temp1=source[n/8]&temp0;if(temp1!=0){return 1;}return 0;
}//source带进位右移
unsigned char * RRC(unsigned char source[],char c,char n)
{int i=0;unsigned char temp;for(i=n-1;i>=0;i--){temp=source[i];if(c!=0){source[i]=(source[i]>>1)|0x80;}else{source[i]=(source[i]>>1)&0x7f;}if((temp&0x01) != 0){c=1;}else{c=0;}}return source;
}//source带进位左移
unsigned char * RLC(unsigned char source[],char c,char n)
{int i=0;unsigned char temp;for(i=0;i<n;i++){temp=source[i];if(c!=0){source[i]=(source[i]<<1)|0x01;}else{source[i]=(source[i]<<1)&0xfe;}if((temp&0x80)!=0){c=1;}else{c=0;}}return source;
}//加密
unsigned char* CRYPT(unsigned char *source,unsigned char key[])
{int i=0;unsigned char c=0;unsigned char nlf,y16,y0,k,result;init();for (i = 0; i < 528; i++){nlf=NLF[getBit(source, 31)][getBit(source, 26)][getBit(source, 20)][getBit(source, 9)][getBit(source, 1)];y16=getBit(source, 16);y0=getBit(source, 0);k=getBit(key, i%64);result=nlf^y16^y0^k;if (result!=0) {c=1;}else {c=0;}source=RRC(source,c,4);}return source;
}//解密
unsigned char*  DECRYPT(unsigned char *source,unsigned char key[])
{int i=0;unsigned char c=0;unsigned char nlf,y15,y31,k,result;init();for (i = 528; i >0; i--){nlf=NLF[getBit(source, 30)][getBit(source, 25)][getBit(source, 19)][getBit(source, 8)][getBit(source, 0)];y15=getBit(source, 15);y31=getBit(source, 31);k=getBit(key, (i-1)%64);result=nlf^y15^y31^k;if ( result != 0){c=1;}      else{c=0;}                 source=RLC(source,c,4);}return source;
}/*
*********************************************************************************************************************@ Brief  : 解密数据@ Param  : NONE@ Return : NONE@ Author : YWJ(QQ:872180981)@ Data   : 2020-08-29 17:23*********************************************************************************************************************
*/
void Test_DECRYPT(uint32_t data)
{source[0]=(unsigned char)(data);source[1]=(unsigned char)(data>>8);source[2]=(unsigned char)(data>>16);source[3]=(unsigned char)(data>>24);//解密DECRYPT(source, HCS301_Decryptkey);EncryPortion_de = source[3];EncryPortion_de <<= 8;EncryPortion_de |= source[2];EncryPortion_de <<= 8;EncryPortion_de |= source[1];EncryPortion_de <<= 8;EncryPortion_de |= source[0];
}

六、硬件跟上位机参考

由于这次主要是介绍HCS301的解码程序。上位机部分只是作一个显示。还涉及到USB通讯、QT等相关。所以就不多讲解。

上位机:

硬件电路板,电路板可出售,后续会在上面做更多功能。比如说已经完成的HCS301烧录器。

七、资料下载信息

由于百度网盘会更新,可以进群看QQ公告.所以资料都会在同一个地址分享.
群号:339420387

433模块-----HCS301单片机解码相关推荐

  1. 433模块-----HCS301芯片烧录器

    工具购买: stm32F070工具板 话不多说直接上软件界面跟硬件图: QT软件界面 硬件图 摇控器 资料下载信息 由于百度网盘会更新,可以进群看QQ公告.所以资料都会在同一个地址分享. 群号:339 ...

  2. ev1527、pt2262等433/315MHZ芯片用stc单片机解码,含源程序

    ev1527.pt2262等433/315MHZ芯片用stc15w204s-sop8单片机解码,含源程序 硬件介绍: 软件介绍: 单片机引脚定义: 解码原理: 最终结果: 主要代码 pt2262.c ...

  3. 单片机蓝牙烧录_蓝牙模块与单片机如何连接?

    蓝牙模块与单片机如何连接? 首先我们来看看蓝牙模块 蓝牙模块HC-05: TX连接单片机P3.0口,RX连接单片机P3.1口. 在蓝牙模块连接到单片机上前,首先通过USB-TTL转接器,连接到电脑上后 ...

  4. 433模块 防冲撞 解决多发一收 mesh自组网 方案实现

    433模块 防冲撞 解决多发一收 mesh自组网 方案实现 本文推荐一种自带组网协议,可实现自组网.串口透传.支持点对点星型mesh组网.防冲撞.数据加密.一键入网等功能的433模块,可代替zigbe ...

  5. python3中利用serial模块实现单片机与python上位机的通信(串口调试助手)

    1.指标:    python上位机向单片机发送字符,单片机如果收到的字符为'1',则点亮灯1,如果收到的字符为'2',则点亮灯2:单片机若接受到字符,读取字符后,向python上位机发送字符(1-& ...

  6. 蓝牙模块惨痛教训——模块与单片机串口的隔离(更新)

    技术小白,感谢大家阅读和点赞!使用蓝牙模块也有段时间了,更新-- 现在市面上用的蓝牙芯片大部分是ble的了,也就是低功耗透传模式.最近用到蓝牙SOC(片上系统),和大家分享下. 我们平时用蓝牙,一般是 ...

  7. hc05与单片机连接图_蓝牙模块与单片机如何连接?

    蓝牙模块与单片机如何连接? 首先我们来看看蓝牙模块 蓝牙模块HC-05: TX连接单片机P3.0口,RX连接单片机P3.1口. 在蓝牙模块连接到单片机上前,首先通过USB-TTL转接器,连接到电脑上后 ...

  8. 合泰32-Onenet-WiFi模块-合泰单片机通过MQTT协议数据上云(一)

    本篇目标 一.调通合泰单片机串口(成功接收和发送数据) 二.通过WiFi模块连接到Onenet_MQTT服务器 合泰32串口 HT32F5XXX串口 如下表所示,HT32F52352芯片USART0. ...

  9. xbee模块和单片机_基于XBee进行ZigBee组网

    该文章转帖自:http://blog.csdn.net/u012261135/article/details/48594419 文章简单地介绍了XBee模块.应用组合和2种通讯方式,还有XCTU的基本 ...

最新文章

  1. 各小组对于自己产品的预期“软件下载/用户人数”
  2. jquery选中checkbox
  3. DataTables提示:DataTables warning: table id=queueInfo_table - Requested unknown parameter 'type' for r
  4. LRU算法四种实现方式介绍
  5. 基于人工神经网络的识别C语言,实验一基于人工神经网络的数码识别.doc
  6. Java基础---“方法”题目练习
  7. 云服务器与传统服务器的优劣对比_为什么选择海外云服务器和香港云服务器
  8. Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)
  9. 在gns3中搭建VTP演示实验
  10. ORACLE自增长字段实现(转)
  11. 给 WordPress 博客添加 Tabs 标签切换功能
  12. 学python有前途吗-我们能用Python做什么?学Python有前途吗?
  13. [Tool] SourceTree初始化GitFlow遇到错误(git command not found)的解决方案
  14. MVVM前后分离轻量级框架应用juicer和doT.js
  15. pythontkinter界面切换效果_python tkinter实现界面切换的示例代码
  16. python找重复元素_Python笔记(二)查找重复元素
  17. 如何access表中加一行_access数据库增加一行
  18. 2018招行笔试分红包
  19. 反向传播算法公式推导,神经网络的推导
  20. 最好看的Excel条形图 如何用Excel图表把它做出来

热门文章

  1. 玩转Python :获取微信好友个性签名生成词云
  2. 【名词解释】电信技术名词解释大全
  3. HorNet: Efficient High-Order Spatial Interactions with Recursive Gated Convolutions
  4. 解决docker-compose: 未找到命令问题
  5. Struts2+ibatis+dwz 框架实现uploadify上传文件
  6. Oracle 利用 UTL_SMTP 包发送邮件
  7. MBI5020 LED驱动
  8. java双人俄罗斯方块_双人版俄罗斯方块
  9. 农行c语言笔试题,中国农业银行总行计算机类笔试面试经验
  10. [Datasheet PHY] ksz8081数据手册解读