2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  目錄</b></p><p><b>  1 設(shè)計(jì)要求2</b></p><p><b>  2 設(shè)計(jì)目的2</b></p><p>  3 器件EEPROM的介紹3</p><p>  3.1 EEPROM簡介3</p>&

2、lt;p>  3.2 EEPROM24XX系列功能概述3</p><p>  4 IIC協(xié)議的介紹3</p><p>  4.1 IIC協(xié)議總線特征3</p><p>  4.2 IIC協(xié)議工作原理3</p><p>  4.3 IIC協(xié)議總線基本狀態(tài)4</p><p>  4.4 尋址約定5<

3、/p><p>  5 EEPROM讀寫功能實(shí)現(xiàn)5</p><p><b>  5.1寫操作5</b></p><p>  5.1.1 字節(jié)寫操作6</p><p>  5.1.2 頁寫入操作6</p><p>  5.2 確認(rèn)查詢7</p><p><b>

4、  5.3 讀操作7</b></p><p>  5.3.1 當(dāng)前地址的讀操作8</p><p>  5.3.2 隨機(jī)讀操作8</p><p>  5.3.3 連續(xù)讀操作9</p><p>  6 具體設(shè)計(jì)過程10</p><p>  6.1 程序流程設(shè)計(jì)10</p><p&

5、gt;  6.2執(zhí)行結(jié)果13</p><p>  6.3 系統(tǒng)組成模塊結(jié)構(gòu)及功能15</p><p>  6.3.1 函數(shù)定義15</p><p>  6.3.2 主函數(shù)設(shè)計(jì)17</p><p>  6.3.3 源程序19</p><p>  7 設(shè)計(jì)心得體會(huì)27</p><p>&

6、lt;b>  8 參考文獻(xiàn)28</b></p><p>  IIC總線式EEPROM存儲(chǔ)器應(yīng)用設(shè)計(jì)</p><p><b>  1 設(shè)計(jì)要求</b></p><p>  利用51單片機(jī)和IIC總線式EEPROM芯片24C02進(jìn)行存儲(chǔ)器設(shè)計(jì)。按下KEYWRITE1鍵,向24C02存儲(chǔ)器寫入數(shù)據(jù)1和2;按下KEYWRITE2鍵,

7、向24C02存儲(chǔ)器寫入數(shù)據(jù)3和4;按下KEYREAD鍵,從24C02存儲(chǔ)器讀出剛寫入的數(shù)據(jù)數(shù)據(jù);寫入數(shù)據(jù)顯示在左兩位,讀出數(shù)據(jù)顯示在右兩位。</p><p><b>  如圖1.1所示。</b></p><p>  圖1.1 系統(tǒng)仿真運(yùn)行圖</p><p><b>  2 設(shè)計(jì)目的</b></p><p

8、>  通過設(shè)計(jì),了解IIC協(xié)議的基本原理,并對(duì)EEPROM讀寫功能的實(shí)現(xiàn)有個(gè)系統(tǒng)的概念,對(duì)其實(shí)現(xiàn)過程比較清楚。同時(shí),在設(shè)計(jì)中,鞏固我們所學(xué)的理論知識(shí)。</p><p>  3 器件EEPROM的介紹</p><p>  3.1 EEPROM簡介</p><p>  EEPROM (Electrically Erasable Programmable Read-

9、Only Memory),電可擦可編程只讀存儲(chǔ)器--一種掉電后數(shù)據(jù)不丟失的存儲(chǔ)芯片。 EEPROM 可以在電腦上或?qū)S迷O(shè)備上擦除已有信息,重新編程。 EEPROM即電可擦寫可編程只讀存儲(chǔ)器,其可通過高于普通電壓的作用來擦除和重編程(重寫)。不像EPROM芯片,EEPROM不需從計(jì)算機(jī)中取出即可修改。在一個(gè)EEPROM中,當(dāng)計(jì)算機(jī)在使用的時(shí)候是可頻繁地重編程的,EEPROM的壽命是一個(gè)很重要的設(shè)計(jì)考慮參數(shù)。EEPROM的一種特殊形式是閃存

10、,其應(yīng)用通常是個(gè)人電腦中的電壓來擦寫和重編程。DRAM斷電后存在其中的數(shù)據(jù)會(huì)丟失,而EEPROM斷電后存在其中的數(shù)據(jù)不會(huì)丟失。 另外,EEPROM可以清除存儲(chǔ)數(shù)據(jù)和再編程。 </p><p>  3.2 EEPROM24XX系列功能概述</p><p>  1)每一個(gè)24XX 器件都支持雙向。</p><p>  2)線數(shù)據(jù)傳輸協(xié)議:如果器件被定義為發(fā)送器,則該器件

11、發(fā)送數(shù)據(jù)到總線;如果器件被定義為接收器,則該器件接收來自總線的數(shù)據(jù)??偩€由主器件控制, 24XX 作為從器件。主器件提供串行時(shí)鐘(SCL),控制總線訪問和產(chǎn)生起始和停止條件。主器件和從器件皆可作為發(fā)送器或接收器,但必須由主器件決定采取何種工作模式。</p><p>  4 IIC協(xié)議的介紹</p><p>  4.1 IIC協(xié)議總線特征</p><p><b&

12、gt;  總線協(xié)議定義如下:</b></p><p>  ? 只有在總線空閑時(shí)才可啟動(dòng)數(shù)據(jù)傳輸。</p><p>  ? 數(shù)據(jù)傳輸期間,在時(shí)鐘線為高電平時(shí),無論何時(shí),數(shù)據(jù)線都必須保持穩(wěn)定。在時(shí)鐘線為高電平時(shí)改變數(shù)據(jù)線將視為起始或停止條件。</p><p>  IIC總線最主要的優(yōu)點(diǎn)是其簡單性和有效性。由于接口直接在組件之上,因此I2C總線占用的空間非常小

