文档库 最新最全的文档下载
当前位置:文档库 › 8051定时器脉宽测量方法解码125KHz EM4001_4100 ID卡的曼彻斯特码

8051定时器脉宽测量方法解码125KHz EM4001_4100 ID卡的曼彻斯特码

[订阅] 单片机/嵌入式开发 RSS Feed
单片机/嵌入式开发 https://www.wendangku.net/doc/6415905284.html, 首页 BBS BBS BBS BBS BBS BBS
Jan
29
8051定时器脉宽测量方法解码125KHz EM4001/4100 ID卡的曼彻斯特码
2010-01-29 9:23 am 作者: https://www.wendangku.net/doc/6415905284.html,
代码省略了一些无关紧要的部分, 稍加修改就可以编译成功
晶振是11.0592MHz
#define SPK P2_3 //蜂鸣器
#define LED P2_4 //指示灯
#define INPORT P1_0 //曼彻斯特解码输入
//用来区分脉冲宽度的参数
#define TIME00 50
#define TIME05 260
#define TIME10 550
bit bitin; //上一次的状态位
unsigned char Buff[30]; //解码缓冲区
//检测数据位
unsigned char readbit()
{
unsigned int mk=TIME10; //装入超时值
TL0=TH0=0; //初始化计时器
TR0=1; //开始计时
while(--mk) //超时机制,防止死等
if(bitin!=INPORT) //有跳变
break;
TR0=0; //停止计时
if(mk==0) //超时退出
return 0;
bitin=INPORT; //保存状态
mk=TH0*256+TL0; //计算这样跳变的脉宽
if((mk>TIME05)&&(mk=TIME00)&&(mk<=TIME05)) //半个周期
return 2;
return 0; //出错
}
//读一个完整的数据位
unsigned char readdata()
{
switch(readbit())
{
case 1: //一个周期
return !bitin;
case 2: //半个周期
if(readbit()!=2) return 2; //再读一次半个周期
return !bitin;
default:
return 2;
}
}
//接收并解码
bit CheckData()
{
unsigned char i,j;
bitin=INPORT; //保存位状态
for(i=0;i<9;i++) //检测9个数据位1
{
if(readdata()!=1)
return 0;
}
//读取数据
for(i=0;i<11;i++)
{
Buff[i]=0x00;
for(j=0;j<5;j++)
{
Buff[i]<<=1;
switch(readdata())
{
case 0: //0
break;
case 1: //1
Buff[i]|=0x08;
break;
case 2: //err
return 0;
}
}
}
//结束位
if(Buff[10]&0x08!=0x00)
return 0;
//行奇校验位
for(i=0;i>4) ^
(Buff[i]>>3) ^
(Buff[i]>>2) ^
(Buff[i]>>1) ^
Buff[i])&0x08)!=0)
return 0;
//列奇校验位
j=0;
for(i=0;i<11;i++)
j=j ^ (Buff[i]&0x80);
if(j!=0)
return 0;
for(i=0;i<11;i++)
j=j ^ (Buff[i]&0x40);
if(j!=0)
return 0;
for(i=0;i<11;i++)
j=j ^ (Buff[i]&0x20);
if(j!=0)
return 0;
for(i=0;i>4 & 0x0F);
Buff[1]=(Buff[4] & 0xF0) | (Buff[5]>>4& 0x0F);
Buff[2]=(Buff[6] & 0xF0) | (Buff[7]>>4& 0x0F);
Buff[3]=(Buff[8] & 0xF0) | (Buff[9]>>4& 0x0F);
SPK=0;
LED=0;
printf("SN is 0x");
for(i=0;i<4;i++)
printhex(Buff[i]);
putchar('\n');
delay_ms(300);
SPK=1;
LED=1;
delay_ms(700);
return 1;
}
return 0;
}
void init(void)
{
LED=0;
SPK=0;
TMOD=0x21;
TH1=0xFD;
SCON=0x50;
PCON=0x00;
TR1=1;
TI=1;
//EA=1;
INPORT=1;
printf("Start\n");
delay_ms(300);
LED=1;
SPK=1;
}
main()
{
//初始化
init();
for(;;)
{
ReadCardNo();
//在这里可以做其它事.
}
}
推荐(0) 收藏
上一篇 下一篇 标签: 125K , 125KHz , EM4001 ,EM4100 , EMID | 分类: EM4001 ID卡读头 | RSS 2.0 | Trackback
没有相关日志
*.没有相关日志
最近读者
登录 后,您将出现在这里!
最近还没有登录用户看过这篇文章
发表评论
昵称

邮箱 (不会被公布)
网站 发表评论
栏目分类
AT91SAM7X/7S系列 (5)
AT91SAM9xxx (35)
9260@DataFlash (4)
9260@NorFlash (2)
IP-Camera (3)
AVR32开发 (105)
DSPack语音视频采集 (1)
GCC (2)
LINUX (4)
LINUX操作系统研究 (1)
PC+WINDOWS编程 (1)
STM32 (4)
STM8 (15)
xvid (6)
个人杂谈 (6)
其他 (2)
创意DIY (1)
图像/视频编码/解码 (3)
旧事重提-项目整理 (19)
8051接入IP网络 (3)
AT89C51SND1C (8)
EM4001 ID卡读头 (4)
M1 读卡器 (1)
php-mysql订餐 (2)
并口驱动黑白液晶 (6)
语音图像视频 (12)
闲情逸致 (3)
骗子【李桂平】 (2)
2010年01月
一 二 三 四 五 六 日
Dec
Feb
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16
17
18
19 20 21 22
23
24
25
26
27
28
29 30 31
文章搜索 搜索 页面BBSBBSBBSBBSBBSBBS...页面BBSBBSBBSBBSBBSBBS...
页面
BBS
BBS
BBS
BBS
BBS
BBS
存档
2010年05月
2010年04月
2010年03月
2010年02月
2010年01月
2009年12月
2009年11月
2009年10月
Copyright 2009-2010 单片机/嵌入式开发. Power By Blog@35 粤ICP备09185674号 举报不良信息

相关文档