基于單片機IC卡設(shè)計_第1頁
基于單片機IC卡設(shè)計_第2頁
基于單片機IC卡設(shè)計_第3頁
基于單片機IC卡設(shè)計_第4頁
基于單片機IC卡設(shè)計_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

PAGEPAGE5目錄前言…………2系統(tǒng)原理框圖4一系統(tǒng)原理框圖的繪制………4二原理圖………6硬件部分介紹………………7一AT89C51單片機簡介………7二RS232串行接口……………9三SLE4442簡介………………11四IC卡座……………………11五外圍電路………13軟件部分……17一工作過程、流程圖…………17二用C51實現(xiàn)的讀/寫主程序19三上位PC機通信接口軟件……26總結(jié)……………..28一總結(jié)……………28二參考文獻(xiàn)………28前言IC卡是一個正蓬勃發(fā)展的邊緣產(chǎn)業(yè),一個與我們的生活正越來越密切的產(chǎn)業(yè)。在普及因特網(wǎng)和計算機的大潮涌來時,IC卡扮演著越來越重要的角色。IC卡讀寫設(shè)備大致可分為兩大類:一類為專用讀寫設(shè)備或稱脫機讀寫器。其特點是:充分利用IC卡存儲量大,可以獨立存儲和工作,不需要和主機相連就可完成數(shù)據(jù)讀寫的優(yōu)點,可與應(yīng)用設(shè)備結(jié)合或單獨工作。例如:IC卡電表,水表,ATM機,商場收款機。另一類為通用讀寫設(shè)備,或稱聯(lián)機讀寫器,是帶有單片機和存儲器的設(shè)備,通過并行或串行口與PC機或應(yīng)用系統(tǒng)網(wǎng)絡(luò)相連接。在運行不同軟件時可以讀寫不同種類的IC卡,組成不同的應(yīng)用系統(tǒng)。如果配備開發(fā)系統(tǒng)軟件,可對IC卡做初始規(guī)劃,數(shù)據(jù)加密和初始寫入,從而構(gòu)成IC卡應(yīng)用開發(fā)制作環(huán)境。在本設(shè)計中,我們討論通用開發(fā)系統(tǒng)——基于ATM89C51單片機的IC卡讀/寫器的設(shè)計。

IC卡讀/寫設(shè)備由IC卡卡座,單片機,數(shù)據(jù)存儲器RAM,程序存儲器EEPROM,接口電路和外圍設(shè)備等組成。

IC卡讀/寫器各部分結(jié)構(gòu)與功能簡單介紹如下:

1.IC卡卡座

IC卡卡座是連接IC卡與讀寫器的。其功能包括對IC卡供電,提供讀寫信號和傳送數(shù)據(jù)。要求提供方便的插拔方式和可靠的接觸,并帶有帶電插拔,過流保護,插卡檢測等能力。IC卡和插座的結(jié)構(gòu)尺寸必須符合國際標(biāo)準(zhǔn)化組織(ISO)7816的標(biāo)準(zhǔn)。對觸點數(shù)目、位置、信號名稱和功能都有明確規(guī)定,以保證兼容性。

2.單片機和存儲器

讀寫器中配備單片機和ROM,RAM存儲器,構(gòu)成微機系統(tǒng),單片機運行ROM中固化的軟件,執(zhí)行與IC卡和上位PC機的通信規(guī)程??刂茖C卡的讀寫,完成IC卡與主機間數(shù)據(jù)的格式轉(zhuǎn)換。為減輕單片機負(fù)擔(dān),提高讀寫速度,常配置有硬件密文轉(zhuǎn)換和單元。3.接口電路和外圍設(shè)備二原理圖:第二章硬件部分介紹一AT89C51單片機簡介

AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低電壓,高性能CMOS8位微處理器,俗稱單片機。AT89c51是一種帶2K字節(jié)閃爍可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C51是它的一種精簡版本。AT89C511.主要特性:

·與MCS-51兼容

·4K字節(jié)可編程閃爍存儲器

壽命:1000寫/擦循環(huán)

數(shù)據(jù)保留時間:10年

·全靜態(tài)工作:0Hz-24Hz