13、,減少了電路板的空間和芯片管腳的數(shù)量,降低了互聯(lián)成本??偩€的長度可高達(dá)25英尺,并且能夠以10Kbps的最大傳輸速率支持40個(gè)組件。I2C總線的另一個(gè)優(yōu)點(diǎn)是,它支持多主控,其中任何能夠進(jìn)行發(fā)送和接收的設(shè)備都可以成為主總線。一個(gè)主控能夠控制信號(hào)的傳輸和時(shí)鐘頻率。當(dāng)然,在任何時(shí)間點(diǎn)上只能有一個(gè)主控。</p><p>  4.2 IIC協(xié)議工作原理 </p><p>  以啟動(dòng)信號(hào)ST

14、ART來掌管總線,以停止信號(hào)STOP來釋放總線;每次通訊以START開始,以STOP結(jié)束;啟動(dòng)信號(hào)START后緊接著發(fā)送一個(gè)地址字節(jié),其中7位為被控器件的地址碼,一位為讀/寫控制位R/W,R. /W位為0表示由主控向被控器件寫數(shù)據(jù),R/W為1表示由主控向被控器件讀數(shù)據(jù);當(dāng)被控器件檢測到收到的地址與自己的地址相同時(shí),在第9個(gè)時(shí)鐘期間反饋應(yīng)答信號(hào);每個(gè)數(shù)據(jù)字節(jié)在傳送時(shí)都是高位(MSB)在前。</p><p>  4.

15、3 IIC協(xié)議總線基本狀態(tài)</p><p><b>  1)總線空閑(A)</b></p><p>  數(shù)據(jù)線和時(shí)鐘線同時(shí)為高電平。</p><p>  2)啟動(dòng)數(shù)據(jù)傳輸(B)</p><p>  時(shí)鐘(SCL)為高電平時(shí),SDA 從高電平變?yōu)榈碗娖奖硎酒鹗紬l件產(chǎn)生。起始條件必須先于所有的命令產(chǎn)生。</p>

16、<p>  3)停止數(shù)據(jù)傳輸(C)</p><p>  時(shí)鐘(SCL)為高電平時(shí), SDA 從低電平變?yōu)楦唠娖奖硎就V箺l件產(chǎn)生。所有操作都必須以停止條件結(jié)束。</p><p>  4)數(shù)據(jù)傳送/數(shù)據(jù)有效 (D)</p><p>  數(shù)據(jù)線的狀態(tài)表明數(shù)據(jù)何時(shí)有效。在起始條件之后,數(shù)據(jù)線在時(shí)鐘處于高電平期間保持穩(wěn)定。必須在時(shí)鐘信號(hào)為低電平期間改變數(shù)據(jù)線。一個(gè)

17、數(shù)據(jù)位對(duì)應(yīng)一個(gè)時(shí)鐘脈沖。數(shù)據(jù)的每次傳輸以起始條件開始,以停止條件結(jié)束。在起始條件和停止條件之間傳輸?shù)臄?shù)據(jù)字節(jié)數(shù)目由主器件決定</p><p>  5)確認(rèn)信號(hào)(ACK)</p><p>  每一個(gè)被尋址的接收器在接收到每一字節(jié)數(shù)據(jù)后,應(yīng)發(fā)送一個(gè)確認(rèn)位。主器件必須提供一個(gè)額外的時(shí)鐘以傳輸確認(rèn)位。在確認(rèn)時(shí)鐘脈沖內(nèi),器件確認(rèn)須拉低 SDA 線。在確認(rèn)時(shí)鐘的高電平期間,SDA線以這種方式保持穩(wěn)定的

18、低電平。當(dāng)然,還必須考慮建立時(shí)間和保持時(shí)間。讀操作期間,主器件必須發(fā)送一個(gè)結(jié)束信號(hào)給從器件,而不是在從器件輸出最后一個(gè)數(shù)據(jù)字節(jié)之后產(chǎn)生一個(gè)確認(rèn)位。這種情況下,從器件(24XX)將釋放數(shù)據(jù)線為高電平,從而使主器件能夠產(chǎn)生停止條件。</p><p>  6)無應(yīng)答信號(hào)(NACK)</p><p>  在時(shí)鐘的第9個(gè)脈沖期間發(fā)送器釋放數(shù)據(jù)總線,接收器不拉低數(shù)據(jù)總線表示一個(gè) NACK,NACK有兩

19、種用途:a、一般表示接收器未成功接收數(shù)據(jù)字節(jié);b、當(dāng)接收器是主控器時(shí),它收到最后一個(gè)字節(jié)后,應(yīng)發(fā)送一個(gè)NACK信號(hào),以通知被控發(fā)送器結(jié)束數(shù)據(jù)發(fā)送,并釋放總線,以便主控接收器發(fā)送一個(gè)停止信號(hào)STOP。</p><p><b>  4.4 尋址約定</b></p><p>  1)不帶功能性地址輸入引腳的器件尋址</p><p>  在起始條件之后

20、,從主器件接收的第一個(gè)字節(jié)是控制字節(jié)。控制字節(jié)以4 位控制碼開始。對(duì)于24XX器件,這4 位設(shè)置為 ‘1010’以便進(jìn)行讀/寫操作。隨后的3 位為存儲(chǔ)塊選擇位 (B2、 B1、 B0)。主器件用它們來選擇將要訪問的大小為 256 字的存儲(chǔ)塊。實(shí)際上,這些位是字地址中3 個(gè)最高有效位??刂谱止?jié)的最后一位定義將要進(jìn)行的操作。 設(shè)置為‘1’,選擇讀操作;設(shè)置為‘0’,選擇寫操作。在起始條件發(fā)生后,24XX 器件始終監(jiān)視SDA 總線。一旦接收到

21、 ‘1010’碼、存儲(chǔ)塊選擇位和 R/W 位,從器件輸出確認(rèn)信號(hào)到 SDA 總線。在確認(rèn)信號(hào)之后傳輸?shù)刂纷止?jié)。</p><p>  2)帶功能性地址輸入引腳的器件尋址</p><p>  在起始條件之后,從主器件接收的第一個(gè)字節(jié)是控制字節(jié)??刂谱止?jié)以4 位控制碼開始。在24XX</p><p>  器件,這4 位設(shè)置為 ‘1010’以便進(jìn)行讀/寫操作。隨后的3 位

