用c语言编ask程序代码,一直在这里吸收资料,现发一个产品中一直使用的8位MCU通用的ASK信号解码接收程序(C语言...

一直在这里吸收资料,现发一个产品中一直使用的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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值