返回列表 发新帖我要提问本帖赏金: 10.00元(功能说明)

[通信技术资料] 基于STC89C52的韦根数据接收

[复制链接]
 楼主| yangjiaxu 发表于 2021-4-8 15:03 | 显示全部楼层 |阅读模式
<
本帖最后由 yangjiaxu 于 2021-4-8 16:51 编辑

#申请原创# @21小跑堂

韦根是一种开放的通讯协议,具体官方介绍如下:
Wiegand协议是国际上统一的标准,有很多格式,标准的26-bit 应该是最常用的格式。此外,还有34-bit 、37-bit 等格式。格式的含义如下:当给出这一串数字,用户并不知道这串数字的含义,但如果说这是一个电话号码的时候,那么你可能就会说:哦,028是成都的区号,而88888888是电话号码。但是安防行业并不愿意把这些格式公开,而安防公司也常常变化这些格式来保证产品的保密性。
而标准26-bit 格式是一个开放式的格式,这就意味着任何人都可以购买某一特定格式的HID卡,并且这些特定格式的种类是公开可选的。26-Bit格式就是一个广泛使用的工业标准,并且对所有HID的用户开放。几乎所有的门禁控制系统都接受标准的26-Bit格式。
Wiegand(韦根)协议是由摩托罗拉公司制定的一种通讯协议,它适用于涉及门禁控制系统的读卡器和卡片的许多特性;其协议并没有定义通讯的波特率、也没有定义数据。长度韦根格式主要定义是数据传输方式:Data0和Data1两根数据线分别传输0和1.现应用最多的是26bit,34bit,36bit,44bit等等。

通俗的来说,韦根(Wiegand)协议又称韦根码,可以理解为是一种通信工具,其主要应用于读卡器(读头)到门禁控制器。当读卡器识别到有效卡后,将卡片的钥匙信息以韦根协议的方式传输,再而转换成数据发送给控制器,控制器验证钥匙信息有效后打开门。
韦根数据输出由二根线组成,分别是DATA0 和 DATA1 ,使用TTL电平传输,二根线分别为‘0’或‘1’输出。
输出‘0’时:DATA0线上出现负脉冲;
输出‘1’时:DATA1线上出现负脉冲;
负脉冲宽度TP=100微秒;周期TW=1600微秒;也就是说,无论传输“0”还是“1”,两条数据线上的电平都是“异或”关系。


一般门禁常用的韦根协议是26/34,本次楼主想用STC89C52RC实现对韦根数据的接收,恰巧此单片机具有2路外部中断IO(具体为P3.2与P3.3)。


本次,将韦根读头的D0接在MCU的P3.2,D1接在MCU的P3.3上,GND接在一起,之后就可以与韦根读头或者韦根其他设备对接了。

外部中断初始化程序如下:
  1. void InterruptInit()
  2. {
  3.     IT0 = 1; //  外部中断源选择为下降沿触发
  4.     EX0 = 1; //  开外部中断 0
  5.     IT1 = 1;
  6.     EX1 = 1;
  7.     EA = 1;  // 开总中断
  8. }
外部中断处理函数如下:
  1. void GetD0 () interrupt 0
  2. {
  3.     if(count == 0) // 获取偶校验码
  4.     {
  5.         firstbit = 0;
  6.     }
  7.     else if(count < 9) // 获取前八位 HID码
  8.     {
  9.         CardId[0] = (CardId[0] << 1) & 0xfe;
  10.     }
  11.     else if(count < 17) // 获取 PID的前八位
  12.     {
  13.         CardId[1] = (CardId[1] << 1) & 0xfe;
  14.     }
  15.     else if(count < 25) // 获取 PID的后八位
  16.     {
  17.         CardId[2] = (CardId[2] << 1) & 0xfe;
  18.     }
  19.     else
  20.     {
  21.         lastbit = 0;    // 获取奇校验码,使能标志位
  22.         r_done = 1;
  23.     }

  24.     count++;

  25.     if(count == 26)
  26.         count = 0;
  27. }
  28. void GetD1 () interrupt 2
  29. {
  30.     if(count == 0)
  31.     {
  32.         firstbit = 1;
  33.     }
  34.     else if(count < 9)
  35.     {
  36.         CardId[0] = (CardId[0] << 1) | 0x01;
  37.     }
  38.     else if(count < 17)
  39.     {
  40.         CardId[1] = (CardId[1] << 1) | 0x01;
  41.     }
  42.     else if(count < 25)
  43.     {
  44.         CardId[2] = (CardId[2] << 1) | 0x01;
  45.     }
  46.     else
  47.     {
  48.         lastbit = 1;
  49.         r_done = 1;
  50.     }

  51.     count++;

  52.     if(count == 26)
  53.         count = 0;
  54. }
将获取到的数据,可以通过串口发出来,也可以正常通过程序处理数据。本次使用串口将数据打印出来。
串口初始化程序如下:
  1. void UartInit(void)
  2. {
  3.     TMOD = 0x20;
  4.     TL1 = 0xfd;
  5.     TH1 = 0xfd;
  6.     TR1 = 1;
  7.     SCON = 0xd0;
  8.     EA = 1;
  9. }
最终,将韦根获取到的数据通过串口打印出来。

前三个字节是16进制的数据,后五个字节是通过程序转换的BCD码。
至此,基于51单片机的韦根数据接收已经完成了,那么,你看懂了么?欢迎在下方评论区讨论哦。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

21小跑堂 打赏了 10.00 元 2021-04-09
理由:恭喜通过原创文章审核!请多多加油哦!

Prry 发表于 2021-4-12 12:21 | 显示全部楼层
来个STM32版的
https://acuity.blog.csdn.net/article/details/78940123
 楼主| yangjiaxu 发表于 2021-4-12 22:47 | 显示全部楼层
Prry 发表于 2021-4-12 12:21
来个STM32版的:
https://acuity.blog.csdn.net/article/details/78940123

很奈斯,哈哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:擅长电路设计、物联网产品开发、射频产品开发,喜欢打篮球,技术交流,欢迎各位来聊~

783

主题

3316

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:嵌入式技术专家
简介:擅长电路设计、物联网产品开发、射频产品开发,喜欢打篮球,技术交流,欢迎各位来聊~

783

主题

3316

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部