韋根是一種開放的通訊協(xié)議,具體官方介紹如下:
Wiegand協(xié)議是國際上統(tǒng)一的標(biāo)準(zhǔn),有很多格式,標(biāo)準(zhǔn)的26-bit 應(yīng)該是最常用的格式。此外,還有34-bit 、37-bit 等格式。格式的含義如下:當(dāng)給出這一串?dāng)?shù)字,用戶并不知道這串?dāng)?shù)字的含義,但如果說這是一個(gè)電話號碼的時(shí)候,那么你可能就會(huì)說:哦,028是成都的區(qū)號,而88888888是電話號碼。但是安防行業(yè)并不愿意把這些格式公開,而安防公司也常常變化這些格式來保證產(chǎn)品的保密性。
而標(biāo)準(zhǔn)26-bit 格式是一個(gè)開放式的格式,這就意味著任何人都可以購買某一特定格式的HID卡,并且這些特定格式的種類是公開可選的。26-Bit格式就是一個(gè)廣泛使用的工業(yè)標(biāo)準(zhǔn),并且對所有HID的用戶開放。幾乎所有的門禁控制系統(tǒng)都接受標(biāo)準(zhǔn)的26-Bit格式。
Wiegand(韋根)協(xié)議是由摩托羅拉公司制定的一種通訊協(xié)議,它適用于涉及門禁控制系統(tǒng)的讀卡器和卡片的許多特性;其協(xié)議并沒有定義通訊的波特率、也沒有定義數(shù)據(jù)。長度韋根格式主要定義是數(shù)據(jù)傳輸方式:Data0和Data1兩根數(shù)據(jù)線分別傳輸0和1.現(xiàn)應(yīng)用最多的是26bit,34bit,36bit,44bit等等。
通俗的來說,韋根(Wiegand)協(xié)議又稱韋根碼,可以理解為是一種通信工具,其主要應(yīng)用于讀卡器(讀頭)到門禁控制器。當(dāng)讀卡器識別到有效卡后,將卡片的鑰匙信息以韋根協(xié)議的方式傳輸,再而轉(zhuǎn)換成數(shù)據(jù)發(fā)送給控制器,控制器驗(yàn)證鑰匙信息有效后打開門。
韋根數(shù)據(jù)輸出由二根線組成,分別是DATA0 和 DATA1 ,使用TTL電平傳輸,二根線分別為‘0’或‘1’輸出。
輸出‘0’時(shí):DATA0線上出現(xiàn)負(fù)脈沖;
輸出‘1’時(shí):DATA1線上出現(xiàn)負(fù)脈沖;
負(fù)脈沖寬度TP=100微秒;周期TW=1600微秒;也就是說,無論傳輸“0”還是“1”,兩條數(shù)據(jù)線上的電平都是“異或”關(guān)系。
一般門禁常用的韋根協(xié)議是26/34,本次樓主想用STC89C52RC實(shí)現(xiàn)對韋根數(shù)據(jù)的接收,恰巧此單片機(jī)具有2路外部中斷IO(具體為P3.2與P3.3)。
本次,將韋根讀頭的D0接在MCU的P3.2,D1接在MCU的P3.3上,GND接在一起,之后就可以與韋根讀頭或者韋根其他設(shè)備對接了。
外部中斷初始化程序如下:
void InterruptInit(){ IT0 = 1; // 外部中斷源選擇為下降沿觸發(fā) EX0 = 1; // 開外部中斷 0 IT1 = 1; EX1 = 1; EA = 1; // 開總中斷}
外部中斷處理函數(shù)如下:
void GetD0 () interrupt 0{ if(count == 0) // 獲取偶校驗(yàn)碼 { firstbit = 0; } else if(count 《 9) // 獲取前八位 HID碼 { CardId[0] = (CardId[0] 《《 1) & 0xfe; } else if(count 《 17) // 獲取 PID的前八位 { CardId[1] = (CardId[1] 《《 1) & 0xfe; } else if(count 《 25) // 獲取 PID的后八位 { CardId[2] = (CardId[2] 《《 1) & 0xfe; } else { lastbit = 0; // 獲取奇校驗(yàn)碼,使能標(biāo)志位 r_done = 1; }
count++;
if(count == 26) count = 0;}void GetD1 () interrupt 2{ if(count == 0) { firstbit = 1; } else if(count 《 9) { CardId[0] = (CardId[0] 《《 1) | 0x01; } else if(count 《 17) { CardId[1] = (CardId[1] 《《 1) | 0x01; } else if(count 《 25) { CardId[2] = (CardId[2] 《《 1) | 0x01; } else { lastbit = 1; r_done = 1; }
count++;
if(count == 26) count = 0;}
將獲取到的數(shù)據(jù),可以通過串口發(fā)出來,也可以正常通過程序處理數(shù)據(jù)。本次使用串口將數(shù)據(jù)打印出來。
串口初始化程序如下:
void UartInit(void){ TMOD = 0x20; TL1 = 0xfd; TH1 = 0xfd; TR1 = 1; SCON = 0xd0; EA = 1;}
最終,將韋根獲取到的數(shù)據(jù)通過串口打印出來。
前三個(gè)字節(jié)是16進(jìn)制的數(shù)據(jù),后五個(gè)字節(jié)是通過程序轉(zhuǎn)換的BCD碼。
至此,基于51單片機(jī)的韋根數(shù)據(jù)接收已經(jīng)完成了,那么,你看懂了么?歡迎在下方評論區(qū)討論哦。
原文標(biāo)題:基于STC89C52的韋根數(shù)據(jù)接收
文章出處:【微信公眾號:嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責(zé)任編輯:haq
-
單片機(jī)
+關(guān)注
關(guān)注
6030文章
44499瀏覽量
632165 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6837瀏覽量
88754
原文標(biāo)題:基于STC89C52的韋根數(shù)據(jù)接收
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論