隨著單片機(jī)擴(kuò)展越來(lái)越多,單片機(jī)的存儲(chǔ)單元和數(shù)據(jù)總線傳輸端口并不足夠支持外部設(shè)備的擴(kuò)展和數(shù)據(jù)的傳輸。如何解決單片機(jī)外部總線和存儲(chǔ)器的擴(kuò)展成為一個(gè)必須解決的問(wèn)題之一。
本文基于I2C總線數(shù)字存儲(chǔ)IC卡設(shè)計(jì),以AT89S52單片機(jī)為核心,以匯編語(yǔ)言作為軟件設(shè)計(jì)程序的外部存儲(chǔ)IC卡設(shè)計(jì)。I2C總線是一種簡(jiǎn)單、雙向二線制同步串行總線,它只需要兩條線(串行時(shí)鐘線和串行數(shù)據(jù)線)即可在連接于總線上的器件之間的傳送信息。主器件用于啟動(dòng)總線傳送數(shù)據(jù),并產(chǎn)生時(shí)鐘以開(kāi)放傳送的器件,此時(shí)任何被尋址的器件均被認(rèn)為是從器件.在總線上主和從、發(fā)和收的關(guān)系不是恒定的,而取決于此時(shí)數(shù)據(jù)傳送方向。本設(shè)計(jì)并輔以鍵盤(pán)進(jìn)行數(shù)據(jù)的寫(xiě)入和地址的選擇,由LCD進(jìn)行寫(xiě)入數(shù)據(jù)的選擇和顯示。在單片機(jī)端加入讀寫(xiě)提示指示燈使用戶能夠更好的知道單片機(jī)的工作狀況。LCD、鍵盤(pán)、指示燈更大程度的提高了I2C總線數(shù)字存儲(chǔ)IC卡使用時(shí)的人機(jī)交互。使本裝置更加偏向?qū)嵱谩?br />
本設(shè)計(jì)以Keil軟件進(jìn)行程序的編寫(xiě),再聯(lián)調(diào)Proteus軟件進(jìn)行物理仿真,深化和擴(kuò)充了在單片機(jī)原理及相關(guān)方面的基本知識(shí)、基本理論和基本技能熟悉設(shè)計(jì)過(guò)程,了解設(shè)計(jì)步驟,掌握設(shè)計(jì)內(nèi)容,培養(yǎng)設(shè)計(jì)電路、實(shí)現(xiàn)軟件編程和編寫(xiě)設(shè)計(jì)說(shuō)明書(shū)能力的目的,為今后從事相關(guān)方面的實(shí)際工作打下良好基礎(chǔ)。
1.2 I2C總線的主要特性
1.總線只有兩條線,串行時(shí)鐘線和串行數(shù)據(jù)線;
2.每個(gè)連到總線上的器件都可由軟件以唯一的地址尋址,并建立簡(jiǎn)單的主-從關(guān)系,主器件既可作為發(fā)送器,也可作為接收器;
3.它是一個(gè)真正的多主總線,帶有競(jìng)爭(zhēng)檢測(cè)和仲裁電路,可使多主機(jī)任意同時(shí)發(fā)送而不破壞總線上的數(shù)據(jù);
4.同步時(shí)鐘允許器件通過(guò)總線以不同的波特率進(jìn)行通信;
5.同步時(shí)鐘可以作為停止和重新啟動(dòng)串行口發(fā)送的握手方式;
6.連接到同一總線的集成電路數(shù)只受400 pF的最大總線電容的限制;
I2C總線極大地方便了系統(tǒng)設(shè)計(jì)者,無(wú)須設(shè)計(jì)總線接口,因?yàn)榭偩接口已經(jīng)集成在片內(nèi)了,而使設(shè)計(jì)時(shí)間大為縮短,并且從系統(tǒng)中移去或增加集成電路芯片對(duì)總線上的其他集成電路片沒(méi)有影響。I2C總線的簡(jiǎn)單結(jié)構(gòu)便于產(chǎn)品改型或升級(jí),改型或升級(jí)時(shí)只需從總線上取消或加相應(yīng)的集成電路芯片即可。
1.使用AT89C52單片機(jī)、I2C串行AT24C02存儲(chǔ)器、4×4鍵盤(pán)、6位LED顯示器和2個(gè)發(fā)光二極管(D1和D2)設(shè)計(jì)一個(gè)基于I2C總線數(shù)字存儲(chǔ)IC卡。
2.通過(guò)鍵盤(pán)向IC卡寫(xiě)入256個(gè)任意數(shù)據(jù),并在6位LED顯示器上顯示存儲(chǔ)單元和寫(xiě)入的相應(yīng)數(shù)據(jù),例如:10H:66,寫(xiě)入一個(gè)數(shù)據(jù)點(diǎn)亮一次發(fā)光二極管D1。
3.通過(guò)鍵盤(pán)輸入存儲(chǔ)單元地址,將已寫(xiě)入IC卡該單元的數(shù)據(jù)讀出,并在6位LED顯示器上顯示存儲(chǔ)單元和讀出的相應(yīng)數(shù)據(jù),例如:30H:88,讀出一個(gè)數(shù)據(jù)點(diǎn)亮一次發(fā)光二極管D2。
4.鼓勵(lì)新創(chuàng)意,增加新功能。
設(shè)計(jì)內(nèi)容和設(shè)計(jì)要求
1.采用AT89C52單片機(jī)作為主控芯片,設(shè)計(jì)硬件電路。
2.采用AT89C52單片機(jī)匯編語(yǔ)言,完成軟件編程。
3.采用Keil和Proteus軟件完成系統(tǒng)的硬件設(shè)計(jì)、軟件編程及系統(tǒng)調(diào)試。
2.3 功能說(shuō)明
利用AT89C52單片機(jī)作為核心部件,對(duì)AT24C02存儲(chǔ)卡進(jìn)行指定地址的內(nèi)容寫(xiě)入。數(shù)據(jù)的讀取和寫(xiě)入通過(guò)鍵盤(pán)來(lái)進(jìn)行控制。寫(xiě)入數(shù)據(jù)時(shí),由鍵盤(pán)給出要寫(xiě)入的數(shù)據(jù),單片機(jī)進(jìn)行地址的給定,寫(xiě)入數(shù)據(jù)指示燈亮,LCD第一行顯示寫(xiě)入的數(shù)據(jù),第二行顯示該數(shù)據(jù)所存儲(chǔ)的地址。讀取數(shù)據(jù)時(shí),由鍵盤(pán)給出要讀取數(shù)據(jù)的地址,單片機(jī)通過(guò)I2C進(jìn)行數(shù)據(jù)的讀取,讀取數(shù)據(jù)指示燈亮,LCD第一行顯示你所輸入的數(shù)據(jù)的地址,第二行顯示該地址所存儲(chǔ)的數(shù)據(jù)。按鍵的輸入采用矩陣式查詢方法進(jìn)行按鍵的輸入,LCD通過(guò)對(duì)位的控制進(jìn)行分別顯示。24C02C存儲(chǔ)卡進(jìn)行數(shù)據(jù)的存儲(chǔ),通過(guò)過(guò)SCK和SDA來(lái)控制。
3.1 利用I2C總線進(jìn)行系統(tǒng)擴(kuò)展I2C總線接口的電氣結(jié)構(gòu)如圖3.1所示,組成I2C總線的串行數(shù)據(jù)線SDA和串行時(shí)鐘線SCL必須經(jīng)過(guò)上拉電阻Rp接到正電源上,連接到總線上的器件的輸出級(jí)必須為“開(kāi)漏”或“開(kāi)集”的形式,以便完成“線與”功能。SDA和SCL都為雙向I/O口線,總線空閑時(shí)皆為高電平?偩上數(shù)據(jù)傳送最高速率可達(dá)100KB/s。
圖3.1 I2C總線接口電氣結(jié)構(gòu) I2C總線上可以實(shí)現(xiàn)多主雙向同步數(shù)據(jù)傳送,所有主器件都可發(fā)出同步時(shí)鐘,但由于SCL接口的“線與”結(jié)構(gòu),一旦一個(gè)主器件時(shí)鐘跳變?yōu)榈碗娖剑瑢⑹筍CL線保持為低電平直至?xí)r鐘達(dá)到高電平,因此SCL線上時(shí)鐘低電平期間由各器件中時(shí)鐘最長(zhǎng)的低電平時(shí)間決定,而時(shí)鐘高電平時(shí)間則由高電平時(shí)間最短的器件決定。 為了使多個(gè)主機(jī)數(shù)據(jù)能夠正確傳送,I2C總線中帶有競(jìng)爭(zhēng)檢測(cè)和仲裁電路。總線競(jìng)爭(zhēng)的仲裁及處理由內(nèi)部硬件電路來(lái)完成。當(dāng)兩個(gè)主器件發(fā)送相同數(shù)據(jù)時(shí),不會(huì)出現(xiàn)總線競(jìng)爭(zhēng)。當(dāng)兩個(gè)主器件發(fā)送不同數(shù)據(jù)時(shí),才出現(xiàn)總線競(jìng)爭(zhēng)。其競(jìng)爭(zhēng)過(guò)程如圖3.2所示。當(dāng)某一時(shí)刻主器件1發(fā)送高電平,而主器件2發(fā)送低電平, 此時(shí)由于SDA的“線與”作用,主器件1發(fā)送的高電平在SDA線上反映的是主器件2的低電平狀態(tài),這個(gè)低電平狀態(tài)通過(guò)硬件系統(tǒng)反饋到數(shù)據(jù)寄存器中,與原有狀態(tài)比較,因不同而退出競(jìng)爭(zhēng)。 
圖3.2 總線競(jìng)爭(zhēng)過(guò)程 I2C總線可以構(gòu)成多主數(shù)據(jù)傳送系統(tǒng),但只有帶CPU的器件可以成為主器件。主器件發(fā)送時(shí)鐘、啟動(dòng)位、數(shù)據(jù)工作方式,從器件則接收時(shí)鐘及數(shù)據(jù)工作方式。接收或發(fā)送由數(shù)據(jù)的傳送方向決定。I2C總線上數(shù)據(jù)傳送時(shí)的啟動(dòng)、結(jié)束和有效狀態(tài)都由SDA、SCL的電平狀態(tài)決定,在I2C總線規(guī)程中啟動(dòng)和停止條件規(guī)定如下。 ①啟動(dòng)條件:在SCL為高電平時(shí),SDA出現(xiàn)一個(gè)下降沿,則啟動(dòng)I2C總線。 ②停止條件:在SCL為高電平時(shí),SDA 出現(xiàn)-一個(gè)上升沿,則停止使用I2C總線。 除了啟動(dòng)和停止?fàn)顟B(tài),在其余狀態(tài)下,SCL 的高電平都對(duì)應(yīng)于SDA的穩(wěn)定數(shù)據(jù)狀態(tài)。每一個(gè)被傳送的數(shù)據(jù)位由SDA線上的高、低電平表示,對(duì)于每一個(gè)被傳送的數(shù)據(jù)位都在SCL線上產(chǎn)生一個(gè)時(shí)鐘脈沖。時(shí)鐘脈沖在高電平期間時(shí),SDA線上的數(shù)據(jù)必須穩(wěn)定,否則將被認(rèn)為是控制信號(hào)。SDA只能在時(shí)鐘脈沖SCL為低電平期間時(shí)改變。 啟動(dòng)條件執(zhí)行后總線為“忙”,在結(jié)束信號(hào)過(guò)后的一定時(shí)間內(nèi)總線被認(rèn)為是“空閑”的。在啟動(dòng)和停止條件之間可傳送的數(shù)據(jù)不受限制,但每個(gè)字節(jié)必須為8位。首先傳送最高位,采用串行傳送方式,但在每個(gè)字節(jié)之后必須跟一個(gè)響應(yīng)位。主器件收/發(fā)每個(gè)字節(jié)后產(chǎn)生一個(gè)時(shí)鐘應(yīng)答脈沖,在這期間,發(fā)送器必須保證SDA為高,由接收器將SDA拉低,稱為應(yīng)答信號(hào)(ACK)。主器件為接收器時(shí),在接收了最后一個(gè)字節(jié)之后不發(fā)應(yīng)答信號(hào),也稱為非應(yīng)答信號(hào)(NOT ACK)。當(dāng)從器件不能再接收另外的字節(jié)時(shí),也會(huì)出現(xiàn)這種情況。I2C總線的數(shù)據(jù)傳送如圖3.3所示。 
圖3.3 I2C總線的數(shù)據(jù)傳送 3.2 24C02與AT89C52單片機(jī)接口的Proteus仿真電路3.2.1仿真電路如圖3.4所示為24C02與AT89C52單片機(jī)接口的Proteus仿真電路,給出一個(gè)采用普通AT89C52單片機(jī)模擬IC總線時(shí)序來(lái)擴(kuò)展串行外部EEPROM存儲(chǔ)器24C02。24C02 是一種I2C接口EEPROM器件,它具有256x8位的存儲(chǔ)容量,工作于從器件方式,每個(gè)字節(jié)可擦/寫(xiě)100萬(wàn)次,數(shù)據(jù)保存時(shí)間大于40年。寫(xiě)入時(shí)具有自動(dòng)擦除功能,還有頁(yè)寫(xiě)入功能,可一次寫(xiě)入16字節(jié)。24C02 芯片采用8腳DIP封裝,有Vcc、Vss 電源引腳,SCL、SDA通信引腳,A0、A1、A2地址引腳和WP寫(xiě)保護(hù)引腳。WP腳接Vcc時(shí),禁止寫(xiě)入高位地址(100H~1FFH), WP腳接Vss時(shí),允許寫(xiě)入任何地址。A1和A2決定芯片的從機(jī)地址,可接Vcc或Vss, A0不用,應(yīng)接Vcc或Vss。 
圖3.4 24C02C與AT89C52單片機(jī)接口電路的仿真電路圖
- ACK BIT 10H ;應(yīng)答標(biāo)志位
- SLA EQU 50H ;器件地址字
- SUBA EQU 51H ;器件子地址
- NUMBYTE EQU 52H ;讀/寫(xiě)字節(jié)數(shù)
- SDA BIT P1.7
- SCL BIT P1.6 ;單片機(jī)i/o口線定義
- MTD EQU 30H ;發(fā)送數(shù)據(jù)緩存區(qū)首地址(30H~3FH)
- MRD EQU 40H ;接收數(shù)據(jù)緩存區(qū)首地址(40H~4FH)
- ORG 0000H
- LJMP MAIN ;跳轉(zhuǎn)到主程序
- ORG 0030H
- ;***********************************************************
- ; IWRNBYTE子程序
- ; 功能:向器件指定子地址寫(xiě)n個(gè)數(shù)據(jù)
- ; 相關(guān)入口參數(shù):器件地址字SLA(代表哪個(gè)器件),子地址SUBA(代表數(shù)據(jù)要往哪放),發(fā)送區(qū)首地址 MTD,發(fā)送的字節(jié)數(shù)NUMBYTE
- ;***********************************************************
- IWRNBYTE: MOV R3,#NUMBYTE
- LCALL START ;啟動(dòng)總線
- MOV A ,#SLA
- LCALL WRBYTE ;發(fā)送器件地址(這一步是為了找到是哪個(gè)拓展)
- LCALL CACK ;當(dāng)ACK=1時(shí)說(shuō)明有應(yīng)答
- JNB ACK,RETWRN ;如果沒(méi)有應(yīng)答的話,直接退出
- MOV A, #SUBA ;把數(shù)據(jù)要放到哪給了寄存器A
- LCALL WRBYTE ;這一步是為了找到要放的地方(寄存器)
- LCALL CACK
- MOV R1,#MTD ;這一步事單片機(jī)要從哪個(gè)地方取數(shù)據(jù)
- WRDA: MOV A,@R1
- LCALL WRBYTE ;要把A里面的數(shù)據(jù)發(fā)送出去,就發(fā)送到剛剛找到的單元
- LCALL CACK
- JNB ACK,IWRNBYTE ;如果沒(méi)有應(yīng)答則需要重新來(lái)過(guò)
- INC R1 ;有應(yīng)答的話,則次數(shù)加1
- DJNZ R3,WRDA
- RETWRN: LCALL STOP
- RET
-
- ;****************************************************************
- ; IRDNBYTE子程序
- ; 功能:從器件指定子地址讀n個(gè)數(shù)據(jù)
- ; 相關(guān)入口參數(shù):器件地址字SLA(代表哪個(gè)器件),子地址SUBA(代表數(shù)據(jù)要往哪放),接收區(qū)首地址 MTD,接收的字節(jié)數(shù)NUMBYTE
- ;***************************************************************
- IRDNBYTE: MOV R3,#NUMBYTE
- LCALL START ;啟動(dòng)總線
- MOV A,#SLA
- LCALL WRBYTE ;發(fā)送器件地址(這一步是為了找到是哪個(gè)拓展)
- LCALL CACK ;當(dāng)ACK=1時(shí)說(shuō)明有應(yīng)答
- JNB ACK,RETRDN ;如果沒(méi)有應(yīng)答的話,直接退出
- MOV A,#SUBA ;把數(shù)據(jù)要放到哪給了寄存器A
- LCALL WRBYTE ;這一步是為了找到要放的地方(寄存器)
- LCALL CACK
- LCALL START ;重新啟動(dòng)總線
- MOV A,#SLA
- INC A
- LCALL WRBYTE
- LCALL CACK
- JNB ACK,IRDNBYTE
- MOV R0,#MRD ;這一步是單片機(jī)要從哪個(gè)地方取數(shù)據(jù)
- RON1: LCALL RDBYTE
- MOV @R0,A
- DJNZ R3,SACK
- LCALL MNACK ; 功能:發(fā)送非應(yīng)答信號(hào)子程序
- RETRDN: LCALL STOP
- RET
- SACK: LCALL MACK ; 功能:發(fā)送應(yīng)答信號(hào)子程序
- INC R1
- SJMP RON1
-
- ;***************************************************************
- ; 名稱:START子程序
- ; 功能:?jiǎn)?dòng)iic總線子程序,發(fā)送iic起始條件
- ;***************************************************************
- START: SETB SDA ;發(fā)送起始條件數(shù)據(jù)信號(hào)
- NOP ;起始條件建立時(shí)間大于4.7us
- SETB SCL ;發(fā)送起始條件的時(shí)鐘信號(hào)
- NOP
- NOP
- NOP
- NOP
- NOP ;起始條件鎖定時(shí)間大于4.7us
- CLR SDA ;發(fā)送起始信號(hào)
- NOP
- NOP
- NOP
- NOP
- NOP ;起始條件鎖定時(shí)間大于4.7us
- CLR SCL ;鉗住iic總線,準(zhǔn)備發(fā)送或者接收數(shù)據(jù)
- NOP
- RET
-
- ;****************************************************************
- ; 名稱:STOP子程序
- ; 功能:停止iic總線子程序,發(fā)送iic停止條件
- ;*****************************************************************
- STOP: CLR SDA ;發(fā)送停止條件的數(shù)據(jù)信號(hào)
- NOP ;起始條件建立時(shí)間大于4.7us
- SETB SCL ;發(fā)送停止條件的時(shí)鐘信號(hào)
- NOP
- NOP
- NOP
- NOP
- NOP ;時(shí)間大于4.7us
- SETB SDA ;發(fā)送停止信號(hào)
- NOP
- NOP
- NOP
- NOP
- NOP ;延遲時(shí)間大于4.7us
- NOP
- RET
-
- ;**************************************************************
- ; 名稱:WRBYTE子程序
- ; 功能:發(fā)送字節(jié)子程序,發(fā)送的前面必須是字節(jié)數(shù)據(jù)放入acc
- ; ★必須牢牢把握住,我們SDA不管是傳送高電平還是低電平,都必須是它先有了值,然后把時(shí)鐘線置位高電平,就開(kāi)始傳送
- ;**************************************************************
- WRBYTE:MOV R0,#08H
- WLP: RLC A ;取數(shù)據(jù)位
- JC WRI
- SJMP WRO ;判斷數(shù)據(jù)位
- WLP1: DJNZ R0,WLP
- NOP
- RET
- WRI: SETB SDA ;發(fā)送1
- NOP
- SETB SCL
- NOP
- NOP
- NOP
- NOP
- NOP ;延遲時(shí)間大于4.7us
- NOP
- CLR SCL
- SJMP WLP1
- WRO: CLR SDA ;發(fā)送0
- NOP
- SETB SCL
- NOP
- NOP
- NOP
- NOP
- NOP ;延遲時(shí)間大于4.7us
- NOP
- CLR SCL
- SJMP WLP1
- ;******************************************************************
- ; 名稱:RDBYTE子程序
- ; 功能:讀取字節(jié)子程序,讀出的字節(jié)數(shù)據(jù)放入acc
- ; ★這里需要記住的就是,SDA的高低電平就是咱要讀取的數(shù)據(jù)
- ;******************************************************************
- RDBYTE: MOV R0,#08H
- RLP: SETB SDA
- NOP
- SETB SCL ;時(shí)鐘線為高,接收數(shù)據(jù)位
- NOP
- NOP
- MOV C,SDA
- MOV A,R2
- CLR SCL ;將SCL拉低,時(shí)間大于4.7us
- RLC A
- MOV R2,A
- NOP
- NOP
- NOP
- DJNZ R0,RLP
- RET
-
- ;*****************************************************************
- ; 名稱:CACK子程序
- ; 功能:檢查應(yīng)答位子程序,返回值 ACK=1時(shí)表示有應(yīng)答
- ;★這里要注意的是,我們SCL上的時(shí)鐘信號(hào)是按照系統(tǒng)的自己的頻率有一個(gè)脈沖
- ;******************************************************************
- CACK: SETB SDA
- NOP
- NOP
- SETB SCL
- CLR ACK
- NOP
- NOP
- MOV C,SDA
- JC CEND
- SETB ACK ;判斷應(yīng)答位
- CEND: NOP
- CLR SCL
- NOP
- RET
- ;******************************************************************
- ; 名稱:MACK子程序
- ; 功能:發(fā)送應(yīng)答信號(hào)子程序
- ;******************************************************************
- MACK: CLR SDA ;將SDA置0
- NOP
- NOP
- SETB SCL
- NOP
- NOP
- NOP
- NOP
- NOP
- CLR SCL
- NOP
- NOP
- RET
-
- ;***************************************************************
- ; 名稱:MNACK子程序
- ; 功能:發(fā)送非應(yīng)答信號(hào)子程序
- ;***************************************************************
- MNACK: SETB SDA ;將SDA置1
- NOP
- NOP
- SETB SCL
- NOP
- NOP
- NOP
- NOP
- NOP
- CLR SCL
- NOP
- NOP
- RET
- ;************************************************************
- ; 名稱:主程序
- ;************************************************************
- MAIN: MOV R4,#0F0H ;延時(shí)等待其它芯片復(fù)位完成
- DJNZ R4,$
- ;發(fā)送數(shù)據(jù)緩存區(qū)初始化,將16個(gè)連續(xù)字節(jié)賦值為00H-0FH
- MOV A,#34H
- MOV R0,#30H
- S1: MOV @R0,A
- INC R0
- ;INC A
- CJNE R0,#40H,S1
- ;
- ;MOV R0,#32H
- ;MOV A,@R0
- ;MOV P3,A
- ;SJMP $
-
- ;向24C02C中寫(xiě)數(shù)據(jù),數(shù)據(jù)存放在24C02C中50H開(kāi)始的16個(gè)字節(jié)中
- MOV SLA,0A0H ;24C02C芯片地址
- MOV SUBA, 50H ;片內(nèi)地址
- MOV NUMBYTE ,16 ;傳送數(shù)據(jù)字節(jié)數(shù)
- LCALL IWRNBYTE ;寫(xiě)數(shù)據(jù)
-
- DELAY: MOV R5,#20
- D1: MOV R6,#248
- D2: MOV R7,#248
- DJNZ R7,$
- DJNZ R6,D2
- DJNZ R5,D1
- ;從24C02C中讀數(shù)據(jù),數(shù)據(jù)存放在單片機(jī)中50H開(kāi)始的16個(gè)字節(jié)中
- MOV SLA,0A0H ;24C02C芯片地址
- MOV SUBA, 50H ;片內(nèi)地址
- MOV NUMBYTE ,16 ;傳送數(shù)據(jù)字節(jié)數(shù)
- LCALL IRDNBYTE
- ;SJMP [ DISCUZ_CODE_9 ]nbsp;
- MOV R0,#50H
- MOV A,@R0
- MOV P2,A
- SJMP $
- END
復(fù)制代碼
仿真圖丟失了,大家自己畫(huà)一下吧.
Word格式文檔51黑附件下載:
單片機(jī)51hei設(shè)計(jì)。.0版.docx
(1.05 MB, 下載次數(shù): 9)
2021-7-20 15:58 上傳
點(diǎn)擊文件名下載附件
|