一直在这里吸收资料,现发一个产品中一直使用的8位MCU通用的ASK信号解码接收程序(C语言源代码),可用于51/EMC,用于AVR时,位操作可能要修改
头文件:
/*********************************************************
ASK解码接收与硬件相关设置
**********************************************************/
sbit RF_IN_P = P0^0;
#define _ASK_SIGNAL 1 // 1表示信号为高电平有效
// 0表示信号为低电平有效
/*********************************************************
ASK解码接收占用的标志位
**********************************************************/
bit old_RF_f;
bit RF_start_f;
bit RF_ok_f;
bit RF_in_f;
bit RF_H_bit_f;
bit RF_L_bit_f;
bit RF_error_f;
bit RF_sync_f;
unsigned char ASK_bit_time;
unsigned char ASK_bit_counter;
/*********************************************************
ASK解码接收用到的数据缓冲区
**********************************************************/
#define _MAX_RX_BIT 24//设定编码共有多少位,MAX=40
unsigned char RF_buffer_0;
unsigned char RF_buffer_1;
unsigned char RF_buffer_2;
unsigned char RF_buffer_3;
unsigned char RF_buffer_4;
/*********************************************************
设定ASK码的脉冲时间宽度(数据*250US或是500US.
因为是250US或是500US查询一次)
**********************************************************/
#define _MAX_HI_RF_TIME 13
#define _MIN_HI_RF_TIME 8
#define _MAX_LO_RF_TIME 6
#define _MIN_LO_RF_TIME 2
#define _MIN_RF_SYNC_TIME 30
ASK解码主程序:
/*********************************************************
ASK解码接收
**********************************************************/
/*********************************************************
声明ASK头文件
**********************************************************/
#include "receiver.h"
/*********************************************************
函数说明:ASK解码接收,250US或是500US进入一次
输入参数:无
输出参数:无
**********************************************************/
void ASK_decode(void)
{
//收到有效数据后,必须在处理后才能继续接收
if(RF_ok_f == FAIL)
{
//读入新的RF信号
#if(_ASK_SIGNAL == 1)
if(RF_IN_P == TRUE)
{
RF_in_f = TRUE;
}
else
{
RF_in_f = FAIL;
}
#else
//RF_in_f = RF_IN_P;
if(RF_IN_P == TRUE)
{
RF_in_f = FAIL;
}
else
{
RF_in_f = TRUE;
}
#endif
RF_H_bit_f = FAIL;
RF_L_bit_f = FAIL;
RF_error_f = FAIL;
RF_sync_f = FAIL;
//信号脉冲宽度计时
++ASK_bit_time;
if(ASK_bit_time >= 250)
{
ASK_bit_time = 250;
}
//检查信号脉冲
if(old_RF_f != RF_in_f)//RF信号电平发生转换
{
//正脉冲解码:信号由高变低时检查高电平宽度
if((ASK_bit_time >= _MIN_HI_RF_TIME)&&(ASK_bit_time <= _MAX_HI_RF_TIME))
{
RF_H_bit_f = TRUE;//检查是否为逻辑1
}
else if((ASK_bit_time >= _MIN_LO_RF_TIME)&&(ASK_bit_time <= _MAX_LO_RF_TIME))
{
RF_L_bit_f = TRUE;//检查是否为逻辑0
}
else if(ASK_bit_time >= _MIN_RF_SYNC_TIME)
{
RF_sync_f = TRUE;//检查是否为同步信号
}
if(old_RF_f == TRUE)
{
if((RF_H_bit_f)||(RF_L_bit_f))
{
if(RF_start_f == TRUE)
{
//移位存储接收的数据
RF_buffer_0 <<= 1;
if(RF_buffer_1&0x80){RF_buffer_0|=1;}
RF_buffer_1 <<= 1;
if(RF_buffer_2&0x80){RF_buffer_1|=1;}
RF_buffer_2 <<= 1;
if(RF_buffer_3&0x80){RF_buffer_2|=1;}
RF_buffer_3 <<= 1;
if(RF_buffer_4&0x80){RF_buffer_3|=1;}
RF_buffer_4 <<= 1;
if(RF_H_bit_f){RF_buffer_4|=1;}//记录当前接收数据位
++ASK_bit_counter;
if(ASK_bit_counter >= _MAX_RX_BIT)
{
RF_ok_f = TRUE;
}
}
}
else
{
RF_error_f = TRUE;
}
}
else
{
//信号由低变高时检查同步信号(10MS低电平),作为启动信号(也可以作为自动适应波特率)
if(RF_sync_f == TRUE)
{
RF_start_f = TRUE;
ASK_bit_counter = 0;
RF_buffer_0 = 0;
RF_buffer_1 = 0;
RF_buffer_2 = 0;
RF_buffer_3 = 0;
RF_buffer_4 = 0;
RF_ok_f = FAIL;
}
else if(RF_L_bit_f == FAIL)
{
//检查是否为逻辑0,信号由低变高时检查低电平宽度(1MS低电平)
RF_error_f = FAIL;
}
}
//记录新信号电平,并重新计时
//old_RF_f = RF_in_f;
if(RF_in_f == TRUE)
{
old_RF_f = TRUE;
}
else
{
old_RF_f = FAIL;
}
ASK_bit_time = 0;
}
if(RF_error_f == TRUE)
{
RF_start_f = FAIL;
ASK_bit_counter = 0;
RF_ok_f = FAIL;
}
}
}
使用方法:
1。要在主程序项目中加入ASK的C文件
2。定时50US~500US调用接收程序(这里的时间依编码的时间长度而定),也可以函数放入中断程序中,这样几乎不占CPU的时间
3。主程序在收到完整的数据后应处理后,清空接收数据缓冲区后,才能调用再次接收.
ASK 解码程序ourdev_452970.rar(文件大小:2K) (原文件名:ASK-receiver.rar)