曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析

合集下载

一种RFID的曼彻斯特解码技术

一种RFID的曼彻斯特解码技术
M a h s e od . nc e t rc e Keyw o d r s: RFI ; M a h s e o e; d c i g tc olgy D nc e t rc d e od n e hn o
射 频 识 别 ( do F e u n y I e t iain R D)应 Ra i rq e c d ni ct , FI f o 用 是 目前 发 展 最 为 迅 速 、 力 最 大 的新 兴 技 术 之 一 , 利 潜 其
M a c e t rCod c dig Te h ol g orRFI n h se e De o n c n o y f D
Ka g W e g a g,W a i i g n nun ng Hu y n ( h h iUnt e o r Te h oo y Co Z u a i h P we c n l g .,Lt .,Z u a 1 0 0, i a e d h h i 9 7 Ch n ) 5
编码 机 制 , 出射 频 芯 片输 出 6 得 4位 曼彻 斯特 码 的特 点 , 给 出 了软件 实 现 算 法 。利 用 中断 捕 获 脉 宽 的 方 法进 行 解 码 , 并 不
但 硬 件 接 口 简单 , 而且 解码 速 度 快 , 确 率 高 , 准 同时 也 为 曼彻 斯 特 解 码 算 法提 供 了一种 新 的 思路 。 关 键 词 :RF D; I 曼彻 斯 特 码 ; 解码 中 图分 类 号 :T 3 l P 1 文 献 标 识 码 :A
际 应 用 中不 需 要 进 入 休 眠状 态 时 , 以把 EM4 9 可 0 5芯 片 的
下 拉 到低 电平 , 而 节省 微 控 制器 的一 个 io引脚 。 从 /
1 R I 卡 系统 的构成 FD读

曼彻斯特编码 和 奈氏准则

曼彻斯特编码 和 奈氏准则

曼彻斯特编码和奈氏准则一、曼彻斯特编码曼彻斯特编码是一种双相线码,主要用于数字信号的传输。

在曼彻斯特编码中,每一位数据都由两个不同极性的电压表示。

在每一位的中心点,信号的电平都会发生跳变,使得接收端可以准确地判断信号的相位。

这种编码方式具有自同步的特性,能够自动确定数据位的起始和结束位置。

曼彻斯特编码的优点在于它具有较好的抗干扰能力,能够有效地抵抗数据传输过程中的噪声和干扰。

此外,由于每一位数据都包含一个电压跳变,因此接收端可以准确地检测到数据信号的相位,保证了数据传输的可靠性和稳定性。

然而,曼彻斯特编码也存在一些缺点。

由于每一位数据都需要一个电压跳变,因此它需要较高的发送功率和带宽。

此外,由于曼彻斯特编码中含有较多的过渡频率成分,因此它可能会对通信系统造成较大的干扰。

二、奈氏准则奈氏准则是由德国物理学家海因里希·鲁特·奈奎斯特提出的,是通信系统中的基本理论之一。

奈氏准则指出,在一个理想的无噪声通信系统中,为了准确地传输信号而不发生失真,信号的带宽必须小于或等于信道带宽的一半。

换句话说,如果信道带宽为B,则信号的带宽不能超过B/2。

奈氏准则的原理是基于信息量的统计性质。

在一个信道中,信息量与信号的频谱密度有关,而频谱密度又与信号的带宽有关。

因此,如果信号的带宽超过了信道带宽的一半,那么信道将无法容纳更多的信息量,从而导致信号失真。

奈氏准则对于通信系统的设计和优化具有重要的指导意义。

在实际应用中,我们需要根据奈氏准则来确定信号的带宽和采样频率等参数,以保证信号传输的质量和稳定性。

三、曼彻斯特编码和奈氏准则的结合应用在数字通信系统中,曼彻斯特编码和奈氏准则常常被结合起来使用。

曼彻斯特编码提供了可靠的数据传输和自同步机制,而奈氏准则则为系统设计提供了理论依据。

首先,根据奈氏准则,我们需要确定一个合适的信道带宽。

然后,根据这个带宽和数据传输速率,我们可以选择适合的曼彻斯特编码方案。

例如,如果信道带宽较窄,我们可以选择位周期较长的曼彻斯特编码,以减少信号的带宽占用。

125K非接触ID卡读卡器设计完整版

125K非接触ID卡读卡器设计完整版

125K非接触IC卡读卡头125K读卡头的工作电压为12V/5v,电流为30——40MA 读卡距离最远15CM 。

如要低功耗最有效是读卡头工作时供电,不工作时断电。

读卡距离与卡和天线有关,可以读各种125K曼彻斯特编码的只读ID卡(4001,EM4100等等)和含E2PROM的RF卡。

如E5550。

读卡头(OUT)输出信号为原卡的曼彻斯特码,(用示波器接读卡头输出可以观测ID卡的输出波形)它和其它公司的125K读卡头(输出信号为原卡的曼彻斯特码)是兼容的,可以相互替换,不用修改程序。

读卡头也可以读可擦写的125k非接触IC卡,如当读E5550时,卡的用来控制是否启动AOR位应置0,(当置1时IC卡不主动发射数据,需读卡头先发送口令。

我的读卡头是只读,不能发数据,当AOR位置1时不能读IC卡的数据)。

天线的设计:天线电感值=345Uh线径φ0.29mm圆形(内径):直径6CM 58圈直径8CM 40圈直径3CM 83圈直径2CM 115圈长方形:9.5*7 CM 38圈4.7*6.3 CM 50圈非接触式IC卡简介:非接触式智能卡以其高度安全保密性,通信高速性,使用方便性,成本日渐低廉等而受到广泛使用,给我们的生活质量带来了很大的提高。

非接触式IC卡简介又称射频卡,成功地解决了无源(卡中无电源)和免接触这一难题,是电子器件领域的一大突破。

主要用于智能门禁控制器,智能门锁,考勤机, 自动收费系统等.射频卡与接触式IC卡,TM卡相比有以下优点:1 可靠性高,无机械接触,从而避免了各种故障;2 操作方便,快捷,使用时没有方向性,个方向操作;3 安全和保密性能好,采用双向验证机制。

读写器验证IC卡的合法性,同时IC卡验证读写器的合法性。

每张卡均有唯一的序列号。

