标题:
一个433 315 RF的STM32解码程序
[打印本页]
作者:
boboxuexi
时间:
2020-10-23 13:04
标题:
一个433 315 RF的STM32解码程序
RF 协议 同步信号 300us高电平 10MS 低电平,数据 “0” 300us 高电平 1ms 低电平。
数据 “1” 1ms 高电平 300us低电平。
只需要配置一个中断,将这个函数放在中断里调用,
void ir_interrupt_drives(void)//中断50us中调用
在main 中 while(1)里面 调用 IR_Process(); 即可实现RF的解码。
单片机源程序如下:
// Copyright (c) all rights reserved
//********************版权和版本的声明**********************
//************************项目信息**************************
//项目名称:
//客户名称:
//************************文件信息**************************
//文件名称: hal_ir.c
//文件头文件: hal_ir.h
//作 者:zenghb
//起止时间:2020年3月26日11:58:41
//文件版本:V2.0
//校 验 和:
//************************硬件信息**************************
//目标器件:ob39s003
//源 时 钟:
//PCBA型号:
//************************平台信息**************************
//开发环境:keil
//烧录环境:
//配置内容:
//************************功能信息**************************
//程序功能:
//函数列表:
//************************修改记录**************************
// <author> <time> <version> <desc>
//1.zenghb 2020-03-26 V2.0
//2.
//**********************************************************
#include "hal_ir.h"
#define INTERRUPT_INT4 2
//-------------------------1-------------------------------------------------------------------
IR_Typedef IR1;
#define IR1_DECODE_VALUE 0x87
#define IR2_DECODE_VALUE 0x87
#define IR3_DECODE_VALUE 0x87
#define IR4_DECODE_VALUE 0x87
#define IR5_DECODE_VALUE 0x87
#define IR6_DECODE_VALUE 0x87
//unsigned int ProcessTime;
void ir_agreement_check(void)
{
static unsigned char i; //接收红外信号处理
IR1.IrTimeOutCnt = 20;
IR1.Falg.bits.IrEndFlag = 0; //只要有下降沿,结束是不存在结束。
if(IR1.Falg.bits.StartFlag)
{
if( IR1.IrTime < 220 && IR1.IrTime >= 180)//引导码 TC9012的头码,10.0ms
{
i=0;
}
if(!IR1.Falg.bits.IR_OK)
{
if(i>1)
{
if(IR1.IrTime < 4 || IR1.IrTime > 23)
{
IR1.Falg.bits.StartFlag = 0;
}
}
IR1.IrData[i++] = (unsigned char)IR1.IrTime;//存储每个电平的持续时间,用于以后判断是0还是1
IR1.IrTime = 0;
}
if(i >= 24)
{
IR1.Falg.bits.IR_OK=1;
i=0;
}
}
else
{
IR1.IrTime = 0;
IR1.Falg.bits.StartFlag = 1;
}
}
void ir_decode(void)//红外码值处理函数
{
unsigned char i,j, k,value;
k=1;
for(i=0;i<3;i++)
{
for(j=1;j<=8;j++) //处理1个字节8位
{
value<<=1;
if( IR1.IrData[k] > 17 && IR1.IrData[k] < 23)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
{
value|=0x01;
}
k++;
}
IR1.IrCode[i] = value;
}
value=0;
}
void IR_Process(void)
{
if(IR1.Falg.bits.IR_OK) //如果接收好了进行红外处理
{
ir_decode1();
if(IR1.ProcessTime>0)
{
IR1.IrCode[0]=0;
IR1.IrCode[1]=0;
IR1.IrCode[2]=0;
}
IR1.Falg.bits.IR_OK=0;
if(IR1.IrCode[0]==0xaa && IR1.IrCode[1]==0xaa)
{
IR1.ProcessTime = 10000;
}
}
}
void ir_interrupt_drives(void)//中断100us中调用
{
static unsigned char CheckCnt,IRStatus=0;
if(IR1.ProcessTime>0)
{
IR1.ProcessTime--;
}
if(PIN_IR1)
{
if(++CheckCnt > 2)//在中断中调用 值为2即可,快速扫描,适当加长可提高防抖效果。
{
CheckCnt = 2;
if(IRStatus==0)
{
ir_agreement_check1();//下降沿
}
IRStatus =1;
}
}
else
{
IR1.IrTime++;
if(CheckCnt)
{
CheckCnt--;
}
else
{
if(IRStatus)
{
IRStatus = 0;
}
}
}
}
复制代码
作者:
aaa112
时间:
2021-8-1 15:08
不用中断方式行吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1