找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1862|回复: 7
打印 上一主题 下一主题
收起左侧

433M无线STC单片机解码程序,外部中断方式

  [复制链接]
跳转到指定楼层
楼主
ID:193324 发表于 2023-2-13 11:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近需要用到433M的单片机解码,上网搜了一下。大部分的程序都是基于定时器定时检测。感觉逻辑不够严谨。对于新手理解起来也比较困难。
我首先开了一个us级的定时器,持续计数。不需要打开中断。
然后配置好对应的接收芯片的管脚。配置为外部中断。触发方式为上升沿,下降沿都触发。
在外部中断函数里面,记录当前定时器的计数值,然后清零计数器。
定义一个状态机
state = 0时:默认状态,检测是否为高电平。如果为高电平代表为上升沿,判断同步信号。
state = 1时:检测是否为低电平,如果为低电平,表示为下降沿,此时记录的时间为高电平的持续时间。判断是否符合同步信号的高电平时间要求。符合进入下一状态
state = 2时:检测管脚是否为高电平,如果为高电平,表示为上升沿,此时记录的时间为低电平持续时间。判断是否符合同步信号的低电平时间要求。符合进入接收状态。不符合,回到初始状态。
以此类推....具体可以看单片机程序

  1. #define SYNC_H_MIN   0           //同步信号高电平持续时间 最低范围
  2. #define SYNC_H_MAX   600       //同步信号高电平持续时间 最高范围


  3. #define SYNC_L_MIN  8000       //同步信号低电平持续时间的最小值
  4. #define SYNC_L_MAX  10997    //同步信号高电平持续时间的最大值,符合这个范围都判定有效。


  5. #define DAT1_H_MIN     800    //数据1的高电平持续时间最小值  
  6. #define DAT1_H_MAX   1063   //数据1的高电平持续时间最大值
  7. #define DAT1_L_MIN      220    //数据1的低电平持续时间最小值
  8. #define DAT1_L_MAX    400     //数据1的低电平持续时间最大值   

  9. #define DAT0_H_MIN     220
  10. #define DAT0_H_MAX    400
  11. #define DAT0_L_MIN      800
  12. #define DAT0_L_MAX    1063