制造厂家在产品出长前已将此序列号固化,不可再更改,因此可以说世界上没有两张相同的非接触IC卡;只读ID卡的资料非接触ID卡主要有台湾4001卡和瑞士H4001卡,EM4100。

曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析

曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析

曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析曼彻斯特解码原则1.曼彻斯特编码曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。

曼彻斯特编码被用在以太网媒介系统中。

曼彻斯特编码提供一个简单的方式给编码简单的二进制序列而没有长的周期没有转换级别,因而防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误。

在这个技术下,实际上的二进制数据被传输通过这个电缆,不是作为一个序列的逻辑1或0来发送的(技术上叫做反向不归零制(NRZ))。

相反地,这些位被转换为一个稍微不同的格式,它通过使用直接的二进制编码有很多的优点。

曼彻斯特编码,常用于局域网传输。

在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示"1",从低到高跳变表示"0"。

还有一种是差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示"0"或"1",有跳变为"0",无跳变为"1"。

对于以上电平跳变观点有歧义:关于曼彻斯特编码电平跳变,在雷振甲编写的<<网络工程师教程>>中对曼彻斯特编码的解释为:从低电平到高电平的转换表示1,从高电平到低电平的转换表示0,模拟卷中的答案也是如此,张友生写的考点分析中也是这样讲的,而《计算机网络(第4版)》中(P232页)则解释为高电平到低电平的转换为1,低电平到高电平的转换为0。

清华大学的《计算机通信与网络教程》《计算机网络(第4版)》采用如下方式:曼彻斯特编码从高到低的跳变是0 从低到高的跳变是1。

两种曼彻斯特编码是将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位编码中有一跳变,不存在直流分量,因此具有自同步能力和良好的抗干扰性能。

曼砌斯特解码

曼砌斯特解码

