PIC16F97+eV1527解码源程序
根据提供的文件信息,本文将对“PIC16F97+eV1527解码源程序”进行深入解析,主要包括以下几点:PIC16F97微控制器的介绍、eV1527编码协议概述、源代码分析以及解码流程详解。 ### 一、PIC16F97微控制器 #### 1.1 微控制器概述 PIC16F97是Microchip公司生产的一款基于8位RISC架构的微控制器,具有高性能、低功耗等特点。它适用于各种嵌入式控制系统,如家电控制、汽车电子等领域。 #### 1.2 主要特性 - **工作电压**:2.0V至5.5V - **时钟频率**:最高可达20MHz - **程序存储器**:高达32K字节的闪存 - **数据存储器**:256字节RAM - **外设接口**:包括定时器、串行通信接口(USART)、模数转换器(ADC)等 ### 二、eV1527编码协议 #### 2.1 协议简介 eV1527是一种广泛应用于遥控器中的编码协议,主要用于传输二进制数据流。该协议规定了数据的格式、传输方式等。 #### 2.2 数据格式 eV1527协议采用曼彻斯特编码,每个比特由两个脉冲组成。在本源代码中,通过检测接收端的高电平和低电平来判断数据位。 ### 三、源代码分析 #### 3.1 主函数main() 主函数`main()`中调用了初始化函数`sub_cpu_ini()`,该函数负责设置微控制器的基本配置,例如时钟源选择、端口配置等。 #### 3.2 中断服务程序ISR() 中断服务程序`ISR()`主要处理定时器0(T0)中断。当T0计数溢出时触发中断,此时会清除中断标志`T0IF`并重新加载计数器值为125(对应约150μs)。通过检测RC3引脚的状态变化来识别数据信号。 #### 3.3 变量定义 - `hh_w` 和 `ll_w`:用于记录接收到的高电平和低电平时间。 - `ma_x`:表示当前正在处理的数据位的位置。 - `bma1` 至 `bma4`:分别用于保存解码后的四位数据。 - `rf_ok` 和 `tb_ok`:这两个变量用来标记是否成功接收到有效数据。 #### 3.4 解码逻辑 - **初始状态检测**:通过检测`RC3`引脚的电平变化来确定是否开始接收数据。当检测到从低电平到高电平的变化时,认为接收到第一个起始位。 - **数据位解码**:每个数据位由一个高电平和一个低电平组成。如果高电平和低电平的持续时间均在指定范围内,则认为该位为有效数据。 - **数据位收集**:使用`bma1` 至 `bma4`四个变量来收集解码后的数据。每收集完一个数据位后,通过`ma_x`变量记录当前位的位置,并进行相应的位操作。 - **结束条件**:当所有数据位都被正确收集后,可以认为解码完成。 ### 四、解码流程详解 1. **初始化**:首先执行初始化操作,包括配置定时器、中断、端口等。 2. **等待接收**:通过检测RC3引脚的状态来判断是否有数据传输。 3. **数据位检测**:当检测到有效的起始位后,进入数据位检测阶段。通过对高电平和低电平持续时间的判断来确定数据位的有效性。 4. **数据位收集**:利用循环和条件判断收集每个数据位,并存储到相应的变量中。 5. **解码完成**:当所有数据位都被成功收集后,表示一次完整的数据接收过程结束。 该源程序通过使用PIC16F97微控制器实现了对eV1527编码协议的数据接收与解码功能。通过对定时器、中断等外设的合理配置,确保了数据的准确接收与解码。这对于理解和应用类似的无线通信协议具有重要的参考价值。
作者:佚名 来源:不详 录入:Admin 更新时间:2008-7-26 17:03:50 点击数:3
【字体: 】
//使用PIC16F917的片子,使用T0中断查询方式接收遥控命令
//************************************************************************************************************
#include <pic.h>;
void main(void);
void interrupt ISR(void);
void sub_cpu_ini(void);
//************************************************************************************************************
unsigned char hh_w,ll_w; //高,低电平宽度
unsigned char ma_x; //接收到第几位编码了
unsigned char bma1,bma2,bma3,bma4; //用于接收过程存放遥控编码
unsigned char mma1,mma2,mma3,mma4; //用于解码过程
bit rf_ok; //接收到一个完整的遥控命令后置1,通知解码程序可以解码了
bit old_rc5; //保存上一次查询到的电平状态
bit tb_ok; //接收到同步的马时置1
void main()
{
sub_cpu_ini();
}
//***************************************************************************************************
//----- 中断服务程序 -----//
//***************************************************************************************************
void interrupt ISR(void) //只启用了T0中断,所以不用判断中断源
{ T0IF=0; // 清除T0中断标志
#asm
clrwdt //喂狗
#endasm
- ken_guo20052016-05-19不错,很清晰,回头验证下是否稳定,谢谢分享.
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助