·三級程序存儲器鎖定

·128*8位內(nèi)部RAM

·32可編程I/O線

·兩個16位定時器/計數(shù)器

·5個中斷源

·可編程串行通道

·低功耗的閑置和掉電模式

·片內(nèi)振蕩器和時鐘電路2.管腳說明:

VCC:供電電壓。

GND:接地。

P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0口作為原碼輸入口,當(dāng)FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。

P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。

P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。

P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。

P3口也可作為AT89C51的一些特殊功能口,如下表所示:

口管腳備選功能

P3.0RXD(串行輸入口)

P3.1TXD(串行輸出口)

P3.2/INT0(外部中斷0)

P3.3/INT1(外部中斷1)

P3.4T0(記時器0外部輸入)

P3.5T1(記時器1外部輸入)

P3.6/WR(外部數(shù)據(jù)存儲器寫選通)

P3.7/RD(外部數(shù)據(jù)存儲器讀選通)

P3口同時為閃爍編程和編程校驗接收一些控制信號。

RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機器周期的高電平時間。

ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時,ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。

/PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。

/EA/VPP:當(dāng)/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。

XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。

XTAL2:來自反向振蕩器的輸出。3.振蕩器特性:

XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時鐘源驅(qū)動器件,XTAL2應(yīng)不接。有余輸入至內(nèi)部時鐘信號要通過一個二分頻觸發(fā)器,因此對外部時鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。4.芯片擦除:

整個PEROM陣列和三個鎖定位的電擦除可通過正確的控制信號組合,并保持ALE管腳處于低電平10ms來完成。在芯片擦操作中,代碼陣列全被寫“1”且在任何非空存儲字節(jié)被重復(fù)編程以前,該操作必須被執(zhí)行。

此外,AT89C51設(shè)有穩(wěn)態(tài)邏輯,可以在低到零頻率的條件下靜態(tài)邏輯,支持兩種軟件可選的掉電模式。在閑置模式下,CPU停止工作。但RAM,定時器,計數(shù)器,串口和中斷系統(tǒng)仍在工作。在掉電模式下,保存RAM的內(nèi)容并且凍結(jié)振蕩器,禁止所用其他芯片功能,直到下一個硬件復(fù)位為止。二RS232串行接口EIA-RS-232C是由美國電子工業(yè)協(xié)會EIA制訂的一種串行物理接口標(biāo)準(zhǔn)。RS-232C采用負(fù)邏輯,-5~-15V為邏輯1,+5~+15V為邏輯0。而TTL電平的“1”和“0”的特征電壓分別為2.4V和0.4V,用RS-232C總線進行串行通信需外接電路實現(xiàn)電平轉(zhuǎn)換。在發(fā)送端需用驅(qū)動電路將TTL電平轉(zhuǎn)換成RS-232C電平,在接收端用接收電路將RS-232C電路轉(zhuǎn)換為TTL電平。本設(shè)計是用的TI公司的RS-232C收發(fā)器MAX232,可用單一+5V電源供電實現(xiàn)電平轉(zhuǎn)換。RS-232C在設(shè)計中主要永遠(yuǎn)用于PC機與IC卡讀/寫器之間的通框圖如下RS-232C芯片的引腳結(jié)構(gòu)如圖5所示:圖5圖5中的C1、C2、C3、C4及V+、V—是電源變換電路部分。在實際應(yīng)用中,器件對電源噪音很敏感。因此,VCC必須要對地加去耦電容,其值為0.1μF。電容C1、C2、C3及C4取同樣的數(shù)值的鉭電解電容,用以提高抗干擾能力,在連接時必須盡量靠近器件。MAX232的13、14管腳為串行異步通信發(fā)送及接受引腳。三SLE4442卡簡介

SLE4442卡內(nèi)部有一個256

8bit

EEPROM,不可逆的4個寫保護字節(jié),具備密碼保護功能,可以隨時讀取主存儲器內(nèi)容;在校驗成功后,可讀保護存儲器、讀寫安全存儲器和寫主存儲器。