/**********************************************曼彻斯特编码调制的非接触ID卡通用读卡程序编制ID卡每位的脉宽为512us,每半位的脉宽256usCPU为Atmel公司的A T89S52芯片,晶振11.0592MHz读卡采用边沿检测方式,只要跳变边沿脉宽在要求的脉宽范围内就是合法脉宽每位脉宽要求490us-530us,半位要求为230us-280us,可根据调试更改定时器时间2010年3月11日东北大学通信与智能控制工作室/******************头文件********************/#include <REG52.h>#include <absacc.h>#include <intrins.h>/******************宏定义*********************/#define uchar unsigned char#define uint unsigned int#define ulint unsigned long int//#define SYSCLK 11059200 //使用外部晶振11.0592MHz//#define BAUD_RATE 2400 //这里没有采用//#define TCLK SYSCLK/12 ////#define TIME_COUNT (-(TCLK/BAUD_RA TE)) //+0x20 ////#define T1_1B_H TIME_COUNT >> 8 ////#define T1_1B_L TIME_COUNTsbit RF_DATA_IN =P3^2; //读卡卡号输入端,这里为外部0终端,最好改为普通的I/O sbit RF_LED_ON =P1^4; //原理机电平提取端,这里接在了原理机74HC14的第二次取反后sbit RUN_LED =P2^4; //测试用sbit RUN_LED1 =P2^3; //测试用sbit RUN_LED2 =P2^5; //测试用sbit RUN_LED3 =P2^6; //测试灿?sbit DIDA =P2^2; //蜂鸣器接口,高电平时蜂鸣,低电平时停止蜂鸣/****************全局变量**********************/uchar Read_RF_Data[11]; //从卡号输入端读取的暂存数据uchar Card_ID[10]; //卡号暂存数组uchar data ID_Data[6]; //暂存经效验后的正确数据uint data TIMER_1=0; //判断定时时用uchar RX0_DAT=0; //硬件串口接收到的字节数据uchar SUART0_RXD[10]; //硬件串口接收ID号数组uchar SUART0_NUM=0; //硬件串口计数变量bit Check_Data_bit; //效验请求标志位bit Check_Data_Ok =0; //校验正确标志位/****************函数列表***********************/void Recive_RF_Data(void);void Check_Data(void);void watchdog_init(void);void Clern_Number(void);void dogFeed(void);void delay0_2ms(uint count);void UART_TXD(uchar Data[],uchar Num); //这里两个发送函数是一样的,由于出现了语法错误,这里定义为了两个void UART0_TXD(uchar Data[],uchar Num);/**********************************************初始化程序**********************************************/void Data_start(void){TMOD=0x21; //T0方式1,T1工作于方式2TH1=0x00; //初始化T1计时器TL1=0x00;TR1=0;SCON=0x50; //串行口初始化// PCON=0x80; //SMOD位设置TH0=0x00; //初始化T0计时器TL0=0x04; //这里从0x0004开始,参考程序中是这个数值,改为从其他数开始也可以TR0=0;ES=1; //开放串行口中断EA=1; //开放总中断}/**********************************************I/O初始化程序,这里根据需要可修改**********************************************/void PORT_Init (void){P0=0xFF; //P1=0xFF; //P2=0xF0; // 蜂鸣器引脚采用的是P2.2,电路图中是P2.3,P2.2为高时蜂鸣器蜂鸣,为低时停止蜂鸣,这点注意初始化时要为0P3=0xCF; //}/**********************************************初始化程序,和data_start有点重复**********************************************/void UART0_Init (void){ES = 0; //禁止串口0中断SCON = 0x50; //串口工作方式1:8位(先低位)数据和//一位停止位,可变波特率.REN=1允许接收//清发送和接收中断标志RI、TIES = 1; //开UART0中断PCON = 0x00; //1/32PS = 1; //UART0中断优先级为高ES = 1; //串行中断允许}/****************************************************************************** *delay:延时子程序*延时时间待测******************************************************************************* /void delay(void){int t;for(t=0;t<200;t++);dogFeed(); //喂狗}/****************************************************************************** *delay_1s :延时子程序******************************************************************************* /void delay_long(int time){int t;for(t=0;t<time;t++){delay();dogFeed(); //喂狗}}/****************************************************************************** Timer2_Init:T2定时器初始化设置T2CON中的TCLK或RCLK选择定时器T2工作为波特率发生器方式,T2为串口UART0的波特率发生器:2400波特率, 该方式下T2计时脉冲为晶振频率的1/2(而不是1/12)晶振频率波特率=---------------- 2400BPD: FF 7032x[65536-(RCAP2H, RCAP2L)] 9600BPD: FF DC这里波特率改为了9600;******************************************************************************* /void Timer2_Init(void){TR2=0; //停T2定时器T2CON &= ~0x02; //T2为定时方式T2CON |= 0x30; //RX和TX都使用T2时钟RCAP2H = 0xFF; //9600波特率对应16位自动重加载寄存器赋值0xFFDCRCAP2L = 0xDC; //TH2 = RCAP2H; //TL2 = RCAP2L; //TR2 = 1; //启动T2}/****************************************************************************** **********看门狗初始化初始化时需要在reg52.h文件中声明看门狗寄存器地址语法为:sfr WDTRST = 0xA6;******************************************************************************* **********/void watchdog_init(void){WDTRST=0x1E;WDTRST=0xE1;}/***********************************看门狗子程序*****************************************功能:8ms不喂狗复位AT89S52内置看门过为13位定时器,最大计数8191个机器周期最大计时为8191*(12/11059200)=8.8878ms8ms不喂狗单片机复位******************************************************************************* **********/void dogfeed(void){WDTRST=0x1E;WDTRST=0xE1;//喂狗指令}/*********************************************//*接收RF数据*//*********************************************/void Recive_RF_Data(void){/////////////////////定义局部变量uchar header,pc;uchar temp;uchar temp1 =0x00;uint temp2;uchar ByteCounter; //字节计数器uchar *PData;uchar BitCounter; //位计数器////////////////////初始化变量值header=0;pc=4;PData=Read_RF_Data;temp=0;temp1=0;ByteCounter=0;BitCounter=5;/////////////////////检测一个稳定的低电平str://WATCHDOG=~WA TCHDOG;dogFeed();if(RF_DATA_IN==0)if(RF_DATA_IN==0)if(RF_DATA_IN==0)if(RF_DATA_IN==0)if(RF_DATA_IN==0){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();////////////////////检测一个起始位电平while(RF_DA TA_IN==0) dogFeed(); //当电平由低向高跳变时启动计时器TR0=1; //此处喂狗挺关键的,当无卡时为低电平,无卡时在此等待不能喂狗_nop_(); //_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();// dogFeed();////////////////////检测9个"header"while(RF_DA TA_IN==1); //检测字头第一个高点平,为1时计时,这里的字头为末尾和开始的组合TR0=0;TF0=0;TIMER_1=TH0;TIMER_1=(TIMER_1<<8)+TL0;TH0=0x00;TL0=0x04;//temp2=0x01EC; //这里改为530us,计算方法为(0x01EC-0x0004)*12/11059200=0x01E8*12/11059200=488*1.0850694=530ustemp2=0x01FC; //这里改为547us,可根据调试调整参数if(TIMER_1>temp2){goto str;} //这里只要第一个字头在490us-547us之间就行//temp2=0xf9;temp2=0x01C7; //这里对应的时间为490usif(TIMER_1<temp2) // <490us{goto str;}RUN_LED3 =!RUN_LED3; //检测到第一个字头LED闪烁一次do //接下来检测8位其余字头1{TIMER_1=0;//WATCHDOG=~WA TCHDOG;dogFeed();while(RF_DA TA_IN==0) dogFeed(); //为低电平时等待,为高电平时跳出,计时开始TR0=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();while(RF_DA TA_IN==1); //为1时计时开始// RUN_LED2 =!RUN_LED2;TR0=0;TF0=0;TIMER_1=TH0;TIMER_1=(TIMER_1<<8)+TL0;TH0=0x00;TL0=0x04;temp2=0x00FE; // 对应的时间为271us//temp2=0x012B; // >320usif(TIMER_1>temp2) //这里为曼码,半位时间为256us{ //这里只要检测半位脉宽在220us-271us之间就行,可根据调试调整计时参数header=0;goto str;}temp2=0x00CF;if(TIMER_1<temp2) // <220us{header=0;goto str;}header++;// RUN_LED2 =!RUN_LED2;}while(header<8); //8位高电平字头检测完毕退出RUN_LED2 =!RUN_LED2; //相应指示灯闪烁一次TR0=0;TF0=0;///////////////////如果9个"header"都对,开始接收卡内数据//TH0=0xff; //time:300us//TL0=0x6a;TH0=0xFE; //time:320us 这里采用计数溢出计时的TL0=0xD8; //计数方法为:(0xFFFF-0xFED8)*12/11059200=320us,采样到中间位置TR0=1;if(header==8){do{do{while(TF0==0); //等待320us,进入数据位的前半位TF0=0;if(RF_DATA_IN==1) temp=1;else temp=0;RUN_LED1 =!RUN_LED1;while(RF_DA TA_IN==temp) //检测电平是否跳变{ //等待跳变,当跳出跳变时又从新开始计时,计时大小为300usif(TF0==1) //如果300us计时到还未跳变,视为非法电平!!!{TR0=0;TF0=0;goto str;}}TH0=0xFE; //time:300us,从新赋值,开始计时TL0=0xEB;// TL0=0xD8; //time:320us// temp=~RF_DATA_IN;temp1=(temp1<<1)|temp; //采用循环的方式赋给临时变量BitCounter--;dogFeed();}while(BitCounter>0); //一个字节完否*(PData+ByteCounter)=temp1; //将一字节数据存入缓存数组temp1=0;BitCounter=5;ByteCounter++;//WATCHDOG=~WA TCHDOG;dogFeed();}while(ByteCounter<10);do{//WATCHDOG=~WA TCHDOG;dogFeed();while(TF0==0); //等待一个位周期TF0=0;if(RF_DATA_IN==1) temp=1;else temp=0;// RUN_LED1 =!RUN_LED1;while(RF_DA TA_IN==temp) //检测电平跳变否?{if(TF0==1) //如果300us计时到还未跳变,视为非法电平!!!{TR0=0;TF0=0;goto str;}}//TH0=0xff; //time:300us//TL0=0x6a;TH0=0xFE; //time:300usTL0=0xEB;//1TL0=0xD8; //time:320ustemp=~RF_DATA_IN;temp1=(temp1<<1)|temp;pc--;}while(pc); //一个字节完否Read_RF_Data[10]=temp1; //将一字节数据存入缓存数组///////////////////检测最后一个停止位while(TF0==0);TR0=0;TF0=0;if(RF_DATA_IN==1) temp=1;else temp=0;while(RF_DA TA_IN==temp) //检测电平跳变否?{if(TF0==1) //如果300us计时到还未跳变,视为非法电平!!!{TR0=0;TF0=0;goto str;}}temp=~RF_DATA_IN;dogFeed();if(temp==0) //如果停止位正确{Check_Data_bit=1; //置效验请求标志//RUN_LED2 =!RUN_LED2;}else //如果停止位不正确{Clern_Number(); //清除}}}}/*********************************************效验数据**这里只进行了行校验,没有进行列校验*参考的部分程序也只进行了行校验*********************************************/void Check_Data(void){/////////////////////定义局部变量uchar temp;uchar temp1;uchar ByteCounter; //数组计数器uchar ByteCounter1;uchar *PData;uchar *PData1;////////////////////初如化变量值PData=Read_RF_Data;PData1=ID_Data; //ID_Data暂存经效验后的正确数据temp=0;temp1=0;ByteCounter=0;ByteCounter1=0;Check_Data_Ok =0;/////////////////////循环效验//WATCHDOG=~WA TCHDOG;dogFeed();/////////////////////行校验for(ByteCounter1=0;ByteCounter1<5;ByteCounter1++)//有5个字节数据{temp=(((*(PData+ByteCounter))&0x10)>>4)+(((*(PData+ByteCounter))&0x08)>>3)+(((*(PData+ByteCounter))&0x04)>>2)+(((*(PData+ByteCounter))&0x02)>>1);if((temp&0x01)==((*(PData+ByteCounter))&0x01))//效验低4位{temp1=(*(PData+ByteCounter)&0xfe)<<3;ByteCounter++;temp=(((*(PData+ByteCounter))&0x10)>>4)+(((*(PData+ByteCounter))&0x08)>>3)+(((*(P Data+ByteCounter))&0x04)>>2)+(((*(PData+ByteCounter))&0x02)>>1);if((temp&0x01)==((*(PData+ByteCounter))&0x01))//效验高4位{*(PData1+ByteCounter1)=temp1|((*(PData+ByteCounter)&0xfe)>>1);//高低位生成一个字节存入数组ByteCounter++;}else{ByteCounter1=5;//只要有一组不对则退出效验Clern_Number();//并清所有数据}}else{ByteCounter1=5;//只要有一组不对则退出效验Clern_Number();//并清所有数据}// WATCHDOG=~W ATCHDOG;dogFeed();}/////////////////////列校验//......因没有必要所以先省略此处.........///////////////////////生成校验和,并发送出去if(ByteCounter==10){Check_Data_Ok =1;delay0_2ms(1000);}}//************************************************************/*清暂存器*///************************************************************void Clern_Number(void){uchar i;// WATCHDOG=~W ATCHDOG;dogFeed();for(i=0;i<10;i++){Read_RF_Data[i] =0;Card_ID[i] =0;SUART0_RXD[i] =0;}for(i=0;i<5;i++)ID_Data[i]=0; //卡号数据也进行清除}/****************************************************************************** *UART_TXD:向PC发送卡号数据这里定义了两个,和下面的一样,更改语法数据后可合为一个******************************************************************************** /void UART_TXD(uchar Data[],uchar Num){uchar i=0;uchar *PData;PData=Data;EX0=0;ES=0;for(i=0;i<Num;i++)//有Num组号码要发送{SBUF=*(PData+i);// SBUF =addr;while(TI==0);TI=0;//等待数据发送出去delay();//等待后再发dogFeed();}}/****************************************************************************** *UART0_TXD: 向PC发送卡号数据,这里为PC向读卡器发过命令后的向PC发送可以和上面的进行合并******************************************************************************* /void UART0_TXD(uchar Data[],uchar Num){uchar i=0;uchar *PData;PData=Data;EX0=0;ES=0;for(i=0;i<Num;i++)//有Num组号码要发送{SBUF=*(PData+i);// SBUF =addr;while(TI==0);TI=0;//等待数据发送出去delay();//等待后再发送dogFeed();}}/***************************************************** 延时时间还有待测量*****************************************************/ void delay0_2ms(uint count){uint k;while(count--!=0){for(k=0;k<50;k++){//WATCHDOG=~W ATCHDOG;dogFeed();}}}/***************************************************** 蜂鸣器蜂鸣函数可以单独写成子程序,这里没有运用*****************************************************/ /*void dida(uchar j){uchar i;for(i=0;i<j;i++){DD=0;delay_long(20);delay1ms(30);DD=~DD;delay1ms(30);}}*///*****************************************************/*将ID_Data中的5字节数据转换成Card_ID中的10字节数据*///*****************************************************void trans(void){Card_ID[0] = (ID_Data[0] >> 4) & 0x0F;Card_ID[1] = ID_Data[0] & 0x0F;Card_ID[2] = (ID_Data[1] >> 4) & 0x0F;Card_ID[3] = ID_Data[1] & 0x0F;Card_ID[4] = (ID_Data[2] >> 4) & 0x0F;Card_ID[5] = ID_Data[2] & 0x0F;Card_ID[6] = (ID_Data[3] >> 4) & 0x0F;Card_ID[7] = ID_Data[3] & 0x0F;Card_ID[8] = (ID_Data[4] >> 4) & 0x0F;Card_ID[9] = ID_Data[4] & 0x0F;dogFeed();}//*****************************************************/*码型转换方法1*///*****************************************************void hex_to_assic_1(void){ulint Card_Num;uchar i;trans();dogFeed();Card_Num = (ulint)(Card_ID[9]) + (ulint)(16)*(ulint)(Card_ID[8]) + (ulint)(256)*(ulint)(Card_ID[7]) + (ulint)(4096)*(ulint)(Card_ID[6]) + (ulint)(65536)*(ulint)(Card_ID[5]) + (ulint)(1048576)*(ulint)(Card_ID[4]);for(i = 9;i > 1;i--){Card_ID[i] =(Card_Num%10)+48; //48为ASCII码的值,0为48,1为49,依次类推。