22、為片選位(A2、 A1、 A0)。片選位的不同組合允許在同一條總線上使用的24XX 器件達(dá)八個(gè),并用于選擇訪問哪一個(gè)器件??刂萍拇嫫髦械钠x位必須與相應(yīng)器件引腳A2、 A1 和 A0上的邏輯電平保持一致。實(shí)際上這些位是字地址中3 個(gè)最高有效位。起始條件發(fā)生之后,24XX 器件始終監(jiān)視SDA 總線。一旦接收到 ‘1010’碼、器件片選位和 R/W 位,從器件輸出確認(rèn)信號(hào)到 SDA 總線。在確認(rèn)信號(hào)之后傳輸?shù)刂纷止?jié)。</p>

23、<p>  5 EEPROM讀寫功能實(shí)現(xiàn)</p><p><b>  5.1寫操作</b></p><p><b>  寫數(shù)據(jù)過程:</b></p><p>  1)主控在檢測到總線空閑的狀況下,首先發(fā)送一個(gè)START信號(hào)掌管總線;</p><p>  2)發(fā)送一個(gè)控制字節(jié)(包括7位器件地

24、址碼和一位R/W);(某些器件的地址字節(jié)可能帶有其他功能)</p><p>  3)當(dāng)被控器件檢測到主控發(fā)送的地址與自己的地址相同時(shí)發(fā)送一個(gè)應(yīng)答信號(hào)(ACK);</p><p>  4)主控收到ACK后開始發(fā)送第一個(gè)數(shù)據(jù)字節(jié);</p><p>  5)被控器收到數(shù)據(jù)字節(jié)后發(fā)送一個(gè)ACK表示繼續(xù)傳送數(shù)據(jù),發(fā)送NACK表示傳送數(shù)據(jù)結(jié)束;</p><p

25、>  6)主控發(fā)送完全部數(shù)據(jù)后,發(fā)送一個(gè)停止位STOP,結(jié)束整個(gè)通訊并且釋放總線;寫數(shù)據(jù)時(shí)序。</p><p>  5.1.1 字節(jié)寫操作</p><p>  字節(jié)寫操作以來自于主器件的起始位開始, 4 位控制碼緊隨其后(圖3)。接下來的3 位是存儲(chǔ)塊尋址位(不帶地址輸入引腳的器件)或片選位(帶地址輸入引腳的器件)。然后主發(fā)送器將R/W 位(該位為邏輯低電平)發(fā)送到總線。從器件在第九

26、個(gè)時(shí)鐘周期產(chǎn)生一個(gè)確認(rèn)位,主器件發(fā)送的第二個(gè)字節(jié)是地址字節(jié)或高位地址字節(jié)。24XX 器件會(huì)對(duì)每一個(gè)地址字節(jié)作出確認(rèn),并把地址位鎖存進(jìn)器件內(nèi)部的地址計(jì)數(shù)器。對(duì)于24XX00 器件,只使用地址字節(jié)的低4 位。高4 位可為任意值。送出最后一個(gè)地址字節(jié)后, 24XX 器件發(fā)出確認(rèn)信號(hào)ACK。主器件在接收到該確認(rèn)信號(hào)后即發(fā)送數(shù)據(jù)字,該數(shù)據(jù)字將被寫入已尋址的存儲(chǔ)器位置。24XX 器件再次發(fā)出確認(rèn)信號(hào),之后主器件產(chǎn)生停止條件,啟動(dòng)內(nèi)部寫周期。如果在

27、WP 引腳保持高電平時(shí)進(jìn)行存儲(chǔ)器寫操作,器件會(huì)確認(rèn)命令,但不會(huì)啟動(dòng)寫周期,也不會(huì)寫入數(shù)據(jù),而會(huì)立即接受新的命令。寫命令為一個(gè)字節(jié),在發(fā)送寫命令后,內(nèi)部地址計(jì)數(shù)器增加,指向下一個(gè)要尋址的位置。寫周期期間, 24XX 不會(huì)對(duì)命令進(jìn)行確認(rèn)。</p><p> ?。ㄗⅲ簣D中控制字節(jié)指器件地址碼和讀寫控制位;地址字節(jié)指器件內(nèi)部的儲(chǔ)存器地址。下同。)</p><p>  5.1.2 頁寫入操作<

28、/p><p>  頁寫入操作時(shí),被控器件完成一個(gè)寫字節(jié)操作后內(nèi)部地址計(jì)數(shù)器自動(dòng)加一。寫控制字節(jié)、字地址字節(jié)和首個(gè)數(shù)據(jù)字節(jié)以和寫操作字節(jié)基本相同的方式發(fā)送給 24XX 器件(見圖5.1 )。不同的是,主器件發(fā)送的是多至一整頁的數(shù)據(jù)字節(jié)(1),而不是停止條件,這些數(shù)據(jù)字節(jié)臨時(shí)存儲(chǔ)在片內(nèi)頁緩沖器中。在主器件發(fā)送停止條件之后,這些數(shù)據(jù)將被寫入存儲(chǔ)器。每接收一個(gè)字,內(nèi)部地址計(jì)數(shù)器加一。如果在停止條件產(chǎn)生前,主器件有超出一頁的數(shù)

29、據(jù)要發(fā)送,地址計(jì)數(shù)器將會(huì)翻轉(zhuǎn),先前寫入的數(shù)據(jù)將被覆蓋。對(duì)于字節(jié)寫操作,一旦接收到停止條件,內(nèi)部寫周期開始。在寫周期期間, 24XX 器件不會(huì)對(duì)命令作出確認(rèn)。頁寫入操作在一頁內(nèi)可以寫入任意個(gè)數(shù)的數(shù)據(jù)(最多為一頁),并且可以在此頁中的任意地址開始寫入。被尋址的數(shù)據(jù)只能在該頁內(nèi)變動(dòng)。如果在 WP 引腳保持高電平時(shí)進(jìn)行存儲(chǔ)器寫操作,器件會(huì)確認(rèn)命令,但不會(huì)啟動(dòng)寫周期,也不會(huì)寫入數(shù)據(jù),而是立即接受新的命令。</p><p>

