標(biāo)題:
一個(gè)433 315 RF的STM32解碼程序
[打印本頁]
作者:
boboxuexi
時(shí)間:
2020-10-23 13:04
標(biāo)題:
一個(gè)433 315 RF的STM32解碼程序
RF 協(xié)議 同步信號(hào) 300us高電平 10MS 低電平,數(shù)據(jù) “0” 300us 高電平 1ms 低電平。
數(shù)據(jù) “1” 1ms 高電平 300us低電平。
只需要配置一個(gè)中斷,將這個(gè)函數(shù)放在中斷里調(diào)用,
void ir_interrupt_drives(void)//中斷50us中調(diào)用
在main 中 while(1)里面 調(diào)用 IR_Process(); 即可實(shí)現(xiàn)RF的解碼。
單片機(jī)源程序如下:
// Copyright (c) all rights reserved
//********************版權(quán)和版本的聲明**********************
//************************項(xiàng)目信息**************************
//項(xiàng)目名稱:
//客戶名稱:
//************************文件信息**************************
//文件名稱: hal_ir.c
//文件頭文件: hal_ir.h
//作 者:zenghb
//起止時(shí)間:2020年3月26日11:58:41
//文件版本:V2.0
//校 驗(yàn) 和:
//************************硬件信息**************************
//目標(biāo)器件:ob39s003
//源 時(shí) 鐘:
//PCBA型號(hào):
//************************平臺(tái)信息**************************
//開發(fā)環(huán)境:keil
//燒錄環(huán)境:
//配置內(nèi)容:
//************************功能信息**************************
//程序功能:
//函數(shù)列表:
//************************修改記錄**************************
// <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; //接收紅外信號(hào)處理
IR1.IrTimeOutCnt = 20;
IR1.Falg.bits.IrEndFlag = 0; //只要有下降沿,結(jié)束是不存在結(jié)束。
if(IR1.Falg.bits.StartFlag)
{
if( IR1.IrTime < 220 && IR1.IrTime >= 180)//引導(dǎo)碼 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;//存儲(chǔ)每個(gè)電平的持續(xù)時(shí)間,用于以后判斷是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)//紅外碼值處理函數(shù)
{
unsigned char i,j, k,value;
k=1;
for(i=0;i<3;i++)
{
for(j=1;j<=8;j++) //處理1個(gè)字節(jié)8位
{
value<<=1;
if( IR1.IrData[k] > 17 && IR1.IrData[k] < 23)//大于某值為1,這個(gè)和晶振有絕對(duì)關(guān)系,這里使用12M計(jì)算,此值可以有一定誤差
{
value|=0x01;
}
k++;
}
IR1.IrCode[i] = value;
}
value=0;
}
void IR_Process(void)
{
if(IR1.Falg.bits.IR_OK) //如果接收好了進(jìn)行紅外處理
{
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中調(diào)用
{
static unsigned char CheckCnt,IRStatus=0;
if(IR1.ProcessTime>0)
{
IR1.ProcessTime--;
}
if(PIN_IR1)
{
if(++CheckCnt > 2)//在中斷中調(diào)用 值為2即可,快速掃描,適當(dāng)加長可提高防抖效果。
{
CheckCnt = 2;
if(IRStatus==0)
{
ir_agreement_check1();//下降沿
}
IRStatus =1;
}
}
else
{
IR1.IrTime++;
if(CheckCnt)
{
CheckCnt--;
}
else
{
if(IRStatus)
{
IRStatus = 0;
}
}
}
}
復(fù)制代碼
作者:
aaa112
時(shí)間:
2021-8-1 15:08
不用中斷方式行嗎?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1