曼彻斯特码原理与应用

曼彻斯特码原理与应用

曼彻斯特码1 曼彻斯特原理介及其编码规则 (1)2 曼彻斯特码的各方面应用 (3)3 曼彻斯特码与差分曼彻斯特码 (5)1 曼彻斯特原理介及其编码规则Manchester编码是一种常用的基带信号编码。

它具有内在的时钟信息,因而能使网络上的每一个系统保持同步。

在Manchester编码中,时间被划分为等间隔的小段,其中每小段代表一位数据。

每一小段时间本身又分为两半,前半个时间段所传信号是该时间段传送比特值的反码,后半个时间段传送的是比特值本身。

可见在一个时间段内,其中间点总有一次信号电平的变化,因此携带有信号传送的同步信息而不需另外传送同步信号。

Manchester编码采用电平由高到低变化的下降沿代表0,电平由低到高变化的上升沿代表1;发送和接收的同步工作方式保证了信息传递的方便和可靠。

为了减少控制器与位置反馈单元之间的连线数目,信息的传递可采用两根线的串行方式。

发送端和接收端的同步靠信息脉冲串之前的同步脉冲串来实现。

在电信领域,曼彻斯特码,(也称作相位码或者PE)是一种数据通讯线性码,它的每一个数据比特都是由至少一次电压转换的形式所表示的曼彻斯特编码被因此被认为是一种自定时码。