30、<b>  5.2 確認(rèn)查詢</b></p><p>  在寫周期期間器件不會(huì)對(duì)命令作出確認(rèn),這可用來確定寫周期何時(shí)完成(這個(gè)特點(diǎn)可以優(yōu)化總線的吞吐量,使其最大化) 。如果主器件已經(jīng)發(fā)出寫命令的停止條件,器件將啟動(dòng)內(nèi)部定時(shí)寫周期??梢噪S時(shí)進(jìn)行確認(rèn)查詢。這包括在主器件發(fā)出起始條件后,再發(fā)送用于寫命令(R/W = 0)的控制字節(jié)。如果器件仍處在寫周期內(nèi),則不返回確認(rèn)信號(hào)。一旦沒有返回確認(rèn)信號(hào),起

31、始位和控制字節(jié)必須重新發(fā)送。如果寫周期結(jié)束,器件返回確認(rèn)信號(hào),主器件就可以執(zhí)行下一個(gè)讀或?qū)懨?。參見流程圖( 圖 6.3)。</p><p><b>  5.3 讀操作</b></p><p><b>  讀數(shù)據(jù)過程:</b></p><p>  1)主控在檢測到總線空閑的狀況下,首先發(fā)送一個(gè)START信號(hào)掌管總線;2)

32、發(fā)送一個(gè)控制字節(jié)(包括7位器件地址碼和一位R/W);(某些器件的地址字節(jié)可能帶有其他功能)</p><p>  3)當(dāng)被控器件檢測到主控發(fā)送的地址與自己的地址相同時(shí)發(fā)送一個(gè)應(yīng)答信號(hào)(ACK);4)主控收到ACK后釋放數(shù)據(jù)總線,開始接收第一個(gè)數(shù)據(jù)字節(jié);5)主控收到數(shù)據(jù)后發(fā)送ACK表示繼續(xù)傳送數(shù)據(jù),發(fā)送NACK表示傳送數(shù)據(jù)結(jié)束;6)主控發(fā)送完全部數(shù)據(jù)后,發(fā)送一個(gè)停止位STOP,結(jié)束整個(gè)通訊并且釋放總線;<

33、/p><p>  除了控制寄存器的R/W 位設(shè)置為‘1’外,讀操作與寫操作基本相同。有三種基本的讀操作:當(dāng)前地址的讀操作、隨機(jī)讀操作和連續(xù)讀操作 。</p><p>  5.3.1 當(dāng)前地址的讀操作</p><p>  當(dāng)前地址的讀操作,被控器件內(nèi)部儲(chǔ)存器地址計(jì)數(shù)器保留最后一次訪問的地址。24XX 內(nèi)置一個(gè)自動(dòng)加‘1’地址計(jì)數(shù)器,該計(jì)數(shù)器保留最后一次訪問的地址。因此,如

34、果先前對(duì)地址‘n’(n 為任意合法地址)進(jìn)行讀或?qū)懖僮?,則下一條讀操作命令將可能從地址n+1 訪問數(shù)據(jù)。接收到R/W 位設(shè)置為‘1’的控制字節(jié)后,24XX 發(fā)出確認(rèn)信號(hào),并發(fā)送 8 位數(shù)據(jù)字節(jié)。主器件不會(huì)對(duì)數(shù)據(jù)傳輸作出確認(rèn),但會(huì)產(chǎn)生停止條件,24XX 即停止數(shù)據(jù)發(fā)送(圖5.3)</p><p>  5.3.2 隨機(jī)讀操作</p><p>  隨機(jī)讀操作允許主器件以隨機(jī)方式訪問任意存儲(chǔ)器,主

35、控器件先發(fā)寫命令,然后發(fā)要讀的地址,然后發(fā)讀命令。執(zhí)行該指令前必須先設(shè)置地址字節(jié)。作為寫操作的一部分,通過發(fā)送字節(jié)地址給24XX 來完成地址字節(jié)的設(shè)置(R/W 設(shè)置為‘0’)。字節(jié)地址發(fā)送完后,主器件一接收到確認(rèn)信號(hào)即產(chǎn)生起始條件。內(nèi)部地址計(jì)數(shù)器設(shè)置完之后寫操作即被終止。主器件再次發(fā)送控制字節(jié),而該字節(jié)中 R/W 位設(shè)置為‘1’。之后24XX 會(huì)發(fā)出確認(rèn)信號(hào), 并發(fā)送8 位數(shù)據(jù)字節(jié)。主器件不會(huì)對(duì)數(shù)據(jù)傳輸作出確認(rèn),但會(huì)產(chǎn)生停止條件, 24

36、XX 即停止數(shù)據(jù)發(fā)送(圖5.4)。在隨機(jī)讀取命令之后,內(nèi)部地址計(jì)數(shù)器加1 指向下一條地址。</p><p>  5.3.3 連續(xù)讀操作</p><p>  連續(xù)讀操作的起動(dòng)過程和隨機(jī)讀操作相同,只是在24XX發(fā)送完第一個(gè)數(shù)據(jù)字節(jié)后,主器件發(fā)出確認(rèn)信號(hào),而在隨機(jī)讀操作中發(fā)送的是停止條件,在連續(xù)讀操作時(shí)被控器件完成一個(gè)讀字節(jié)操作后內(nèi)部地址計(jì)數(shù)器自動(dòng)加一。確認(rèn)信號(hào)指示24XX 器件發(fā)送下一個(gè)連續(xù)

37、地址的數(shù)據(jù)字節(jié)(圖5.5)。在24器件向主器件發(fā)送完最后一個(gè)字節(jié)后,主器件不會(huì)產(chǎn)生確認(rèn)信號(hào),而是產(chǎn)生停止條件。為了可以進(jìn)行連續(xù)讀操作, 24XX 器件內(nèi)置了一個(gè)地址指針,在每次操作完成后該指針加1。地址指針允許一次操作連續(xù)讀取整個(gè)存儲(chǔ)器的內(nèi)容。在達(dá)到最后一個(gè)地址字節(jié)后,地址指針將翻轉(zhuǎn)到地址 0x00。</p><p><b>  6 具體設(shè)計(jì)過程</b></p><p&g

