一种曼彻斯特解码方法

根据给定的信息,本文将详细解释一种基于C语言实现的曼彻斯特解码方法,并针对其具体实现细节、原理及应用场景进行深入探讨。 ### 曼彻斯特编码与解码简介 曼彻斯特编码是一种用于数据传输的技术,在数字通信领域有着广泛的应用。这种编码方式的特点在于每个比特位都有一个中间跳变点,这不仅提供了时钟同步的功能,还确保了信号的自定时能力,即接收端可以根据信号中的跳变点来恢复出发送时的时钟频率。在本篇文章中,我们将重点讨论一种通过C语言实现的曼彻斯特解码方法。 ### 解码方法的核心思想 该解码方法主要利用了C语言的延时功能来实现对曼彻斯特编码的解码。这种方法适用于微控制器环境,例如STC12C5A60S2系列芯片,该芯片基于80C51内核。通过精确控制延时时间,可以准确捕捉到曼彻斯特编码中的跳变点,从而实现解码的目的。 ### 具体实现步骤解析 #### 1. 编码格式 - **起始位**:9比特。 - **数据位**:40比特。 - **奇偶校验位**:10比特。 - **停止位**:4比特。 - **结束位**:1比特。 这种格式符合EM4095芯片的输出格式,其中起始位用于标志帧的开始,数据位存储实际信息,奇偶校验位用于错误检测,而停止位和结束位则用于标志帧的结束。 #### 2. 起始位检测 为了确保正确识别数据帧的开始,必须准确地检测起始位。起始位通常由一个“1”后跟两个“0”组成(即101)。代码中通过监测`DEMOD_OUT`引脚的状态变化来判断是否出现了起始位。当监测到从高电平变为低电平再回到高电平的过程时,表示可能找到了起始位。接下来会进一步确认这一序列是否确实为起始位。 #### 3. 延时函数 - `stc12_Delay1us(unsigned short n)`:这是一个自定义的延时函数,通过多次调用 `_nop_()` 来实现精确的延时。这里使用了`DELAYVAL`宏定义,其值为384,代表了延时3/4个时钟周期的时间长度。 #### 4. 数据解码过程 - 通过循环监测`DEMOD_OUT`的状态变化来确定是否找到了起始位“101”。 - 找到起始位后,继续读取后续的数据位。对于每一个比特位,都需要通过监测信号的变化来确定其值。这里采用了3/4个时钟周期的延时来确保能够在正确的时刻捕获信号状态。 - 在解码过程中还需要计算奇偶校验位,以验证接收到的数据的完整性。 ### 关键代码分析 - 使用`sbit`关键字定义了多个I/O口,如`MOD`, `SHD`, `DEMOD_OUT`, `RDY_CLK`, `BEEPLED`等,这些都是用于控制和读取信号的关键引脚。 - 定义了多个宏,如`DELAYVAL`和`TIMEOUT`,用于配置延时时间和超时时间。 - 实现了一个`decode_125kCard`函数,该函数负责执行曼彻斯特解码的主要逻辑。 - 通过循环读取信号状态,并结合延时函数,准确地解析出曼彻斯特编码的数据。 ### 总结 本文介绍了一种基于C语言实现的曼彻斯特解码方法,该方法通过精确控制延时时间来实现对接收信号的有效解码。通过对起始位、数据位和奇偶校验位的仔细处理,确保了解码的准确性。此外,还提供了一份详细的代码示例,帮助读者更好地理解实现过程。这种方法适用于微控制器环境下对曼彻斯特编码进行解码的需求,具有较高的实用价值。





























1).EM4095的数据格式为:9bit起始位+40bit数据位+10bit行校验位+4bit列校验位+1bit停止位
2).本程序时针对STC12C5A60S2单片机的,与80C51完全兼容,但是大部分指令时单周期指令,也就是
说比普通80C51大约快12倍
3).确定起始位,首先要正确找到数据1,按规则下跳为1,上跳为0. 可检测高电平并等其变低,
但这会把0错检为1,因为0也存在高电平。但是如果检测到一个周期的高电平(数据01)则可
确定找到了数据1,找到1后就可以同步了,因为EM4095卡最后一位数据就是0正好可以利用
作为判断的特征。
4).对于数据的确定,由于有了同步则可在同步后延时384us即3/4个码元周期,再判断接收段电平,
如为高则置数据为1,并一直等到低电平的出现,相反则等高电平的出现,并在此之间插入超时
判断。这样,一个完整的数据判断就完成了,并确保数据的准确性,另外这种方法的抗干扰性
会非常好,而如果采用定时同步的话则会因信号的畸变而引起数据出错,整体会导致读卡几率降低
但是此程序也有其缺点,因为采用纯延时判断的手段,因此其占用单片机的运行时间比较大。
5).同步后开始接收同步数据即9个1,这一部分用一个循环做,如果出错则放弃接收
6).同步数据接收完后,则开始接收数据,数据分11行5列接收,以利于校验位的判断
如有出错则放弃数据
7).如一切正常则返回卡号,如因尝试读卡次数到了则返回0,表示没有卡
8).码元频率是载波频率的64分频,因此码元周期为:T=64/125000= 0.000512s=512us,因此3T/4=384us
********************************************************************************************/
#include <reg52.h>
#include <intrins.h>//空操作指令需要此头文件
#define TIMEOUT 3000
//定义错误代码
#define ERR_NO 0x00
#define ERR_125KNOTFOUND 0x01
//控制EM4095的引脚
sbit MOD = P2^1;
sbit SHD = P2^0;
sbit DEMOD_OUT = P3^3;
sbit RDY_CLK = P3^4;
sbit BEEPLED = P1^5;
//延时n*1us函数
void stc12_Delay1us(unsigned short n)
{
while(--n)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
//读取卡号,
剩余6页未读,继续阅读

- zhuyouyang2019-06-26跟别人博客上看到的是一样的,https://blog.csdn.net/sygdp21/article/details/5881561
- 喑楽粨衯粨2018-08-03学习一下很不错
- piaolingyh2019-02-26挺好,比较实用的

- 粉丝: 2
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 降本增效齐抓成本管理-群策群力共谋结算策划(009年).doc
- D高三物理寒假综合练习(6).doc
- 某矿业公司深部开采动压灾害的防治实践.doc
- 工程项目造价控制分析.doc
- 纺织产业园区污水处理厂工程可行性研究报告汇总.doc
- 员工在职训练制度.doc
- 学生宿舍楼电气设计.doc
- 英语活动:I-See-…(中班).doc
- 企业做好现场招聘会的技巧.docx
- 工程室外楼梯裂缝成因分析及处理.doc
- 基坑安全专项施工方案.doc
- 线描写生画--花瓶脸谱-.doc
- 保先活动中局长分析评议阶段小结.doc
- 装饰BIM应用初稿集.pdf
- 工作许可人或工作负责人增考题目.doc
- 肉联厂监理规划.doc