自定时意味着数据流的精确同步是可行的。

每一个图1 二进制码和曼彻斯特码对比图比特都准确的在一预先定义时间时期的时间中被传送。

但是,今天有许许多多的复杂的编码方法(例如8B/10B编码),在达到同等目的情况下只需要更少带宽负荷并且只有更少的同步信号相位模糊。

二进制码与曼彻斯特码波形的对比关系如图1所示。

在曼彻斯特编码中,用电压跳变的相位不同来区分1和0,即用正的电压跳变表示0,用负的电压跳变表示1。

因此,这种编码也称为相应编码。

由于跳变都发生在每一个码元的中间,接收端可以方便地利用它作为位同步时钟,因此,这种编码也称为自同步编码。

用于数字基带传输的码型种类较多,Manchester码是其中常用的一种。

Manchester码是一种用跳变沿(而非电平)来表示要传输的二进制信息(0或1),一般规定在位元中间用下跳变表示“1”,用上跳变表示“0”. 曼彻斯特编码被被认为是一种自定时码自定时意味着数据流的精确同步是可行的。

EM4100 RFID 125KHz 动态链接库函数说明

EM4100 RFID 125KHz 动态链接库函数说明

MF1动态链接库名称:int MF_Halt()功能:使卡进入被中断的状态,只有当卡退出操作范围再进入或用ALL操作模式,才能操作卡输入:输出:返回:0 操作成功1 操作失败举例:名称:int ControlLED(unsigned char para1,unsigned char para2, unsigned char *buf)功能:para1=0时,开关天线。

操作卡时需先打开天线,不操作卡时,可用来关闭天线以省电para1=1时,复位RF模块输入:para1=0para2=0关闭天线, para1=2关闭天线输出:操作失败,则buf [0] 为错误代码操作成功,则buf [0] 为成功标志,即为0x80返回:0 操作成功1 操作失败举例:ControlLED(0,1,buf) 打开天线名称:int ControlBuzzer(unsigned char para1,unsigned char para2, unsigned char *buf)功能:操作LED和SPK的状态输入:para1=0:操作LEDpara2=0,红色LED亮绿色LED灭,para2=1,绿色LED亮红色LED关para1=1:操作SPKpara2=0,SPK关para2=1,SPK响输出:操作失败,则buf [0] 为错误代码操作成功,则buf [0] 为成功标志,即为0x80返回:0 操作成功1 操作失败举例:ControlBuzzer(1,1,buf) SPK响名称:int MF_Getsnr(unsigned char para1, unsigned char para2,unsigned char *buf1,unsigned char *buf2)功能:读取卡片唯一卡号输入:para1=0读取在IDLE状态卡片卡号para1=1读取所有状态卡片卡号para2=0输出:操作失败,则buf 1[0] 为错误代码操作成功,则buf 2[0…3] 为卡号返回:0 操作成功1 操作失败举例:int MF_Getsnr(1,0,buf1,buf2) 读取所有状态卡片卡号名称:int MF_Read(unsigned char para1, unsigned char para2, unsigned char para3,unsigned char *buf1,unsigned char *buf2)功能:读取卡片块或机器EEPROM内容输入:para1.0=0 操作在IDLE状态卡片para1.0=1操作所有状态卡片para1.1=0 操作密钥为A密钥para1.1=1 操作密钥为B密钥para1.4=0 用buf1里的密钥para1.4=1 用机器EEPROM里的密钥para1.5=0 做操作卡前的所有步骤para1.5=1 仅做读卡单一步骤para1.6=0 操作卡片块内容para1.6=1 操作机器EEPROM内容para2 操作卡片时的块号para2=1 操作机器EEPROM时para3=1buf1 para1.4=0时buf1[0..5]为操作密钥para1.4=1时buf1[0] 在机器EEPROM里密钥编号输出:操作失败,则buf 2[0] 为错误代码读取卡片成功时,buf1[0…3]为卡片卡号, buf2[0…15]为卡片内容读取机器EEPROM成功时,buf1[0…3]为机器版本号, buf2[0…15]为EEPROM容返回:0 操作成功1 操作失败举例:名称:int MF_Write(unsigned char para1, unsigned char para2, unsigned char para3,unsigned char *buf1,unsigned char *buf2)功能:写入卡片块或机器EEPROM内容输入:para1.0=0 操作在IDLE状态卡片para1.0=1操作所有状态卡片para1.1=0 操作密钥为A密钥para1.1=1 操作密钥为B密钥para1.4=0 用buf1里的密钥para1.4=1 用机器EEPROM里的密钥para1.5=0 做操作卡前的所有步骤para1.5=1 仅做写卡单一步骤para1.6=0 操作卡片块内容para1.6=1 操作机器EEPROM内容para2 操作卡片时的块号para2=1 操作机器EEPROM时para3=1buf1 para1.4=0时buf1[0..5]为操作密钥para1.4=1时buf1[0] 在机器EEPROM里密钥编号buf2 写入的内容输出:操作失败,则buf 2[0] 为错误代码写入卡片成功时,buf1[0…3]为卡片卡号写入机器EEPROM成功时,buf1[0…3]为机器版本号返回:0 操作成功1 操作失败举例:名称:int MF_InitValue(unsigned char para1, unsigned char para2, unsigned char *buf1,unsigned char *buf2)功能:初始化卡片值块输入:para1.0=0 操作在IDLE状态卡片para1.0=1操作所有状态卡片para1.1=0 操作密钥为A密钥para1.1=1 操作密钥为B密钥para1.4=0 用buf1里的密钥para1.4=1 用机器EEPROM里的密钥para1.5=0 做操作卡前的所有步骤para1.5=1 仅做初始化单一步骤para2 卡片块号buf1 para1.4=0时buf1[0..5]为操作密钥para1.4=1时buf1[0] 在机器EEPROM里密钥编号buf2 初始化值输出:操作失败,则buf 1[0] 为错误代码操作成功, buf1[0…3] 为卡片卡号返回:0 操作成功1 操作失败举例:名称:int MF_Dec(unsigned char para1, unsigned char para2, unsigned char *buf1,unsigned char *buf2)功能:卡片块减值输入:para1.0=0 操作在IDLE状态卡片para1.0=1操作所有状态卡片para1.1=0 操作密钥为A密钥para1.1=1 操作密钥为B密钥para1.4=0 用buf1里的密钥para1.4=1 用机器EEPROM里的密钥para1.5=0 做操作卡前的所有步骤para1.5=1 仅做单一减值步骤para2 卡片块号buf1 para1.4=0时buf1[0..5]为操作密钥para1.4=1时buf1[0] 在机器EEPROM里密钥编号buf2 减值输出:操作失败,则buf 1[0] 为错误代码操作成功, buf1[0…3] 为卡片卡号返回:0 操作成功1 操作失败举例:名称:int MF_Inc(unsigned char para1, unsigned char para2, unsigned char *buf1,unsigned char *buf2)功能:卡片块加值输入:para1.0=0 操作在IDLE状态卡片para1.0=1操作所有状态卡片para1.1=0 操作密钥为A密钥para1.1=1 操作密钥为B密钥para1.4=0 用buf1里的密钥para1.4=1 用机器EEPROM里的密钥para1.5=0 做操作卡前的所有步骤para1.5=1 仅做单一加值步骤para2 卡片块号buf1 para1.4=0时buf1[0..5]为操作密钥para1.4=1时buf1[0] 在机器EEPROM里密钥编号buf2 加值输出:操作失败,则buf 1[0] 为错误代码操作成功, buf1[0…3] 为卡片卡号返回:0 操作成功1 操作失败举例:错误代码0x83 没有检测到卡0x84 数据错误0x85 参数错误0x8B 防冲突错误0x8C 密钥错误0x8F 未知命令0xA0 复位RF模块失败。

