STM8使用定时器中断发送433模块

1、初始化定时器100us中断

void Tim4_Init(void)//1/(16/32/50)=100us
{
  TIM4_TimeBaseInit(TIM4_PRESCALER_32,50);
  TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE);
  TIM4_Cmd(ENABLE);
}

2、初始化IO

void GPIO_Init(void)
{
  GPIO_Init(RF433_GPIO_PORT,(GPIO_Pin_TypeDef)RF433_GPIO_PIN,GPIO_MODE_OUT_PP_LOW_FAST);
}

3、编写中断处理函数

unsigned char Send433_Status = 0; //发送过程的状态
unsigned int Send433_Time = 0;    //记录433发送数据的高低电平时间

unsigned char Yaokong_Data[4][3]={
                                  0x56,0x11,0x11,
                                  0x56,0x11,0x12,
                                  0x56,0x11,0x14,
                                  0x56,0x11,0x18,
                                  };

unsigned char Send433_Byte_Cont=0;//记录发送一组433数据的字节数
unsigned char Send433_Bit_Cont = 0; //记录发送位
unsigned char Temp=0;
bool  Chose_Data_En=0;//使能选择一组433数据的第N个字节

void Send433_Byte(void) //100us执行一次
{
  switch (Send433_Status)
  {
  case 0: //同步头高
    RF433_H;
    Send433_Status = 1; //进入同步头低
    break;
  case 1:
    RF433_L;
    if (++Send433_Time >= 31)
    {
      Send433_Time = 0;
      Send433_Status = 2; //进入发送24位
    }
    break;
  case 2:

    if(!Chose_Data_En)//还没开始发送 或者上次已经发送完一个字节才使能选择
    {
      Chose_Data_En=1;
      Temp=Yaokong_Data[3][Send433_Byte_Cont];
      //Send433_Byte_Cont++;
    }

    Send433_Time++;
    if (Temp & 0x80) //1
    {
      if (Send433_Time <= 3)
      {
        RF433_H;
      }
      else if (Send433_Time >= 4)
      {
        RF433_L;
        Send433_Time = 0;
        Temp <<= 1;
        Send433_Bit_Cont++;
      }
    }
    else
    {
      if (Send433_Time == 1)
      {
        RF433_H;
      }
      else if (Send433_Time > 1 && Send433_Time <= 4)
      {
        RF433_L;
        if (Send433_Time == 4)
        {
          Send433_Time = 0;
          Temp <<= 1;
          Send433_Bit_Cont++;
        }
      }
    }
    if (Send433_Bit_Cont == 8)//发送完一字节
    {
      Send433_Bit_Cont = 0;

      Chose_Data_En=0;//使能选择下一个字节
      if(++Send433_Byte_Cont==3)
      {
        Send433_Byte_Cont=0;
        Send433_Status = 0; //发送完毕
      }
    }
    break;
  default:
    break;
  }
}

433数据的同步头、数据“0”与“1”时间可以根据实际进行更改。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
)EV1527中断法解码 ① 设定定时器中断时间,设定为 80us,80us 进入中断进行解码。具体中断时间多少由自己 软件设定,但是中断时间不能太大。 ② 设定同步码解码范围,同步码定为 5.6ms - 16ms。进入中断判断到低电平,低电平判断 一直累加 Count_Lead++,累积低电平的采集时间,判断到高电平,就判断此时 Count_Lead 的值是否在 70 跟 200之间。(备注:5.6ms/80us=70 16ms/80us=200)。 ③ 引导头通过进入数据判断,刚开始是数据高电平,累积高电平的时间 Count_Data_Hi++, 当判断到低电平时候,判断 Count_Data_Hi 是否在 80us -2.4ms 之间。这里还没进行数据 0 跟 1 的区分,先把 Count_Data_Hi 的值保存在 Hi_Cnt 里面。 (备注:80us/80us=1 2.4ms/80us=30)。 ④ 高电平判断通过,开始判断低电平,累积低电平的时间 Count_Data_lo++,当判断到高电 平时候,判断 Count_Data_Lo 是否在 80us -2.4ms 之间。这里还没进行数据 0 跟 1 的区分, 先把 Count_Data_Lo 的值保存在 Lo_Cnt 里面。 (备注:80us/80us=1 2.4ms/80us=30)。 ⑤ 对 0 跟 1 进行区分,把 24bit 数据整理成三个 byte,存在数组 RfData[0],RfData[1], RfData[2]数组里面。 ⑥ 进行相应功能码的操作。 具体解码方法参考例子程序,因为不同的震荡电阻,1527 出来的编码长度不同,例子 程序是参考 1 lck=100us 波形来做的。具体时间参数可以根据自己的 1527 发射实际长度来 编写。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值