38、t;  6.1 程序流程設(shè)計(jì)</p><p><b>  6.2執(zhí)行結(jié)果</b></p><p> ?。?)按下KEYWRITE1鍵,向24C02存儲(chǔ)器寫入數(shù)據(jù)1和2.寫入成功讀出11;寫入失敗讀出00。寫入數(shù)據(jù)顯示在左兩位,讀出數(shù)據(jù)顯示在右兩位。</p><p>  寫入成功如圖6.4所示:</p><p>  圖6.

39、4寫入數(shù)據(jù)1,2成功,讀出11</p><p> ?。?)按下KEYWRITE2鍵,向24C02存儲(chǔ)器寫入數(shù)據(jù)3和4;寫入成功讀出11;寫入失敗讀出00。寫入數(shù)據(jù)顯示在左兩位,讀出數(shù)據(jù)顯示在右兩位。</p><p>  寫入成功如圖6.5:</p><p>  圖6.5 寫入數(shù)據(jù)3,4成功,讀出11</p><p>  (3)按下KEYREA

40、D鍵,從24C02存儲(chǔ)器讀出剛寫入的數(shù)據(jù)。</p><p>  成功讀取數(shù)據(jù)如圖6.6:</p><p>  圖6.6 讀出寫入的數(shù)據(jù)</p><p>  6.3 系統(tǒng)組成模塊結(jié)構(gòu)及功能</p><p>  6.3.1 函數(shù)定義</p><p>  函數(shù)定義是對(duì)各個(gè)基礎(chǔ)函數(shù)的定義,并且設(shè)置需要運(yùn)用的信息,便于調(diào)用<

41、;/p><p>  #include<reg51.h></p><p>  #include<intrins.h></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  sbit Key

42、Write1=P1^0;//按鍵定義</p><p>  sbit KeyWrite2=P1^1;</p><p>  sbit KeyRead=P1^2;</p><p>  #define WriteDeviceAddress 0xa0 //寫驅(qū)動(dòng)地址指令</p><p>  #define ReadDeviceAddress 0xa

43、1 //讀驅(qū)動(dòng)地址指令</p><p>  Start_Cond(); //寫開始信號(hào)</p><p>  Write8Bit(WriteDeviceAddress); //寫驅(qū)動(dòng)地址</p><p>  Write8Bit(Addr); //寫從EEPROM中讀的開始地址</p><p>  Start_Cond();

44、//寫開始信號(hào)</p><p>  Write8Bit(ReadDeviceAddress); //寫讀數(shù)據(jù)指令</p><p>  *nContent=Read8Bit(); //讀出內(nèi)容</p><p>  nContent++; //指針加1</p><p>  Ack(); //發(fā)確認(rèn)信號(hào)</p><

45、p>  *nContent=Read8Bit(); //讀一字節(jié) </p><p>  NoAck(); //沒有確認(rèn)信號(hào)</p><p>  Stop_Cond(); //發(fā)停止信號(hào)</p><p>  return(0); //返回</p><p>  Start_Cond(); //寫開始信號(hào)<

46、/p><p>  Write8Bit(WriteDeviceAddress); //寫驅(qū)動(dòng)地址</p><p>  Write8Bit(Addr); //寫從EEPROM中寫的開始地址 </p><p>  if(Addr%8==0) //每頁8字節(jié) //換頁</p><p>  Stop_Cond(); //發(fā)停止信號(hào)&

47、lt;/p><p>  uchar IICReadData[4];//AT24C02讀數(shù)據(jù)數(shù)組</p><p>  uchar IICWriteData[4];//AT24C02寫數(shù)據(jù)數(shù)組</p><p>  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();/

48、/1個(gè)機(jī)器周期=12個(gè)時(shí)鐘周期,fosc=12MHz時(shí),1個(gè)機(jī)器周期=1us</p><p>  Init_Flash(0); //將AT24C02的第0頁初始化為FF</p><p>  P2=0x1;// p2.0有效,選通數(shù)碼管左數(shù)第1位。</p><p>  P0=table[showdata[0]];//顯示數(shù)據(jù)</p><p&g

49、t;  P2=0x2;// p2.0有效,選通數(shù)碼管左數(shù)第2位。</p><p>  P0=table[showdata[1]];//顯示數(shù)據(jù)</p><p>  P2=0x4;// p2.0有效,選通數(shù)碼管左數(shù)第3位。</p><p>  P0=table[showdata[2]];//顯示數(shù)據(jù)</p><p>  P2=0x8;// p2

50、.3有效,選通數(shù)碼管左數(shù)第4位。</p><p>  P0=table[showdata[3]];//顯示數(shù)據(jù)</p><p>  if(KeyWrite1==0)//如果KeyWrite1鍵按下,則將'1'寫入2402的'0x80'地址中</p><p>  Write_Flash(IICWriteData,0,2); //將da

51、t數(shù)組中的數(shù)據(jù)寫入AT24C02中地址從0開始</p><p>  if(KeyWrite2==0)//如果KeyWrite2鍵按下,則將'2'寫入2402的'0x80'地址中</p><p>  Write_Flash(IICWriteData,2,2); //將dat數(shù)組中的數(shù)據(jù)寫入AT24C02中地址從2開始</p><p>

52、  if(KeyRead==0)//如果KeyRead鍵按下,讀出2402的'0x80'地址中的數(shù)據(jù)</p><p>  Read_Flash(IICReadData,0,4); //讀出AT24C02中從地址1開始依次往后16個(gè)字節(jié)放入dat數(shù)組中</p><p>  6.3.2 主函數(shù)設(shè)計(jì)</p><p>  主函數(shù)是程序的主流程,首先定義使用