SLE4442有一個密碼邏輯,用以控制對存儲器的讀寫。為此,SLE4442包含一個4字節(jié)加密存儲區(qū),該存儲區(qū)有一個錯誤計數(shù)器EC(0-2位)和三個字節(jié)的參考數(shù)據(jù),這三個字節(jié)作為一個整體,稱為可編程密碼(PSV)。整個數(shù)據(jù)區(qū)除了參考數(shù)據(jù),其它的數(shù)據(jù)都能被讀取,在校驗數(shù)據(jù)與內(nèi)部參考數(shù)據(jù)比較正確后才能進行讀寫操作,連續(xù)三次比較錯誤后,錯位計數(shù)器將阻止任何比較嘗試,從而也消除了任何擦寫操作。四IC卡座IC卡座引腳如圖6所示,其中引腳SW1、SW2為微動開關(guān)在無IC卡狀態(tài)時,處與斷開狀態(tài);有卡插入時,IC卡卡座上的微動開關(guān)閉合。因此,此開關(guān)往往是用來判斷是否插IC卡的傳感器件。其引腳VCC:工作電壓;SCL(CLK):串行時鐘;GND:接地;SDA(I/O):串行數(shù)據(jù)(輸入/輸出);SW1、SW2:微動開關(guān)本設(shè)計中與邏輯有關(guān)的引出端先只有2條:SCL和SDA。所有的地址、數(shù)據(jù)及讀/寫控制命令等信號均從SDA端輸入/輸出。為了區(qū)分線上的數(shù)據(jù)、地址、操作命令以及各種狀態(tài)的“開始”與“結(jié)束”,卡片內(nèi)設(shè)計就多個邏輯控制單元。其中,啟動與停止邏輯單元產(chǎn)生控制讀/寫操作的“開始”與“停止”標(biāo)志信號。“開始”狀態(tài):當(dāng)SCL處于高電平時,SDA從高電平轉(zhuǎn)向低電平,即產(chǎn)生“開始”標(biāo)志信號?!巴V埂睜顟B(tài):當(dāng)SCL處于高電平時,SDA從低電平轉(zhuǎn)向高電平,即產(chǎn)生一個“停止”標(biāo)志信號,如圖6所示:圖6讀/寫的啟動與停止時序SDA和SCL通常各自通過一個電阻拉到高電平,當(dāng)SCL為高電平時,對應(yīng)的SDA上的數(shù)據(jù)有宵;而當(dāng)SCL為低電平時,允許SDA上的數(shù)據(jù)變化。數(shù)據(jù)輸入/輸出應(yīng)答邏輯單元產(chǎn)生數(shù)據(jù)輸入/輸出操作應(yīng)答信號。操作時所有的地址和數(shù)據(jù)字均一8位碼串行輸入/輸出于卡片??ㄆ瑳]收到一個8位碼長的地址或數(shù)據(jù)后都以置SDA線為低電平方式“確認(rèn)”應(yīng)答信號,其波形如圖7所示圖7五外圍電路(1)狀態(tài)燈IC卡的上電一般是可知的,即對IC卡讀/寫時,須給IC卡上電(送電源),因此,IC卡的上電控制比較簡單。由于IC卡讀/寫電流很小,一般為幾個A,因此其實現(xiàn)可按照圖8所示。由單片機89C51的P14信號通過小功率三極管9012控制系統(tǒng)的+5V電源切入IC卡座。當(dāng)IC卡上電后,發(fā)光二極管L2被點亮,起讀/寫指示作用。每次對IC卡讀/寫完成后。即及時先電,以減少插拔時帶電的可能性,要保證IC卡能任意插拔(有可能處于帶電狀態(tài)),不致IC卡損壞,必須使IC卡拔電過程處于斷電的狀態(tài)。要做到這點,必須保證IC卡的下電迅速及時圖8(2)蜂鳴器一般所指的蜂鳴器是以壓電陶瓷為主要元件的。壓電陶瓷是一類有將壓力與電流相互轉(zhuǎn)換能力的特殊陶瓷。這種能力緣于其特殊的晶體結(jié)構(gòu)。當(dāng)壓電陶瓷在一定方向上受到一個壓力使其晶體結(jié)構(gòu)發(fā)生形變時,它就會在內(nèi)部產(chǎn)生一個電流,并且電流的變化與壓力的變化密切相關(guān)。反之亦然。所以利用這一特性,在壓電陶瓷上通過一定頻率的電流,就會引起壓電陶瓷微小形變,這一形變帶動空氣發(fā)生振動,如果頻率適當(dāng),就可以被人耳所聽見,也就是產(chǎn)生了蜂鳴聲。本設(shè)計當(dāng)中蜂鳴起的做用是IC卡與單片機是否連接。將IC卡插進卡座時,IC卡座與單片機之間的連接無誤是蜂鳴器會響。在取出IC卡,即IC卡與單片機斷開連接,蜂鳴器也要響。具體連接圖如圖9所示:圖9(3)電源電路U1=220V,U2=8V,Uc1=1.2U2=9.6V,UO=5V功率穩(wěn)壓電源由電源變壓器、整流電路、濾波電路和穩(wěn)壓電路四個部分組成,如圖10所示+電源+整流+濾波+穩(wěn)壓+u1u2u3uIU0_變壓器_電路_電路_電路_u1u2u3uIU00t0t0t0t0t圖10穩(wěn)壓電源的組成框圖及整流與穩(wěn)壓過程(1).電源變壓器電源變壓器的作用是將來自電網(wǎng)的220V交流電壓u1變換為整流電路所需要的交流電壓u2。電源變壓器的效率為:其中:是變壓器副邊的功率,是變壓器原邊的功率。(2).整流和濾波電路在穩(wěn)壓電源中一般用四個二極管組成橋式整流電路,整流電路的作用是將交流電壓u2變換成脈動的直流電壓u3。濾波電路一般由電容組成,其作用是把脈動直流電壓u3中的大部分紋波加以濾除,以得到較平滑的直流電壓UI。UI與交流電壓u2的有效值U2的關(guān)系為:在整流電路中,每只二極管所承受的最大反向電壓為:流過每只二極管的平均電流為:其中:R為整流濾波電路的負(fù)載電阻,它為電容C提供放電通路,放電時間常數(shù)RC應(yīng)滿足:其中:T=20ms是50Hz交流電壓的周期。(3)穩(wěn)壓電路由于輸入電壓u1發(fā)生波動、負(fù)載和溫度發(fā)生變化時,濾波電路輸出的直流電壓UI會隨著變化。因此,為了維持輸出電壓UI穩(wěn)定不變,還需加一級穩(wěn)壓電路。穩(wěn)壓電路的作用是當(dāng)外界因素(電網(wǎng)電壓、負(fù)載、環(huán)境溫度)發(fā)生變化時,能使輸出直流電壓不受影響,而維持穩(wěn)定的輸出。穩(wěn)壓電路一般采用集成穩(wěn)壓器和一些外圍元件所組成。采用集成穩(wěn)壓器設(shè)計的穩(wěn)壓電源具有性能穩(wěn)定、結(jié)構(gòu)簡單等優(yōu)點。集成穩(wěn)壓器的類型很多,在小功率穩(wěn)壓電源中,普遍使用的是三端穩(wěn)壓器。按輸出電壓類型可分為固定式和可調(diào)式,此外又可分為正電壓輸出或負(fù)電壓輸出兩種類型。固定電壓輸出穩(wěn)壓器常見的有CW78(LM78)系列三端固定式正電壓輸出集成穩(wěn)壓器;CW79(LM79)系列三端固定式負(fù)電壓輸出集成穩(wěn)壓器。三端是指穩(wěn)壓電路只有輸入、輸出和接地三個接地端子。型號中最后兩位數(shù)字表示輸出電壓的穩(wěn)定值,有5V、6V、9V、15V、18V和24V。穩(wěn)壓器使用時,要求輸入電壓UI與輸出電壓UO的電壓差UI–UO≥2V。穩(wěn)壓器的靜態(tài)電流Io=8mA。當(dāng)UO=5~18V時,UI的最大值UIMAX=35V;當(dāng)UO=18~24V時,UI的最大值UIMAX=40V。第三章軟件部分一.工作過程軟件結(jié)構(gòu)設(shè)計及其分析讀/寫器軟件結(jié)構(gòu)讀/寫器的讀/寫操作由上位PC機進行控制,通過串行通信的命令字節(jié)來實現(xiàn)。集體規(guī)定我誒:如握手信號為0AAH,則讀卡;如握手信號為0BBH,則寫卡。讀/寫器的主程序框圖如圖11所示。其中,在讀/寫卡開始時,設(shè)置讀寫卡標(biāo)志;在通信開始時,設(shè)置通信標(biāo)志。避免數(shù)據(jù)不全或錯誤數(shù)據(jù)讀入或?qū)懭搿A硗?,所以的IC卡數(shù)據(jù)是先存放在IC卡的讀緩沖區(qū)和寫緩沖區(qū)的?!坝锌ú迦敕瘛笔怯眠^判斷P33引腳的高低電平來實現(xiàn)的。為了保證讀卡的可靠性,必須進行軟件“去抖”處理。一旦有卡插入,則設(shè)置讀/寫卡標(biāo)志(有卡);在通信時,設(shè)置正在通信標(biāo)志。目的是我為了避免帶電插卡。本系統(tǒng)中關(guān)鍵的軟復(fù)位是通過在外中斷INT0服務(wù)函數(shù)中設(shè)置軟復(fù)位標(biāo)志、在主函數(shù)中強制跳轉(zhuǎn)到函數(shù)首實現(xiàn)的。圖11主程序流程圖拔卡處理是通過設(shè)置成高優(yōu)先級的下降沿觸發(fā)的INT0中斷來實現(xiàn)的。其程序如圖12所示:圖12拔卡處理中斷子程序串行通信才用3線制軟握手方式(2)軟件系統(tǒng)分析為保證IC卡讀/寫過程準(zhǔn)確可靠,除要保證讀/寫函數(shù)嚴(yán)格按照IC卡的讀/寫時序外,還須采用“重讀”和“復(fù)讀”措施。即讀IC卡是,采用讀2次的方式,如2次相符,則數(shù)據(jù)有效,否則再進行第3次讀,寫IC卡時,先將數(shù)據(jù)寫入,再回讀比較,否則重寫一次,以免偶然的寫失導(dǎo)致得出IC卡失效的錯誤結(jié)論。如何使上、下位機均不死機或能簡單恢復(fù)正常工作呢?對于作為下位機的IC卡讀/寫器,利用IC卡能隨意插拔,再結(jié)合IC卡的拔卡處理是一個高級中斷的特點,將IC卡的拔卡中斷程序設(shè)計成2個分支:(1)非IC卡讀/寫且非與上位機通信狀態(tài);(2)在與上位機通信或正在對IC卡讀/寫狀態(tài)。第1種情況下,中斷子程序是簡單的鞍鼻卡BEEP告警后,直接中斷返回;第2種情況,則會引起系統(tǒng)工作時常甚至死機,在恢復(fù)中斷環(huán)境后,用強制跳轉(zhuǎn)指令強制從主程序開始執(zhí)行,達(dá)到復(fù)位的效果。程序框圖如圖12所示。為確保串行通信的可靠性,應(yīng)著重從上、下位機通信軟件的以下問題入手——合理選擇通信波特率。由于上、下位機通信的數(shù)據(jù)量很?。ㄗ疃酁镮C卡的容量),因此通信波特率可選低一些,如2400;但要高度重視下位機(即IC卡讀/寫器)的波特率參數(shù)整頂問題。對于51系統(tǒng)CPU,尤其要注意電源管理寄存器中SMOD位的設(shè)置。以2400波特率為例,當(dāng)SMOD=0時,波特率參數(shù)為0F9H,實際波特率為2232,此時波特率相對誤差是7%;而當(dāng)SMOD=1時,波特率參數(shù)為0F3H,實際波特率為2401,此時波特率相對誤差是0.16%,滿足正常通信所規(guī)定的波特率相對誤差小于5%的要求。二用C51實現(xiàn)的讀/寫主程序#include<reg51.h>#include<absacc.h>#defineucharunsignedchar#defineuintunsignedint/*IC卡信號輸入/輸出*/Sbitscl=P17;Sbitsda=P16;/*I/O口定義*/SbitICOUT=P32;SbitICIN=P33;SbitCOMM=P34;SbitBELL=P35;SbitPWR=P14;/*波特率選擇*/SbitBACD=P12;/*24c01~24c16讀/寫驅(qū)動程序*/Sbita0=ACC-0;Sbita1=ACC-1;Sbita2=ACC-2;Sbita3=ACC-3;Sbita4=ACC-4;Sbita5=ACC-5;Sbita6=ACC-6;Sbita7=ACC-7;/*讀/寫數(shù)據(jù)緩沖區(qū),24C01最多為128B*/Ucharbuf[16];Ucharflag;/*標(biāo)志定義*/SbitIC_WR=flag-0;SbitONCOMM=flag-1;SbitRST=flag-2;Voidstart_ic(void){Sda=1;Scl=1;Delay(2);Sda=0;Delay(6);}Voidstop_ic(void){Sda=0;Scl=1;Delay(6);Sda=1;Delay(6);Scl=0;Sda=0;}Voidack_ic(void){Sda=0;Delay(3);Scl=1;Delay(3);Scl=0;Sda=1;}/*讀字節(jié)函數(shù),無應(yīng)答信號*/Unsignedcharrd24(void){sda=1;scl=1;a7=sda;scl=0;Scl=1;a6=sda;scl=0;Scl=1;a5=sda;scl=0;Scl=1;a4=sda;scl=0;Scl=1;a3=sda;scl=0;Scl=1;a2=sda;scl=0;Scl=1;a1=sda;scl=0;Scl=1;a0=sda;scl=0;Sda=1;scl=1;scl=o;`Return(ACC);}/*寫字節(jié)函數(shù)*/Voidwd24(unsignedchardd){ACC=dd;Sda=a7;scl=1;scl=0;Sda=a6;scl=1;scl=0;Sda=a5;scl=1;scl=0;Sda=a4;scl=1;scl=0;Sda=a3;scl=1;scl=0;Sda=a2;scl=1;scl=0;Sda=a1;scl=1;scl=0;Sda=a0;scl=1;scl=0;Sda=1;scl=1;While(sda==1);SCL=0;}/*隨機地址地字節(jié)函數(shù),address為預(yù)讀單元地址*/Ucharread_buter(ucharaddress){Ucharx;Start_ic();Wd24(0a0);Wd24(address);Start_ic();Wd24(0a1);X=rd24();Stop_ic();Return(x);}/*從指定地址開始順序讀塊地址數(shù)據(jù),數(shù)據(jù)存入全局緩沖區(qū)中buf,n為數(shù)據(jù)字節(jié)數(shù)*/Ucharread_bytes(ucharaddress,ucharn){Uchara,y;For(y=0;y<n;y++){a=read_byter(address,y);buf[y]=a;}}/**//*字節(jié)寫入模式寫函數(shù),其中address為單元地址,dd為數(shù)據(jù)*/Voidwrite_byte(ucharaddress,uchardd){Start_ic();Wd24(0a0);Wd24(address);Wd24(dd);Stop_ic();}/*串行通信子程序*//*波特率2400,8位數(shù)據(jù)位,1位停止位,無校驗位*//*先用握手字節(jié)y,然后發(fā)送x個數(shù)據(jù)*//*待發(fā)送數(shù)據(jù)在trdata緩沖區(qū)中*/Voidcomm.(ucharx,uchary){Uchari,a;Uintj;While(1){TI;while(RI==0);RI=0;A=SBUF;If(a!=y)goto[1];For(j=0;i<x;i++);{SBUFtrdata[i];While(TI==1);TI=0;}For(j=0;j<12500;j++);}}/*主程序初始化函數(shù)*/Voidinit(void){RSR=0; PWR=1;IC_WR=0;ONCOMM=0;EX0=1;TMOD=0x20;SCON=0x50;TH1=0xf3;TL1=0xf3;If(BAUI)==0{PCON=0x08;}Else{PCON=0x00;}TR1=1;EA=1;}/*將數(shù)據(jù)緩沖區(qū)16B發(fā)往上位機*//*波特率2400,8位數(shù)據(jù)位,1位停止位,無校驗為2*//*待發(fā)送數(shù)據(jù)在buf緩沖區(qū)*/Voidtransfer(void){Uchari;Uintj;For(i=0;i<16;i++){SBUF=buf[i];While(TI==0);TI=0;FCR=0;j<1000;j++);}}/*接收16B存入緩沖區(qū)*//*波特率2400,8位數(shù)據(jù)位,1位停止位,無校驗位*//*緩沖區(qū)為buf*/Voidteceive(void){UcharI,a;For(i=0;i<16;i++){while(RI==0);RI=0;A=SBUF;Buf[i]=a;}}/*將緩沖區(qū)的n字節(jié)寫入IC卡address開始的區(qū)域*/Voidwrite_ic(ucharaddress,ucharn){Ucharx,y;For(y=0;y<n;y++){While_byte(address[y],buf[y]);Delay(10);}}/*拔卡中斷程序,主要完成IC卡下電及讀/寫復(fù)位*/Voidint_0(void)interrupt0using1{While(!ICOUT);Delay(10);If(!ICOUT){If(IC_WRONCOMM){PWR=1;BELL=0;Delay(10);BELL=1;RST==1;}}}/*延時函數(shù),延時ms數(shù)由N決定,但不同的系統(tǒng)需要調(diào)整相應(yīng)參數(shù)*/Voiddelay(ucharn){Uchari,j,k;For(k=o;k<n;k++)For(i=0;i<100;i++)For(j=0;j<255;j++);}Voidmain(void){Uchara;Fuwei:init();While(!ICIN);Delay(10);While(!ICIN);IC_WR=1;/*開始讀IC卡16B并存入緩沖區(qū)*/PWR=0;Read_bytes(0,16);PWR=1;/*等待與上機位建立通信聯(lián)系*/ONCOMM=1;While(RI==0);RI=0;A=SBUF;Switch(a){case0xaa:SBUF=0xaa;While(!TI);TI=0;Transfer();Break;Case0xbb:SBUF=0xbb;While(!TI);TI=O; Receive(); PWR=0; Write_ic(0,16); PWR=1; Break;Default: SBUF=0xcc; While(!TI); TI=0;}ONCOMM=0;While(!RST);Gotofuwei;}采用fanklincC51編譯的命令如下:>C51IC.C>L51IC.OBJ三上位PC機通信接口軟件在Windows9x的串行通信實現(xiàn)一般有3種方式:利用Windows9x的API接口函數(shù)。對于RAD開發(fā)系統(tǒng)(如VB),可利用ActiveX串行通信控件。利用DLL動態(tài)鏈接庫,直接操作串行端口。上述3種方式各有特點。這里討論采用第3種方式實現(xiàn)的串行通信接口,具有應(yīng)用靈活的特點。下面給出基于Delphi4.0的串行通信DLL程序:LibraryMycomdll;UseSysUtils;Classes;ConstCOM1:=$3f8;COM2:=$2f8;VarCOM:Word;{DLL中全局變量}ProcedureOutb(ConstBeginAsmMOVDX,PortMOVAL,DbyteOUTDXEnd;End;FunctionInb(ConstBeginAsmMOVDX,PortMOVAL,DbyteOUTDXEnd;End;FunctionInb(ConstBeginAsmMOVDX,PortINAL,DXMOV@ResulltEnd;End;{串行口初始化,COM1,COM2可選,波特率2400,4800可選}ProcedureCommInit(ConsstVarBAUDL,BAUDH:Byte;BeginIfPort=1thenCOM:=COM1;ElseCOM:=COM2;IfBAUD=’2400’thenBeginBAUDL:=$30;BAUDH:=$00;End;ElseBeginBAUDL:=$18;BAUDH:=$00;End;Outb(COM+3,$80);Outb(COM,BAUDL);Outb(COM+1,BAUDH);Outb(COM+3,$03);End;{發(fā)送一字節(jié)}ProcedureSendByte(ConstDbyte:Byte);Stdcall;VarStatus:Byte;BeginRepestStatus:=Inb(COM+5);Until((Statusand$20)=$20);Outb(COM,Dbyte);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論