曼彻斯特解码原则 125K EM4100系列RFID卡解码源程序分析资料

曼彻斯特解码原则 125K EM4100系列RFID卡解码源程序分析资料

曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析曼彻斯特解码原则1.曼彻斯特编码曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。

曼彻斯特编码被用在以太网媒介系统中。

曼彻斯特编码提供一个简单的方式给编码简单的二进制序列而没有长的周期没有转换级别,因而防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误。

在这个技术下,实际上的二进制数据被传输通过这个电缆,不是作为一个序列的逻辑1或0来发送的(技术上叫做反向不归零制(NRZ))。

相反地,这些位被转换为一个稍微不同的格式,它通过使用直接的二进制编码有很多的优点。

曼彻斯特编码,常用于局域网传输。

在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示"1",从低到高跳变表示"0"。

还有一种是差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示"0"或"1",有跳变为"0",无跳变为"1"。

对于以上电平跳变观点有歧义:关于曼彻斯特编码电平跳变,在雷振甲编写的<<网络工程师教程>>中对曼彻斯特编码的解释为:从低电平到高电平的转换表示1,从高电平到低电平的转换表示0,模拟卷中的答案也是如此,张友生写的考点分析中也是这样讲的,而《计算机网络(第4版)》中(P232页)则解释为高电平到低电平的转换为1,低电平到高电平的转换为0。

清华大学的《计算机通信与网络教程》《计算机网络(第4版)》采用如下方式:曼彻斯特编码从高到低的跳变是0 从低到高的跳变是1。

两种曼彻斯特编码是将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位编码中有一跳变,不存在直流分量,因此具有自同步能力和良好的抗干扰性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析曼彻斯特解码原则1.曼彻斯特编码曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。

曼彻斯特编码被用在以太网媒介系统中。

曼彻斯特编码提供一个简单的方式给编码简单的二进制序列而没有长的周期没有转换级别,因而防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误。

在这个技术下,实际上的二进制数据被传输通过这个电缆,不是作为一个序列的逻辑1或0来发送的(技术上叫做反向不归零制(NRZ))。

相反地,这些位被转换为一个稍微不同的格式,它通过使用直接的二进制编码有很多的优点。

曼彻斯特编码,常用于局域网传输。

在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示"1",从低到高跳变表示"0"。

还有一种是差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示"0"或"1",有跳变为"0",无跳变为"1"。

对于以上电平跳变观点有歧义:关于曼彻斯特编码电平跳变,在雷振甲编写的<<网络工程师教程>>中对曼彻斯特编码的解释为:从低电平到高电平的转换表示1,从高电平到低电平的转换表示0,模拟卷中的答案也是如此,张友生写的考点分析中也是这样讲的,而《计算机网络(第4版)》中(P232页)则解释为高电平到低电平的转换为1,低电平到高电平的转换为0。

清华大学的《计算机通信与网络教程》《计算机网络(第4版)》采用如下方式:曼彻斯特编码从高到低的跳变是0 从低到高的跳变是1。

两种曼彻斯特编码是将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位编码中有一跳变,不存在直流分量,因此具有自同步能力和良好的抗干扰性能。

但每一个码元都被调成两个电平,所以数据传输速率只有调制速率的1/2。

就是说主要用在数据同步传输的一种编码方式。