53、到的常數(shù)、全局變量及函數(shù)原型說明,然后初始化圖形系統(tǒng),調(diào)用函數(shù) Write_One_Byte(char addr,char thedata) 完成字節(jié)寫入,調(diào)用Write_A_Page(char *buffer,char addr) 完成頁寫入,調(diào)用 Read_One_Byte(char addr) 完成隨機(jī)讀,調(diào)用Read_N_Bytes(char *buffer,char n,char addr) /*完成順序讀*/。</p&

54、gt;<p>  void main()</p><p><b>  {</b></p><p>  Init_Flash(0); //將AT24C02的第0頁初始化為FF</p><p><b>  while(1){</b></p><p>  P2=0x1;// p2.0有

55、效,選通數(shù)碼管左數(shù)第1位。</p><p>  P0=table[showdata[0]];//顯示數(shù)據(jù)</p><p>  delay_ms(10);</p><p>  P2=0x2;// p2.0有效,選通數(shù)碼管左數(shù)第2位。</p><p>  P0=table[showdata[1]];//顯示數(shù)據(jù)</p><p&

56、gt;  delay_ms(10);</p><p>  P2=0x4;// p2.0有效,選通數(shù)碼管左數(shù)第3位。</p><p>  P0=table[showdata[2]];//顯示數(shù)據(jù)</p><p>  delay_ms(10);</p><p>  P2=0x8;// p2.3有效,選通數(shù)碼管左數(shù)第4位。</p>&

57、lt;p>  P0=table[showdata[3]];//顯示數(shù)據(jù)</p><p>  delay_ms(10);</p><p>  if(KeyWrite1==0)//如果KeyWrite1鍵按下,則將'1'寫入2402的'0x80'地址中</p><p><b>  {</b></p>

58、<p><b>  EA=0;</b></p><p>  IICWriteData[0]=1;IICWriteData[1]=2;</p><p>  showdata[0]=IICWriteData[0];showdata[1]=IICWriteData[1];</p><p>  Write_Flash(IICWriteDa

59、ta,0,2); //將dat數(shù)組中的數(shù)據(jù)寫入AT24C02中地址從0開始</p><p>  Read_Flash(IICReadData,0,2);</p><p>  for(i=0;i<2;i++){if(IICWriteData[i]=IICReadData[i])showdata[i+2]=1;</p><p>  else showdata[i

60、+2]=0;</p><p><b>  }</b></p><p><b>  EA=1;</b></p><p><b>  }</b></p><p>  if(KeyWrite2==0)//如果KeyWrite2鍵按下,則將'2'寫入2402的'

61、0x80'地址中</p><p><b>  {</b></p><p><b>  EA=0;</b></p><p>  IICWriteData[0]=3;IICWriteData[1]=4;</p><p>  showdata[0]=IICWriteData[0];showdata

62、[1]=IICWriteData[1];</p><p>  Write_Flash(IICWriteData,2,2); //將dat數(shù)組中的數(shù)據(jù)寫入AT24C02中地址從2開始</p><p>  Read_Flash(IICReadData,2,2);</p><p>  for(i=0;i<2;i++){if(IICWriteData[i]==IIC

63、ReadData[i])showdata[i+2]=0;else showdata[i+2]=1;}</p><p><b>  EA=1;</b></p><p><b>  }</b></p><p>  if(KeyRead==0)//如果KeyRead鍵按下,讀出2402的'0x80'地址中的數(shù)據(jù)&