复制代码

  1. uint32_t bitNums  = 0;    //已经接收的位数。
  2. uint32_t valueTmp = 0;    //接收的数据。
  3. uint32_t value = 0;  

  4. void Ext_INT1 (void) interrupt INT1_VECTOR                //进中断时已经清除标志
  5. {
  6.                 uint8_t  de = 0;                                                    //管脚的状态
  7.                 uint32_t holdTime  = 0;                                    //持续的时间
  8.                
  9.                 Timer1_Stop();
  10.                 holdTime  = (TH1<<8) | TL1;
  11.                 TH1= 0;TL1 =0;
  12.                 de = P33;            //读取IO口状态
  13.                 Timer1_Run();
  14.                

  15.                 switch(state)
  16.                 {
  17.                         case 0:               
  18.                                 if(de == 1)         //如果是高电平,那么是上升沿
  19.                                         state= 1;
  20.                         break;
  21.                         case 1:                        //同步头高电平时间结束的时候
  22.                                 if( de == 0                //检测到下降沿,并判断持续的时间
  23.                                         && holdTime  >= SYNC_H_MIN
  24.                                         && holdTime  <= SYNC_H_MAX)
  25.                                 {
  26.                                         state = 2;
  27.                                 }
  28.                                 else
  29.                                 {
  30.                                         state = 1;
  31.                                 }
  32.                                        
  33.                         break;
  34.                         case 2:                //同步信号低电平时间结束时,上升沿
  35.                         {
  36.                                 if( de == 1
  37.                                         && holdTime >= SYNC_L_MIN
  38.                                         && holdTime <= SYNC_L_MAX)    //判断同步低电平时间是否符合要求
  39.                                 {
  40.                     //符合要求,清0接收到的位数和数据。准备开始接收
  41.                                         bitNums = 0;   
  42.                                         valueTmp= 0;
  43.                                         state = 3;
  44.                                 }
  45.                                 else
  46.                                 {
  47.                     //不符合要求直接回到状态1,不用回到状态0,因为不需要判断同步信号的高电平
  48.                     //持续时间,低电平满足需求即可
  49.                                         state = 1;
  50.                                 }
  51.                         }
  52.                         break;
  53.                         case 3:                //信号高电平结束时
  54.                                 if(de == 0)
  55.                                 {
  56.                                         valueTmp <<= 1;
  57.                                        
  58.                                         if(holdTime >= DAT1_H_MIN && holdTime <= DAT1_H_MAX)
  59.                                         {
  60.                                                 valueTmp += 1;                //符合数据1的高部分
  61.                                                 state = 4;
  62.                                         }
  63.                                         else if(holdTime >= DAT0_H_MIN && holdTime <= DAT0_H_MAX)
  64.                                         {
  65.                                                                         //符合数据0的高部分
  66.                                                 state = 5;
  67.                                         }
  68.                                         else
  69.                                         {
  70.                                                 state = 1;
  71.                                                 break;
  72.                                         }
  73.                                         bitNums += 1;
  74.                                         if(bitNums >= 24)
  75.                                         {   
  76.                         value = valueTmp;       //保存接收到的数据。
  77.                                                 state = 1;
  78.                                         }
  79.                                 }
  80.                                 else
  81.                                 {

  82.                                         state = 1;
  83.                                 }
  84.                         break;
  85.                         case 4:                //判断数据1的低电平时间是否符合要求
  86.                         {
  87.                                 if( de == 1
  88.                                         && holdTime >= DAT1_L_MIN
  89.                                         && holdTime <= DAT1_L_MAX)
  90.                                 {
  91.                     //符合数据1的低电平时间要求,回到3重新接收下一个数据。
  92.                                         state = 3;
  93.                                 }
  94.                                 else
  95.                                 {
  96.                                         state = 1;        
  97.                                 }
  98.                         }
  99.                         break;
  100.                         case 5:        //判断数据0的低电平时间是否符合要求
  101.                         {
  102.                                 if( de == 1
  103.                                         && holdTime >= DAT0_L_MIN
  104.                                         && holdTime <= DAT0_L_MAX)
  105.                                 {
  106.                     //符合要求,接收下一个数据。
  107.                                         state = 3;
  108.                                 }
  109.                                 else
  110.                                 {
  111.                                         state = 1;
  112.                                 }
  113.                         }                        
  114.                         break;
  115.                         default:
  116.                                 state = 0;
  117.                         break;
  118.                 }
  119.         
  120. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:914666 发表于 2023-2-13 21:05 | 只看该作者
好使吗?我看了好多的这个例子315一样用吗
回复

使用道具 举报

板凳
ID:193324 发表于 2023-2-14 09:22 | 只看该作者
315的没有试过。433的可以
回复

使用道具 举报

地板
ID:82067 发表于 2023-2-14 16:24 | 只看该作者
一般原因是外界的干扰太多了,使用中断后,单片机根本就没法做其他任务了
回复

使用道具 举报

5#
ID:28752 发表于 2023-2-14 21:16 | 只看该作者
超再生等模块,全是噪声,能正常解码???
回复

使用道具 举报

6#
ID:193324 发表于 2023-2-16 09:21 | 只看该作者
grb7906 发表于 2023-2-14 21:16
超再生等模块,全是噪声,能正常解码???

可以的。 没有接收到是正常数据时,全是噪声的
回复

使用道具 举报

7#
ID:1098406 发表于 2023-12-5 11:09 | 只看该作者
holdtime是100us增加一吗
回复

使用道具 举报

8#
ID:287224 发表于 2023-12-12 14:16 | 只看该作者
yinds5092 发表于 2023-2-13 21:05
好使吗?我看了好多的这个例子315一样用吗

433,315跟软件没有关系的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表