【在曼彻斯特编码中,用电压跳变的相位不同来区分1和0,即用正的电压跳变表示0,用负的电压跳变表示1。

因此,这种编码也称为相应编码。

由于跳变都发生在每一个码元的中间,接收端可以方便地利用它作为位同步时钟,因此,这种编码也称为自同步编码。

】2. 曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE);常用于局域网传输。

在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号。

但在不同的书籍中,曼彻斯特编码中,电平跳动表示的值不同,这里产生很多歧义:1、在网络工程师考试以及与其相关的资料中:位中间电平从高到低跳变表示"0";位中间电平从低到高跳变表示"1"。

2、在一些《计算机网络》书籍中:位中间电平从高到低跳变表示"1";位中间电平从低到高跳变表示"0"。

在清华大学出版的《计算机通信与网络教程》《计算机网络(第4版)》也是这么说的,就以此为标准,我们就叫这为标准曼彻斯编码。

至于第一种,我们在这里就叫它曼彻斯特编码。

但是要记住,在不同的情况下懂得变通哦,否则会被老师扣分数的哦。

这两者恰好相反,千万别弄混淆了。

现在我们要讲的就是差分曼彻斯特编码:在信号位开始时不改变信号极性,表示辑"1"在信号位开始时改变信号极性,表示逻辑"0" ;【注意】:如果在最初信号的时候,即第一个信号时:如果中间位电平从低到高,则表示0;如果中间位电平从高到低,则表示1;后面的(从第二个开始)就看每个信号位开始时有没有跳变来决定:下面我们来举个例子,来比较标准曼彻斯特编码、曼彻斯特编码、差分曼彻斯特编码:EM4100系列用的是:曼彻斯特编码!125K;EM4100系列RFID卡解码源程序分析1.我们知道了曼彻斯特编码原则,那么反过来的过程就是解码了。

EM4100系列用的是:曼彻斯特编码!2.传统只读射频卡读卡器的设计一般采用U2270B或EM4095读写基站芯片加MCU模式,其成本高、功耗大。

本文介绍一种采用一片74HC4060+LM258/358加少量普通元件构成的读卡器电路和处理的程序设计方案,电路简单、功耗小、成本低。

74HC4060+LM258/358 电路为市面上已非常成熟RFID-125KHZ-I卡且广泛采用的低功耗、低成本方案。

该方案在门禁、保安、考勤、展览会、公园、旅店、餐厅等公共场所的门票、优惠卡以及生产过程、邮政包裹、航空铁路运输、产品包装、交通等部门的物流、电子标签、防伪标志、一次性票证等众多领域上占据半壁江山。

3.推挽式放大电路输出後接LC串联谐振电路,当回路固有谐振频率与输入讯号频率相等时,电路发生串联谐振。

本文只要求对125kHz 频率的讯号放大,所以根据串联谐振公式计算电路中元件参数,可得L=737uH,C=2200pF。

4.包络检波电路感应线圈产生谐振电压约有20V,所以载波讯号的电压也约为20V。

对输入电压高於500mV检波,称为「大讯号检波」,利用二极体单向导电特性及检波负载RC充放电过程实现。

RC参数的确定需要满足两个条件:1.不产生隋性失真,一般工程上按计算,f为载波频率。

2.不产生负峰切割失真,即,m为调幅系数,R1是交流阻值,R0是直流阻值。

联立上述两个条件,确定检波电路中R12、C36分别为470kΩ、4700pF。

5.波形整形电路在单晶片处理之前,整形电路将检波後的讯号变成单片机可以识别的高低电平。

LM358 (LM258) 内部整合两个运放,经过两次整形後可以得到很好的方波讯号。

电路中R16、R17、R18、R19起到分压作用,确定输出翻转门限为2.5V;R15、R21将同向输入的电压叠加在反向输入端;C54、C55为耦合电容,能够隔离直流分量,传递交流讯号。

当U+大於U-+2.5V时,输出高电平;当U+小於U-+2.5V时,输出低电平。

6.读卡程序是根据EM4100、EM4001系列射频卡的特点量身定做的一段程序,射频卡以曼彻斯特编码,传输一个资料的时间t=64/125kHz=512μs。

实际使用中,一般传输时间为,230μs<0.5t<280μs。

280μs<定时器取样时间<512μs。

所以本文中取样波形时,定时器时间设定为400μs,保证为取样留有足够的时间。

原程序分析:1. 定时器时间设定为400μs#define TH0_H 0xfe// 定时器0 取样定时值设定为400us#define TL0_L 0x8f//8f2.定时器0中断优先级最高:PT0=1;3.//曼彻斯特码同步头检测,9个1采用逐个前移检测法//逐个前移检测法,即每检测到一个数据,如果是"1",并向数据库写入1, //如果是"0",就放弃当前检测的数据,并向当前数据流方向移动一位, //这样一来,就保证了不管数据流是在何种状态下,都能正确无误地抓取9个1,//同步头9个1的提取成功,曼彻斯特码译码器即和当前的数据流保持了同步,//并把余下的55位数据全部译完。