64、lt;/p><p><b>  {</b></p><p><b>  EA=0;</b></p><p>  Read_Flash(IICReadData,0,4); //讀出AT24C02中從地址1開始依次往后16個(gè)字節(jié)放入dat數(shù)組中</p><p>  for(i=0;i<4;i++)&

65、lt;/p><p>  {showdata[i]=IICReadData[i];}</p><p><b>  EA=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  6.3.3 源程序 &l

66、t;/p><p>  #include<reg51.h></p><p>  #include<intrins.h></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  sbit Ke

67、yWrite1=P1^0;//按鍵定義</p><p>  sbit KeyWrite2=P1^1;</p><p>  sbit KeyRead=P1^2;</p><p>  #define WriteDeviceAddress 0xa0 //寫驅(qū)動(dòng)地址指令</p><p>  #define ReadDeviceAddress 0x

68、a1 //讀驅(qū)動(dòng)地址指令</p><p>  sbit AT24C02_SCL =P3^2;</p><p>  sbit AT24C02_SDA =P3^4;</p><p>  /*-------------------------------------------------------------</p><p><b>

69、;  功能:發(fā)起始信號(hào)</b></p><p>  ------------------------------------------------------------*/</p><p>  void Start_Cond()</p><p><b>  {</b></p><p>  AT24C02_

70、SCL = 0;</p><p><b>  _nop_();</b></p><p>  AT24C02_SDA = 1;</p><p><b>  _nop_();</b></p><p>  AT24C02_SCL = 1;</p><p><b>  _n

71、op_();</b></p><p>  AT24C02_SDA = 0;</p><p><b>  _nop_();</b></p><p><b>  }</b></p><p>  /*-----------------------------------------------

72、--------------</p><p><b>  功能:發(fā)停止信號(hào)</b></p><p>  ------------------------------------------------------------*/</p><p>  void Stop_Cond()</p><p><b>  

73、{</b></p><p>  AT24C02_SCL = 0;</p><p><b>  _nop_();</b></p><p>  AT24C02_SDA = 0;</p><p><b>  _nop_();</b></p><p>  AT24C02_

74、SCL = 1;</p><p><b>  _nop_();</b></p><p>  AT24C02_SDA = 1;</p><p><b>  _nop_();</b></p><p><b>  }</b></p><p>  /*-----

75、--------------------------------------------------------</p><p><b>  功能:發(fā)確認(rèn)信號(hào)</b></p><p>  ------------------------------------------------------------*/</p><p>  void A

76、ck()</p><p><b>  {</b></p><p>  AT24C02_SCL = 0;</p><p><b>  _nop_();</b></p><p>  AT24C02_SDA = 0;</p><p>  AT24C02_SCL = 1;</p

77、><p><b>  _nop_();</b></p><p>  AT24C02_SCL = 0;</p><p><b>  _nop_();</b></p><p>  AT24C02_SDA = 1;</p><p><b>  }</b></

78、p><p>  /*-------------------------------------------------------------</p><p><b>  功能:發(fā)無確認(rèn)信號(hào)</b></p><p>  ------------------------------------------------------------*/<

79、;/p><p>  void NoAck()</p><p><b>  {</b></p><p>  AT24C02_SCL = 0;</p><p><b>  _nop_();</b></p><p>  AT24C02_SDA = 1;</p><p

80、><b>  _nop_();</b></p><p>  AT24C02_SCL = 1;</p><p><b>  _nop_();</b></p><p>  AT24C02_SCL = 0;</p><p><b>  _nop_();</b></p>

81、;<p><b>  }</b></p><p>  /*-------------------------------------------------------------</p><p>  功能:寫一個(gè)字節(jié)數(shù)據(jù)</p><p>  --------------------------------------------

82、----------------*/</p><p>  bit Write8Bit(unsigned char input)</p><p><b>  {</b></p><p>  unsigned char i;</p><p>  for (i=0;i<8;i++)</p><p>

83、;<b>  { </b></p><p>  AT24C02_SCL = 0;</p><p>  input <<= 1;</p><p>  AT24C02_SDA = CY;</p><p>  AT24C02_SCL = 1;</p><p><b>  }<

84、/b></p><p>  AT24C02_SCL = 0;</p><p><b>  _nop_();</b></p><p>  AT24C02_SDA = 1;</p><p>  AT24C02_SCL = 1;</p><p><b>  _nop_();</b&

85、gt;</p><p>  CY = AT24C02_SDA;</p><p>  return(CY) ;</p><p><b>  }</b></p><p>  /*-------------------------------------------------------------</p>&

86、lt;p>  功能:讀一個(gè)字節(jié)數(shù)據(jù)</p><p>  ------------------------------------------------------------*/</p><p>  unsigned char Read8Bit()</p><p><b>  {</b></p><p>  un

87、signed char temp,rbyte=0;</p><p>  for (temp = 8;temp != 0;temp--)</p><p><b>  {</b></p><p>  AT24C02_SCL = 0;</p><p><b>  _nop_();</b></p>

88、;<p>  rbyte = (rbyte << 1) | AT24C02_SDA;</p><p>  AT24C02_SCL = 1;</p><p><b>  _nop_();</b></p><p><b>  }</b></p><p>  return rby

89、te;</p><p><b>  }</b></p><p>  /*-------------------------------------------------------------</p><p>  功能:從EEPROM中給定一個(gè)地址連續(xù)讀NLEN個(gè)字節(jié)數(shù)據(jù)存放在以指針</p><p>  nConten

90、t開頭的往下內(nèi)容。</p><p>  ------------------------------------------------------------*/</p><p>  bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen )</p><p>

91、;<b>  {</b></p><p>  unsigned char Addr;</p><p>  Addr = nAddr;</p><p>  Start_Cond(); //寫開始信號(hào)</p><p>  Write8Bit(WriteDeviceAddress); //寫驅(qū)動(dòng)地址</p>

92、<p>  Write8Bit(Addr); //寫從EEPROM中讀的開始地址</p><p>  Start_Cond(); //寫開始信號(hào)</p><p>  Write8Bit(ReadDeviceAddress); //寫讀數(shù)據(jù)指令</p><p>  while(--nLen)</p><p><b

93、>  {</b></p><p>  *nContent=Read8Bit(); //讀出內(nèi)容</p><p>  nContent++; //指針加1</p><p>  Ack(); //發(fā)確認(rèn)信號(hào)</p><p><b>  }</b></p><p>  *n

94、Content=Read8Bit(); //讀一字節(jié) </p><p>  NoAck(); //沒有確認(rèn)信號(hào)</p><p>  Stop_Cond(); //發(fā)停止信號(hào)</p><p>  return(0); //返回</p><p><b>  }</b></p><p&

95、gt;  /*-------------------------------------------------------------</p><p>  功能:初始化EEPROM子程序內(nèi)容為FF</p><p>  ------------------------------------------------------------*/</p><p>  b

96、it Init_Flash ( unsigned int nPage ) // 8 Byte/1Page init 0xFF </p><p><b>  {</b></p><p>  unsigned char nLen;</p><p>  unsigned char Addr;</p><p><b&

97、gt;  nLen=8;</b></p><p>  Addr=8 *nPage;</p><p>  Start_Cond();</p><p>  Write8Bit(WriteDeviceAddress);</p><p>  Write8Bit(Addr);</p><p>  for(;nLen!

98、=0;nLen--)</p><p><b>  {</b></p><p>  if(Write8Bit(0xff)) break; //if Write8Bit() Return 1 Write Flase</p><p><b>  }</b></p><p>  Stop_Cond();&

99、lt;/p><p>  return(CY);</p><p><b>  }</b></p><p>  /*-------------------------------------------------------------</p><p>  功能:從EEPROM中給定一個(gè)地址連續(xù)寫NLEN個(gè)字節(jié)數(shù)據(jù)存放在以指針

100、</p><p>  nContent開頭的往下內(nèi)容。</p><p>  ------------------------------------------------------------*/</p><p>  bit Write_Flash ( unsigned char *nContent, unsigned char nAddr,unsigned c

101、har nLen)</p><p><b>  {</b></p><p>  unsigned char i,temp;</p><p>  unsigned char Addr;</p><p>  Addr = nAddr;</p><p>  Start_Cond(); //寫開始

102、信號(hào)</p><p>  Write8Bit(WriteDeviceAddress); //寫驅(qū)動(dòng)地址</p><p>  Write8Bit(Addr); //寫從EEPROM中寫的開始地址 </p><p>  for(i = 0;i < nLen;i++)</p><p><b>  {</b>&l

103、t;/p><p>  if(Addr%8==0) //每頁8字節(jié) //換頁</p><p><b>  {</b></p><p>  Stop_Cond();</p><p><b>  _nop_();</b></p><p>  Start_Cond();</p

104、><p>  Write8Bit(WriteDeviceAddress);</p><p>  Write8Bit(Addr);</p><p><b>  }</b></p><p>  temp = *nContent;</p><p>  if(Write8Bit(temp)) break;

105、//CY</p><p>  nContent++;</p><p><b>  Addr++;</b></p><p><b>  }</b></p><p>  Stop_Cond(); //發(fā)停止信號(hào)</p><p>  return(CY);</p>

106、;<p><b>  }</b></p><p>  //共陰極數(shù)碼管真值表"0" "2" "3" "4" "5" "6" "7" "8" "9" "a" "b"

107、; "c" "d" "e" "f"</p><p>  uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};</p><p>  uchar IICRe

