51单片机曼彻斯特码译码源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C51 Manchester译码源程序C51曼彻斯特码译码源程序
2009-04-30 11:14
/*
manchester编码方式:0为10 1为01,如果与其相反则需要做相应的修改。
适用于125KHz非接触式ID卡,EM4100兼容格式ID卡(64bits, Manchester编码)
MCU:stc12c54xx
crystal:11.0592M
使用资源:外部中断0(INT0)+PCA0
*/
#include
#include
#include
#define Channe256uS_H 0x00 //模块60mS 定时常数高位
#define Channe256uS_L 0xEC //模块60mS 定时常数低位
#define uint8 unsigned char
sbit RFID_DATA = P3^2; //外部中断口接收数据
/*/函数申明 */
void start_Read() ;
void Data_reveice() ;
void Lmove_bite() ;
uint8 find_head() ;
uint8 Data_L_check() ;
uint8 Data_R_check() ;
void get_data();
uint8 Data_Sever() ;
void Get_EffectData(uint8 edata) ;
void Init_PCA0();
void DAT_Change(uint8 dat[]);
void init_dev(void);
uint8 tcount ;// 定时中断计数
uint8 count ;//接收数据位数计数
uint8 t_count ;//获得数据及校验变量。
uint8 temp ;// 临时变量
uint8 temp_buf[16] ;//128个Machester位 55个数据位缓冲区。
uint8 effectdata[5] ;//5个数据缓冲区。相当于模块串行读的10 Bytes 数据。
bit error_bit;//数据出错时为0,初始值为1
bit rev_state;//初始值为0;数据正确接收后为1. //当此位变为1时,说明数据接收正确并且正确处理,可以使用此ID数据。
/*********************************************
函数名:main()
功能:主函数
参数:无
*********************************************/
void main(void)
{
uint8 i;
error_bit=1;
rev_state=0;
init_dev();//初始化各模块
//添加自己的程序
}
}
void init_dev(void)
{
CMOD = 0x80; //PCA 在空闲模式下停止 PCA 计数器工作
CCON = 0x00; //;CF = 0,清0 PCA 计数器溢出中断请求标志位
CCAP0L=Channe256uS_L;//给 PCA 模块0 的 CCAP0L 置初值
CCAP0H=Channe256uS_H;
CCAPM0=0X49;
SCON=0x50;//串口工作在方式1,允许接收。
TMOD = 0x20 ; //定时器1工作在方式2 for generator baud rate
TH1=0xFD;//11.0592M baud rate//串口用于调试方便,波特率9600
TL1=0xFD;
TR1=1;
IT0=1;
EA = 1 ;// 开总中断
TI=1;
}
/********************************************* 函数名:BCD_Change
功能:初始化RFID模块
参数:无
*********************************************/ void DAT_Change(uint8 *dat)
{
uint8 i,count,c;
for(count=0;count<5;count++)
{
for(i=0;i<2;i++)
{
if(i==0)
{
c = dat[count]>>4;
c &= 0x0f;
if( c>=0 && c<=9 )
temp_buf[2*count+1] = '0' + c;
else
temp_buf[2*count+1] = 'A' + c - 10;
}
else
{
c = dat[count];
c &= 0x0f;
if( c>=0 && c<=9 )
temp_buf[2*count] = '0' + c;
else
temp_buf[2*count] = 'A' + c - 10;
}