一,、IC卡讀寫器概述
目前經常接觸到的IC卡有兩種:接觸式的和非接觸式的IC卡。接觸式的IC卡通過機械觸點從讀寫器獲取能量和交換數(shù)據,;非接觸式IC卡通過線圈射頻感應從讀寫器獲取能量和交換數(shù)據,,所以又稱射頻卡。目前在社會上常見的是接觸式IC卡,。它具有存儲量大(以兆為單位),,保密功能強(有多重密碼設置和認證功能),可實現(xiàn)一卡多用,。但是,,這類卡的讀寫操作速度較慢,操作也不方便,,每次讀寫時必須把卡正確地插入到讀寫器的口槽才能完成數(shù)據交換,,這樣,在公交,、考勤等需要頻繁讀寫卡的場合就很不方便,,而且讀寫器的觸點和卡片上IC卡的觸腳暴露在外,容易損壞和搞臟而造成接觸不良。
非接觸式IC卡是根據射頻電磁感應原理產生的,。它的讀寫操作只需將卡片放在讀寫器附近一定的距離之內就能實現(xiàn)數(shù)據交換,,無需任何接觸,使用中非常方便,、快捷,,不易損壞。因此,,在公交,、門禁、校園,、企事業(yè)等人事管理,、娛樂場所等方面有廣泛的應用前景。目前我國引進的射頻 IC卡主要有PHILIPS公司的Mifare和ATMEL公司的Temic卡,。下面以PHILIPS公司的Mifare卡為主,、介紹城市公交自動售票IC卡讀寫器的實現(xiàn)方法。
二,、工作原理
非接觸式IC 卡讀寫器以射頻識別技術為核心,,讀寫器內主要使用了1片Mifare卡專用的讀寫處理芯片--MMM微模塊。它是一個小型的最大操作距離達20~30mm的Mifare讀/寫設備的核心器件,,其功能包括調制,、解調,、產生射頻信號、安全管理和防碰撞機制,。內部結構分為射頻區(qū)和接口區(qū):射頻區(qū)內含調制解調器和電源供電電路,,直接與天線連接;接口區(qū)有與單片機相連的端口,,還具有與射頻區(qū)相連的收/發(fā)器,、16字節(jié)的數(shù)據緩沖器、存放64對傳輸密鑰的ROM,、存放3套密鑰的只寫存儲器以及進行三次證實和數(shù)據加密的密碼機,、防碰撞處理的防碰撞模塊和控制單元。這是與射頻卡實現(xiàn)無線通信的核心模塊,,也是讀寫器讀寫Mifare卡的關鍵接口芯片,。讀寫器工作時,不斷地向外發(fā)出一組固定頻率的電磁波(13.6MHz),,當有卡靠近時,,卡片內有一個LG串聯(lián)諧振電路,,其頻率與讀寫器的發(fā)射頻率相同,,這樣在電磁波的激勵下,LG諧振電路產生共振,,從而使電容充電有了電荷,。在這個電容另一端,接有一個單向導電的電子泵,,將電容內的電荷送到另一個電容內存儲,。當電容器充電達到2V時,此電容就作為電源為卡片上的其他電路提供工作電壓,,將卡內數(shù)據發(fā)射出去或接收讀寫器發(fā)出的數(shù)據與保存,。
三、硬件組成
公交收費系統(tǒng)結構復雜,,環(huán)節(jié)較多,,因此,公交非接觸IC 卡的讀寫器至少應包括公交售卡機,、公交車載機和公交制卡機三個讀寫器,。除了售卡機要求有鍵盤外,其余的硬件組成大體相同,。圖1為非接觸IC卡及其讀寫器硬件電路原理圖,,主要由MMM微模塊、單片機,、鍵盤,、顯示,、存儲器、天線和監(jiān)控電路以及與PC機通信的TC232串行通信接口電路等部分組成,。
(1)單片機系統(tǒng)
單片機采用89C52,。它片內有8KB的ROM,256字節(jié)的RAM以及有32個I/O口,。P1口與串行器件24C64和顯示,、報警電路連接;P0口與MMM微模塊相連,,用作數(shù)據線,;P2口用作4×4鍵盤;P3口用于讀寫控制和中斷,。
(2)鍵盤電路
鍵盤接口電路用P2口接成4×4結構,,共16個鍵。其中數(shù)字鍵10個,,功能鍵2個,,退格鍵和回車鍵各1個,有2個鍵暫時未用,。 功能鍵有查詢和通信兩鍵,。
查詢鍵:售卡員可以通過此鍵查詢售卡金額和售卡記錄數(shù)。
通信鍵:由于讀寫器的存儲量有限,,因此讀寫器每售卡一段時間,,應將讀寫器中的數(shù)據通過RS-232串行接口與PC機通信,以便回放和清空讀寫器中的數(shù)據,。數(shù)據回放到PC機中后,,通過分析處理,形成各種報表,,以便公交公司及時掌握售卡情況,。
(3)顯示電路
顯示部分采用數(shù)碼顯示,利用串行輸入BCD碼--十進制譯碼驅動顯示器件MC14499來完成與單片機系統(tǒng)的顯示接口,,以顯示讀寫器工作狀態(tài),、輸入的數(shù)據或讀出IC卡中所剩余以及出錯信息等。此器件主要有1個20位移位寄存器,、1個鎖存器,、1個多路輸出器。多路輸出器輸出的BCD碼經段譯碼器譯碼后,,換成七段碼(abcdefg)和小數(shù)點DP送到段驅動器輸出,。
(4)存儲器
讀寫器中設計了存儲器。存儲器選用24CXX系列的串行E2PROM。在售卡機中主要存放卡號,、售卡員號,、售卡金額、售卡日期,、售卡總金額和售卡總記錄數(shù),;在車載機中主要存放乘客IC卡號、司機號和刷卡總數(shù)等信息,。顯示用MC14499驅動4位共陰數(shù)碼管,。正常工作后,每隔一段時間要把讀寫器拿到公交管理中心將讀寫器儲存的信息回放到PC機中保存處理,。讀寫器中存儲器可采用24C64,,其存儲量為8KB,如有需要也可用容量更大的存儲器如24C128或24C256等,。
(5)監(jiān)控電路
監(jiān)控電路采用DS1232L芯片,。它是個看門狗定時器,其功能是:上電和掉電時給89C52產生RESET信號,;看門狗對系統(tǒng)進行監(jiān)控,,防止死機。
(6)非接觸式IC卡
非接觸式IC卡選用Mifare卡,。其工作頻率為 13.6MHz,,存儲量為1KB分16區(qū),每區(qū)2套密碼,,每個區(qū)的存儲區(qū)域相互獨立,,因此每區(qū)可用作一種用途(第0區(qū)一般不用)以實現(xiàn)一卡多用,。由于Mifare卡密碼驗證機制嚴密,,保存的信息比較可靠安全,可以擦寫幾萬次,。
Mifare卡的16個區(qū),,每區(qū)又分4塊,每塊16字節(jié),。在售卡機中用第1區(qū)作用戶儲值塊,,其中第0塊存放身份號,第1~2塊存放價值,,第3塊存放兩套6字節(jié)密碼和4字節(jié)讀寫訪問條件,。
四、程序設計
下面以售卡機為主介紹軟件設計方法,。
考慮到售卡金額的安全管理,,公交公司事先必須制作好兩種IC票卡:一種是用戶IC票卡,另一種是售卡員的售票IC卡。這兩種卡可使用相同區(qū)號,,但密碼和訪問條件完全不同,,不會混淆。售卡員要進行售卡時,,必須先到公交公司辦理一張售票IC卡,,才有售卡的資格。售票IC卡內存放了售卡員身份號,、允許售卡的最大金額,、兩套6字節(jié)密碼和4字節(jié)讀寫訪問條件。售卡員售卡時,,每充值一張卡必須從自己的售票IC卡中減去售卡金額,,加到用戶IC卡中。當售票IC卡金額減到零后,,要到公交公司結賬,,并再對售票IC卡充值記賬。這樣,,可使公交公司的售卡網點分布得多而不亂,,又可方便用戶充值加卡,可有效地防止售票人員賬目不清而造成的資金流失,。程序主要包括IC卡讀寫操作程序,、鍵盤掃描程序、顯示程序,、存儲器讀寫程序和通信程序,。
1.主程序
主程序主要完成系統(tǒng)變量的初始化,循環(huán)掃描鍵盤,,檢測操作IC卡,,將操作結果存儲和顯示。在售卡機中使用了8KB的24C64作存儲器,,主要存儲的內容有:售卡機機號(1字節(jié)),、售卡總金額(3字節(jié))和總記錄(2字節(jié))。售出的每張卡的記錄包含:用戶卡身份號(4字節(jié)),、售卡日期(2字節(jié)),、加卡金額(1字節(jié))和售卡人編號(1字節(jié))。因此最大能存儲1023張售卡記錄,。主程序流程如圖2所示,,讀寫器對IC卡的操作流程如圖3所示。
2.鍵盤掃描程序
鍵盤掃描采用反轉法讀鍵:先從P2口的高4位輸出零電平,,從P2口的低4位讀取鍵盤狀態(tài),;再從P2口的低4位輸出零電平,,從P2口的高4位讀取鍵盤狀態(tài),將兩次讀取的結果組合起來就可以得到當前按鍵的特征碼(見程序中TABLE表),。有了這張表就可以編程,,將它們轉換成順序碼。用當前讀得的特征碼來順序查表,,用一單元記錄查找次數(shù),。當在表中查到有該特征碼時,它的位置(即查找次數(shù))就是對應的順序碼,。對應的鍵盤查鍵程序如下:
KEY: MOV P2,#0FH ,;用反轉法查鍵
MOV A,P2
ANL A,#0FH
MOV B,A
MOV P2,#0F0H
MOV A,P2
ANL A,#0F0H
ORL A,B
CJNE A,#0FFH,KEY1
RET ;無鍵按下
KEY1: MOV B,A ,;有鍵按下,,存鍵碼
MOV DPTR,#TABLE
MOV R3,#0FFH ;存順序碼單元初始化
KEY2: INC R3
MOV A,R3
MOVC A,@A+DPTR
CJNE A,B,KEY3 ,;判鍵碼,,求順序碼
MOV A,R3 ;若找到鍵碼,,存順序碼
RET
KEY3: CJNE A,#0FFH,KEY2,;判是否查完
RET ;已查完,,鍵碼未找到,,以無按鍵處理
TABLE: DB 77H,7BH,0BBH ;按鍵特征碼表
DB 0DBH,7DH,0BDH
DB 0DDH,7EH,0BEH
DB 0DEH,0B7H,0D7H
DB 0EEH,0EDH,0EBH
DB 0E7H,0C7H,0FFH
3.顯示程序
根據圖1,,在顯示電路中,,用P1口的3根I/O口線(P1.0、P1.1,、P1.2)分別提供時鐘信號(CLK),、串行數(shù)據(DA)和使能信號(EN)。MC14499每一次可接收20位串行輸入數(shù)據,,前4位用于控制數(shù)碼管的小數(shù)點顯示,,后16位是4個數(shù)碼管的BCD碼輸入數(shù)據,。在每幀數(shù)據傳送之前,,必須將EN置0;然后傳送20位數(shù)據,,數(shù)據傳送完后,,再將EN置1。顯示程序如下:
DISP: CLR P1.0 ,; 清CLK
CLR P1.2 ,;清EN
MOV R2,#04 ;置傳送位數(shù)
MOV A,#00
LCALL W14499 ;調送數(shù)顯示
MOV A,@R1 ,;讀要顯示的數(shù)
MOV R2,#08 ,;置傳送位數(shù)
LCALL W14499
INC R1
MOV A,@R1
MOV R2,#08 ; 置傳送位數(shù)
LCALL W14499
SETB P1.2 ,;置EN位
RET
W14499: SETB P1.0 ,; 清CLK
RLC A ;準備逐位送數(shù)顯示
MOV P1.1,C ,; 將數(shù)移入DA
CLR P1.0 ,; 清CLK
DJNZ R2,W14499
RET
4.串行E2PROM讀寫程序
24C64為I2C總線的E2PROM。SCL為400kHz時鐘線,,SDA為雙向數(shù)據線,,A2、A1,、A0三位為片選地址,,即I2C總線上最多可并聯(lián)8個串行E2PROM芯片。對E2PROM的操作方式由讀寫控制命令字決定,,如圖4所示,。其中"1010"為4位讀寫控制碼,R/W為讀寫控制位:"0"為寫操作,,"1"為讀操作,。所以結合圖1可知A2H為寫控制命令字,A3H為讀控制命令字,。
對存儲器寫操作,,首先,單片機向24C64發(fā)一個START命令,,產生開始條件,。然后,發(fā)寫命令控制字(如A2H),。當24C64接到命令后,,進入一個寫周期,再由單片機發(fā)送存儲地址,,即確定數(shù)據寫入到存儲器的哪個地址,,隨后,單片機將要存儲的數(shù)據送入到SDA數(shù)據線上,。寫周期結束時,,單片機再發(fā)一停止位(STOP)。
對存儲器讀操作,,首先,,單片機向24C64發(fā)一個START命令,,產生開始條件。然后發(fā)寫命令控制字(如A2H),。當24C64接到命令后,,進入一個寫周期,再由單片機發(fā)送存儲地址,。存儲地址發(fā)送成功后,,單片機又向24C64發(fā)一個START命令,產生開始條件,,然后發(fā)讀命令控制字(A3H),。當24C64接到命令后,進入一個讀周期,,單片機從SDA數(shù)據線上讀出指定存儲地址中的數(shù)據,。讀周期結束時,單片機再發(fā)一停止位(STOP),。(程序略)
值得注意的是,,對存儲器操作時,每讀寫一個字節(jié),,單片機必須送一個應答位(ACK),,釋放一下SDA數(shù)據線,以便存儲器能繼續(xù)接收數(shù)據,。
5.通信程序
在讀寫器中,,單片機與PC機之間的通信主要由TC232來實現(xiàn)TTL電平(0~5V)與RS232電平(+10~-10V)的轉換(電路見圖1),以完成售卡機保存的售卡記錄的傳送,。通信格式設置為:采用串行工作方式1,,波特率為9600baud, 1個起始位,,8位數(shù)據位,,1個停止位,采取和校驗方式,。讀寫器中,,單片機程序可采用C語言進行編程。C語言有功能豐富的庫函數(shù),,運算速度快,、編譯效率高、可移植性好,、軟件的可讀性強,,便于改進和擴充(程序略)。
為提高在公交系統(tǒng)的適應能力,,包括用戶的各類特殊要求,,抗干擾,抗惡劣環(huán)境,,除硬件上采用監(jiān)控電路外,,在軟件上還采取了指令冗余和軟件陷阱。