108、adData[4];//AT24C02讀數(shù)據(jù)數(shù)組</p><p>  uchar IICWriteData[4];//AT24C02寫數(shù)據(jù)數(shù)組</p><p>  uchar showdata[4];</p><p>  uchar i=0,j=0;</p><p>  void delay_ms(uchar n)</p>&l

109、t;p><b>  {</b></p><p>  uchar i,j;</p><p>  for(j=n;j>0;j--)</p><p><b>  {</b></p><p>  for(i=100;i>0;i--)</p><p><b>

110、;  {</b></p><p>  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//1個(gè)機(jī)器周期=12個(gè)時(shí)鐘周期,fosc=12MHz時(shí),1個(gè)機(jī)器周期=1us</p><p><b>  }</b></p><p>

111、<b>  }</b></p><p><b>  }</b></p><p>  void main(void)</p><p><b>  {</b></p><p>  Init_Flash(0); //將AT24C02的第0頁初始化為FF</p>&

112、lt;p><b>  while(1){</b></p><p>  P2=0x1;// p2.0有效,選通數(shù)碼管左數(shù)第1位。</p><p>  P0=table[showdata[0]];//顯示數(shù)據(jù)</p><p>  delay_ms(10);</p><p>  P2=0x2;// p2.0有效,選通數(shù)碼

113、管左數(shù)第2位。</p><p>  P0=table[showdata[1]];//顯示數(shù)據(jù)</p><p>  delay_ms(10);</p><p>  P2=0x4;// p2.0有效,選通數(shù)碼管左數(shù)第3位。</p><p>  P0=table[showdata[2]];//顯示數(shù)據(jù)</p><p>  d

114、elay_ms(10);</p><p>  P2=0x8;// p2.3有效,選通數(shù)碼管左數(shù)第4位。</p><p>  P0=table[showdata[3]];//顯示數(shù)據(jù)</p><p>  delay_ms(10);</p><p>  if(KeyWrite1==0)//如果KeyWrite1鍵按下,則將'1'寫

115、入2402的'0x80'地址中</p><p><b>  {</b></p><p><b>  EA=0;</b></p><p>  IICWriteData[0]=1;IICWriteData[1]=2;</p><p>  showdata[0]=IICWriteData[

116、0];showdata[1]=IICWriteData[1];</p><p>  Write_Flash(IICWriteData,0,2); //將dat數(shù)組中的數(shù)據(jù)寫入AT24C02中地址從0開始</p><p>  Read_Flash(IICReadData,0,2);</p><p>  for(i=0;i<2;i++){if(IICWriteD

117、ata[i]=IICReadData[i])showdata[i+2]=1;else showdata[i+2]=0;}</p><p><b>  EA=1;</b></p><p><b>  }</b></p><p>  if(KeyWrite2==0)//如果KeyWrite2鍵按下,則將'2'寫

118、入2402的'0x80'地址中</p><p><b>  {</b></p><p><b>  EA=0;</b></p><p>  IICWriteData[0]=3;IICWriteData[1]=4;</p><p>  showdata[0]=IICWriteData[

119、0];showdata[1]=IICWriteData[1];</p><p>  Write_Flash(IICWriteData,2,2); //將dat數(shù)組中的數(shù)據(jù)寫入AT24C02中地址從2開始</p><p>  Read_Flash(IICReadData,2,2);</p><p>  for(i=0;i<2;i++){if(IICWriteD

120、ata[i]==IICReadData[i])showdata[i+2]=0;else showdata[i+2]=1;}</p><p><b>  EA=1;</b></p><p><b>  }</b></p><p>  if(KeyRead==0)//如果KeyRead鍵按下,讀出2402的'0x80&

121、#39;地址中的數(shù)據(jù)</p><p><b>  {</b></p><p><b>  EA=0;</b></p><p>  Read_Flash(IICReadData,0,4); //讀出AT24C02中從地址1開始依次往后16個(gè)字節(jié)放入dat數(shù)組中</p><p>  for(i=0;i

122、<4;i++)</p><p>  {showdata[i]=IICReadData[i];}</p><p><b>  EA=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><

123、b>  }</b></p><p>  7 設(shè)計(jì)心得體會(huì) </p><p>  對(duì)于這次課程設(shè)計(jì),我的感受很深,并且也收獲挺多的。</p><p>  在這次課程設(shè)計(jì)中,我基本上完成了本次設(shè)計(jì)的任務(wù),使我學(xué)到了課本之外的東西,同時(shí)也讓我明白了,任何人在搞課程設(shè)計(jì)前,對(duì)自己搞的東西都不可能很懂,但是通過自己查資料,能一步一步弄懂的,在這其中得到的喜

124、悅也是不言而喻的。時(shí)間雖然很緊張,但是利用有限的時(shí)間完成課程設(shè)計(jì),我心里無比的欣慰。</p><p><b>  8 參考文獻(xiàn)</b></p><p>  1.何立民.IIC總線應(yīng)用系統(tǒng)設(shè)計(jì).北京:北京航空航天大學(xué)出版社</p><p>  2.譚浩強(qiáng).C語言程序設(shè)計(jì)(第三版) .北京:清華大學(xué)出版社</p><p> 

溫馨提示

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

評(píng)論

0/150

提交評(píng)論