4.uchar REM_Buffer[14];//曼彻斯特码解码后得到最终数据的缓存0~13/*曼彻斯特码解码后的数据放在REM_Buffer[0~13];REM_Buffer[0]=0xff 数据格式:1111 1111 同步头,8个1REM_Buffer[1]=0x8x 数据格式:1xxx xxxx 同步头,1个1,x表示无意义REM_Buffer[2]= 数据格式:D00D01D02D03 P0xxx 八个版本位或厂商信息的前四位,x表示无意义;P0为行效验位REM_Buffer[3]= 数据格式:D10D11D12D13 P1xxx 八个版本位或厂商信息的后四位,x表示无意义;P1为行效验位REM_Buffer[4]= 数据格式:D20D21D22D23 P2xxx 三十二个数据,x表示无意义;P2为行效验位REM_Buffer[5]= 数据格式:D30D31D32D33 P3xxx 三十二个数据,x表示无意义;P3为行效验位REM_Buffer[6]= 数据格式:D40D41D42D43 P4xxx 三十二个数据,x表示无意义;P4为行效验位REM_Buffer[7]= 数据格式:D50D51D52D53 P5xxx 三十二个数据,x表示无意义;P5为行效验位REM_Buffer[8]= 数据格式:D60D61D62D63 P6xxx 三十二个数据,x表示无意义;P6为行效验位REM_Buffer[9]= 数据格式:D70D71D72D73 P7xxx 三十二个数据,x表示无意义;P7为行效验位REM_Buffer[10]= 数据格式:D80D81D82D83 P8xxx 三十二个数据,x表示无意义;P8为行效验位REM_Buffer[11]= 数据格式:D90D91D92D93 P9xxx 三十二个数据,x表示无意义;P9为行效验位REM_Buffer[12]= 数据格式:PC0PC1PC2PC3 0xxx 四个列效验位,x表示无意义;0为停止位原程序://2008.10.15//125K;EM4100系列RFID卡解码//#include <reg52.h>//使用AT89S51/52等系列单片机头文件#include <STC12C5410AD.h>//stc系列单片机专用头文件#include <intrins.h>#define uint unsigned int//定义#define uchar unsigned char//定义#define ulong unsigned long//定义sbit REM=P2^1;// 曼彻斯特编码输入端sbit CLK=P3^3;//产生125KHZ 时钟信号端sbit LED=P2^5;// 红灯sbit SPP=P1^0;// 喇叭bit REM_BIT;// 曼彻斯特码高、低边沿跳变标志位,bit Efficacy_BIT; //待效验标志位,bit P_PC_BIT; //行,列效验标志位bit YES_NO_BIT; //效验正确,或效验错误标志位,//YES_NO_BIT=1 表示效验正确;//YES_NO_BIT=0 表示效验错误。

#defineTH0_H 0xfe// 定时器0 取样定时值设定为400us#defineTL0_L 0x8f//8f//350~420us//375~450usuchar U_D_Buffer[5];//User_Data//用户数据缓存,ulong long_D;//方法1,卡号在long_D 中,不足10位,则在高位前面加0uchar char_D;//方法2,前两位卡号在char_D 中,uint int_D;//方法2,卡号后4位卡号在int_D 中,uchar volue;//volue 为曼彻斯特码译码时的临时运算缓存uchar REM_Buffer[14];//曼彻斯特码解码后得到最终数据的缓存0~13 /*曼彻斯特码解码后的数据放在REM_Buffer[0~13];REM_Buffer[0]=0xff 数据格式:1111 1111 同步头,8个1REM_Buffer[1]=0x8x 数据格式:1xxx xxxx 同步头,1个1,x表示无意义REM_Buffer[2]= 数据格式:D00D01D02D03 P0xxx 八个版本位或厂商信息的前四位,x表示无意义;P0为行效验位REM_Buffer[3]= 数据格式:D10D11D12D13 P1xxx 八个版本位或厂商信息的后四位,x表示无意义;P1为行效验位REM_Buffer[4]= 数据格式:D20D21D22D23 P2xxx 三十二个数据,x表示无意义;P2为行效验位REM_Buffer[5]= 数据格式:D30D31D32D33 P3xxx 三十二个数据,x表示无意义;P3为行效验位REM_Buffer[6]= 数据格式:D40D41D42D43 P4xxx 三十二个数据,x表示无意义;P4为行效验位REM_Buffer[7]= 数据格式:D50D51D52D53 P5xxx 三十二个数据,x表示无意义;P5为行效验位REM_Buffer[8]= 数据格式:D60D61D62D63 P6xxx 三十二个数据,x表示无意义;P6为行效验位REM_Buffer[9]= 数据格式:D70D71D72D73 P7xxx 三十二个数据,x表示无意义;P7为行效验位REM_Buffer[10]= 数据格式:D80D81D82D83 P8xxx 三十二个数据,x表示无意义;P8为行效验位REM_Buffer[11]= 数据格式:D90D91D92D93 P9xxx 三十二个数据,x表示无意义;P9为行效验位REM_Buffer[12]= 数据格式:PC0PC1PC2PC3 0xxx 四个列效验位,x表示无意义;0为停止位*/uchar code DispTab[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};uchar code Data[]={"Data: "};//数据uchar code UserData[]={"User Data: "};//用户数据uchar code Card_1[]={"Methods 1 Decimal Card Number: "};//方法1:掐头留尾法提取10位十进制卡号:uchar code Card_2[]={"Methods 2 Decimal Card Number: "};////方法2:前两位+后4位的微根格式,段间以小数点或豆号隔开uchar code DispTab_2[]={' ','H',','};void init()//{TMOD=0x21;TH1=0xfd;//11.0592MHz 波特率: 9600TL1=0xfd;PCON&=0x80;SCON=0x40;//AUXR=0x40;//波特率倍增//11.0592MHz 115200TH0=0x00;//TL0=0x00;//EA=1;ET0=1;TR0=0;TR1=1;ES=0;REN=1;PT0=1;//PT0H=1;//定时器0中断优先级最高:第三//PT0H是stc单片机特有的寄存器REM=1;CLK=1;SPP=1;LED=1;REM_BIT=1;}void delay1(uint z)// delay(10); 10次为1ms { uchar x;for(;z>0;z--){for(x=0;x<160;x++){}}}/*void delay()//{_nop_();_nop_();_nop_();}*/void Time_interrupt(void) interrupt 1 //定时器0中断{TR0=0; //关闭定时器0,为曼彻斯特码提取数据定时器}void RS232_in(void) interrupt 4//串口中断{EA=0;if(RI==1)//接收{RI=0;//SBUF_RI_Buffer[0]=SBUF;//RS2323接收缓冲区}//////////////////else //if(TI==1)//发送TI=0;EA=1;}void RS232()//通信转输数据,发给PC{uchar i;ulong mm;//ES=0;if((REM_Buffer[0]==0xff)&&(REM_Buffer[1]==0x80))//同步头9个1的判断,同步头正确,进入数据发送,否则退出{for(i=0;i<6;i++){SBUF=Data[i];//" "while(TI==0);TI=0;}for(i=0;i<13;i++){SBUF=DispTab[(REM_Buffer[i]/16)];//SBUF=REM_Buffer[i];//给PC 发送REM_Buffer[0~13]个数据while(TI==0);//TI=1,表示数据发送完毕,TI=0;//TI清零,并把余下的数据继续发送,直到13个数据全部发送完。

相关文档
最新文档