單片機(jī)小系統(tǒng)及片外擴(kuò)展_第1頁
單片機(jī)小系統(tǒng)及片外擴(kuò)展_第2頁
單片機(jī)小系統(tǒng)及片外擴(kuò)展_第3頁
單片機(jī)小系統(tǒng)及片外擴(kuò)展_第4頁
單片機(jī)小系統(tǒng)及片外擴(kuò)展_第5頁
已閱讀5頁,還剩136頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

單片機(jī)小系統(tǒng)及片外擴(kuò)展第一頁,共一百四十一頁,編輯于2023年,星期日8.1串行擴(kuò)展總線接口技術(shù)89C51除芯片自身具有UART可用于串行擴(kuò)展I/O口線以外,還可利用89C51的3~4根I/O口線進(jìn)行SPI或I2C的外設(shè)芯片擴(kuò)展,以及單總線的擴(kuò)展。串行擴(kuò)展總線技術(shù)是新一代單片機(jī)技術(shù)發(fā)展的一個顯著特點(diǎn)。與并行擴(kuò)展總線相比,串行擴(kuò)展總線有電路結(jié)構(gòu)簡單,程序編寫方便,易于實(shí)現(xiàn)用戶系統(tǒng)軟硬件的模塊化、標(biāo)準(zhǔn)化等優(yōu)點(diǎn)。第二頁,共一百四十一頁,編輯于2023年,星期日8.1.1SPI串行外設(shè)接口總線SPI(SerialPeripheralInterface——SPI總線是Motorola公司提出的一種同步串行外設(shè)接口。允許MCU與各種外圍設(shè)備以同步串行方式進(jìn)行通信。其外圍設(shè)備種類繁多,從最簡單的TTL移位寄存器到復(fù)雜的LCD顯示驅(qū)動器、網(wǎng)絡(luò)控制器等,可謂應(yīng)有盡有。

第三頁,共一百四十一頁,編輯于2023年,星期日SPI系統(tǒng)可直接與各個廠家生產(chǎn)的多種標(biāo)準(zhǔn)外圍器件直接接口,它只需4條線:串行時鐘線(SCK)、主機(jī)輸入/從機(jī)輸出數(shù)據(jù)線MISO、主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI和低電平有效的從機(jī)選擇線CS(SS)。在SPI接口中,數(shù)據(jù)的傳輸只需要1個時鐘信號和2條數(shù)據(jù)線。第四頁,共一百四十一頁,編輯于2023年,星期日由于SPI系統(tǒng)總線只需3~4位數(shù)據(jù)線和控制線即可擴(kuò)展具有SPI的各種I/O器件,而并行總線擴(kuò)展方法需8根數(shù)據(jù)線、8~16位地址線、2~3位控制線,因而SPI總線的使用可以簡化電路設(shè)計,省掉了很多常規(guī)電路中的接口器件,提高了設(shè)計的可靠性。第五頁,共一百四十一頁,編輯于2023年,星期日SPI總線的特點(diǎn):(串行外圍設(shè)備接口:serialperipheralinterface)一般使用4條線 串行時鐘線(SCK) 主機(jī)輸入/從機(jī)輸出數(shù)據(jù)線MISO 主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI 低電平有效的從機(jī)選擇線SS第六頁,共一百四十一頁,編輯于2023年,星期日1.SPI總線系統(tǒng)的組成圖8-1是SPI總線系統(tǒng)典型結(jié)構(gòu)示意圖。圖8-1SPI外圍擴(kuò)展示意圖第七頁,共一百四十一頁,編輯于2023年,星期日單片機(jī)與外圍擴(kuò)展器件在時鐘線SCK、數(shù)據(jù)線MOSI和MISO上都是同名端相連。帶SPI接口的外圍器件都有片選端CS。在擴(kuò)展多個SPI外圍器件(如圖8-1所示)時,單片機(jī)應(yīng)分別通過I/O口線來分時選通外圍器件。第八頁,共一百四十一頁,編輯于2023年,星期日SPI有較高的數(shù)據(jù)傳送速度,主機(jī)方式最高速率可達(dá)1.05Mb/s,目前不少外圍器件都帶有SPI接口。在大多數(shù)應(yīng)用場合中,使用1個MCU作為主機(jī),控制數(shù)據(jù)向1個或多個從外圍器件的傳送。從器件只能在主機(jī)發(fā)命令時,才能接收或向主機(jī)傳送數(shù)據(jù)。其數(shù)據(jù)的傳輸格式是高位(MSB)在前,低位(LSB)在后。第九頁,共一百四十一頁,編輯于2023年,星期日當(dāng)SPI工作時,在移位寄存器中的數(shù)據(jù)逐位從輸出引腳(MOSI)輸出(高位在前),同時從輸入引腳(MISO)接收的數(shù)據(jù)逐位移到移位寄存器(高位在前)。發(fā)送一字節(jié)后,從另一個外圍器件接收的字節(jié)數(shù)據(jù)進(jìn)入移位寄存器中。主SPI的時鐘信號(SCK)使傳輸同步。第十頁,共一百四十一頁,編輯于2023年,星期日SPI總線有以下主要特性:全雙工、3線同步傳輸;主機(jī)或從機(jī)工作;提供頻率可編程時鐘;發(fā)送結(jié)束中斷標(biāo)志;寫沖突保護(hù);總線競爭保護(hù)等。其典型時序圖如圖8-2所示。圖8-2SPI串行總線典型時序圖第十一頁,共一百四十一頁,編輯于2023年,星期日2.89C51單片機(jī)串行擴(kuò)展SPI外設(shè)接口的方法1)用一般I/O口線模擬SPI操作對于沒有SPI接口的89C51來說,可使用軟件來模擬SPI的操作,包括串行時鐘、數(shù)據(jù)輸入和輸出。對于不同的串行接口外圍芯片,它們的時鐘時序是不同的。對于在SCK的上升沿輸入(接收)數(shù)據(jù)和在下降沿輸出(發(fā)送)數(shù)據(jù)的器件,一般應(yīng)取圖8-3中的串行時鐘輸出P1.1的初始狀態(tài)為1;在允許接口芯片后,置P1.1為0。第十二頁,共一百四十一頁,編輯于2023年,星期日因此,MCU輸出1位SCK時鐘,同時,使接口芯片串行左移,從而輸出1位數(shù)據(jù)至89C51的P1.3(模擬MCU的MISO線);再置P1.1為1,使89C51從P1.0輸出1位數(shù)據(jù)(先為高位)至串行接口芯片。至此,模擬1位數(shù)據(jù)輸入/輸出完成。以后再置P1.1為0,模擬下一位的輸入/輸出……依次循環(huán)8次,可完成1次通過SPI傳輸1字節(jié)的操作。對于在SCK的下降沿輸入數(shù)據(jù)和上升沿輸出數(shù)據(jù)的器件,則應(yīng)取串行時鐘輸出的初始狀態(tài)為0,在接口芯片允許時,先置P1.1為1,此時,外圍接口芯片輸出1位數(shù)據(jù)(MCU接收1位數(shù)據(jù));再置時鐘為0,外圍接口芯片接收1位數(shù)據(jù)(MCU發(fā)送1位數(shù)據(jù)),可完成1位數(shù)據(jù)的傳送。第十三頁,共一百四十一頁,編輯于2023年,星期日圖8-3為89C51(MCU)與MCM2814(E2PROM)的硬件連接圖。圖8-3SPI總線接口原理圖第十四頁,共一百四十一頁,編輯于2023年,星期日圖8-3中,P1.0模擬MCU的數(shù)據(jù)輸出端(MOSI),P1.1模擬SPI的SCK輸出端,P1.2模擬SPI的從機(jī)選擇端,P1.3模擬SPI的數(shù)據(jù)輸入端(MISO)。下面介紹用89C51匯編語言模擬SPI串行輸入、串行輸出和串行輸入/輸出3個子程序。這些子程序也適用于在串行時鐘的上升沿輸入和下降沿輸出的各種串行外圍接口芯片,如8位或10位A/D芯片,74LS系列輸出芯片等。對于下降沿輸入、上升沿輸出的各種串行外圍接口芯片,只須改變P1.1的輸出順序,即輸出0,再輸入1;再輸出0……則這些子程序也同樣適用。第十五頁,共一百四十一頁,編輯于2023年,星期日(1)MCU串行輸入子程序SPIIN從MCM2814的SPISO線上接收1字節(jié)數(shù)據(jù)并放入寄存器R0中。SPIIN: SETB P1.1;使P1.1(時鐘)輸出為1 CLR P1.2;選擇從機(jī) MOV R1,#08H;置循環(huán)次數(shù)SPIN1: CLR P1.1;使P1.1(時鐘)輸出為0 NOP;延時 NOP MOV C,P1.3;從機(jī)輸出SPISO送進(jìn)位C RLC A;左移至累加器ACC SETB P1.0;使P1.0(時鐘)輸出為1 DJNZ R1,SPIN1;判斷是否循環(huán)8次(1字節(jié)數(shù)據(jù)) MOV R0,A;1字節(jié)數(shù)據(jù)送R0 RET;返回第十六頁,共一百四十一頁,編輯于2023年,星期日(2)MCU串行輸出子程序SPIOUT將89C51中R0寄存器的內(nèi)容傳送到MCM2814的SPISI線上。SPIOUN: SETB P1.1;使P1.1(時鐘)輸出為1 CLR P1.2;選擇從機(jī) MOV R1,#08H;置循環(huán)次數(shù) MOV A,R0;1字節(jié)數(shù)據(jù)送累加器ACCSPIOT1: CLR P1.1;使P1.1(時鐘)輸出為0 NOP;延時 NOP RLC A;左移至累加器ACC最高位至C MOV P1.0,C;進(jìn)位C送從機(jī)輸入SPISI線上 SETB P1.1;使P1.1(時鐘)輸出為1 DJNZ R1,SPIOT1;判斷是否循環(huán)8次(1字節(jié)數(shù)據(jù)) RET;返回第十七頁,共一百四十一頁,編輯于2023年,星期日(3)MCU串行輸入/輸出子程序SPIIO將89C51中R0寄存器的內(nèi)容傳送到MCM2814的SPISI中,同時從MCM2814的SPISO接收1字節(jié)數(shù)據(jù)存入R0中。SPIIO: SETB P1.1;使P1.1(時鐘)輸出為1 CLR P1,2;選擇從機(jī) MOV R1,#08H;置循環(huán)次數(shù) MOV A,R0;1字節(jié)數(shù)據(jù)送累加器ACCSPIO1: CLR P1.1;使P1.1(時鐘)輸出為0 NOP;延時 NOP MOV C,P1.3;從機(jī)輸出SPISO送進(jìn)位C RLC A;左移至累加器ACC最高位至C MOV P1.0,C;進(jìn)位C送從機(jī)輸入 SETB P1.1;使P1.1(時鐘)輸出為1 DJNZ R1,SPIO1;判斷是否循環(huán)8次(1字節(jié)數(shù)據(jù)) MOV R0,A RET;返回第十八頁,共一百四十一頁,編輯于2023年,星期日2)利用89C51串行口實(shí)現(xiàn)SPI操作單片機(jī)應(yīng)用系統(tǒng)中,最常用的功能無非是開關(guān)量I/O、A/D、D/A、時鐘、顯示及打印功能等等。下面分析利用單片機(jī)串口與多個串行I/O接口芯片進(jìn)行接口的可行性。第十九頁,共一百四十一頁,編輯于2023年,星期日(1)串行時鐘芯片在有些需要絕對時間的場合,例如打印記錄、電話計費(fèi)、監(jiān)控系統(tǒng)中的運(yùn)行及故障時間統(tǒng)計等,都需要以年、月、日、時、分、秒等表示的絕對時間。雖然單片機(jī)內(nèi)部的定時器可以通過軟件進(jìn)位計數(shù)產(chǎn)生絕對時鐘,但由于掉電之后數(shù)據(jù)丟失,修改麻煩等原因,這樣產(chǎn)生的絕對時鐘總使設(shè)計者感到不滿意。因此我們提倡對絕對時鐘要求較高的場合使用外部時鐘芯片,串行時鐘芯片HT1380就是一個典型的器件。第二十頁,共一百四十一頁,編輯于2023年,星期日HT1380是一個8腳的日歷時鐘芯片,它可以通過串行口與單片機(jī)交換信息,如圖8-4所示。在該芯片中,X1、X2接晶振,SCLK作為時鐘輸入端,I/O端為串行數(shù)據(jù)輸入、輸出端口,RST是復(fù)位引腳。由于該芯片只有當(dāng)RST為高時才能對時鐘芯片進(jìn)行讀/寫操作,因此可以利用單片機(jī)的I/O口線對它進(jìn)行控制(類似于芯片選擇信號)。當(dāng)RST為低時,I/O引腳對外是高阻狀態(tài),因此它允許多個串行芯片同時掛靠在串行端口上。CPU對它的輸入/輸出操作可以按串行的方式0(即擴(kuò)展I/O方式)進(jìn)行。第二十一頁,共一百四十一頁,編輯于2023年,星期日圖8-4HT1380與單片機(jī)接口電路第二十二頁,共一百四十一頁,編輯于2023年,星期日(2)串行LED顯示接口MAX7219該芯片可驅(qū)動8個LED顯示器,這在智能儀表中已經(jīng)足夠了。89C51單片機(jī)與它的接口如圖8-5所示。同樣,單片機(jī)可以通過串行口以方式0與MAX7219交換信息,TXD作為移位時鐘、RXD作為串行數(shù)據(jù)I/O端、Load為芯片選擇端。當(dāng)Load位于低電平時,對它進(jìn)行讀/寫操作;當(dāng)Load為高電平時,DIN處于高阻狀態(tài)。它同樣允許多個串行接口芯片共同使用89C51的串行口。第二十三頁,共一百四十一頁,編輯于2023年,星期日圖8-5MAX7219與單片機(jī)接口電路第二十四頁,共一百四十一頁,編輯于2023年,星期日(3)串行模擬量輸入芯片MAX1458MAX1458是一個可對差分輸入信號(如電橋)進(jìn)行程控放大(放大倍數(shù)可以由軟件設(shè)定),并進(jìn)行12位A/D轉(zhuǎn)換的芯片。它將放大與轉(zhuǎn)換電路集成在一個芯片上,圖8-6給出了它與單片機(jī)的串行接口電路。圖8-6串行A/D芯片與單片機(jī)接口電路第二十五頁,共一百四十一頁,編輯于2023年,星期日它既可把轉(zhuǎn)換好的數(shù)據(jù)通過串口送到CPU,同時也可將轉(zhuǎn)換前的模擬信號輸出到顯示儀表。當(dāng)CS為高電平時,可對MAX1458進(jìn)行讀/寫,單片機(jī)對它的讀/寫也是以串口方式0進(jìn)行的;當(dāng)CS為低電平時,DIO對外處于高阻狀態(tài)。第二十六頁,共一百四十一頁,編輯于2023年,星期日(4)串行接口芯片的一般接口規(guī)律除上面3種芯片之外,單片機(jī)還可以通過串行接口芯片與E2PROM、D/A轉(zhuǎn)換芯片等連接。它們與CPU的串行接口方式與以上幾種芯片類似,即:都需要通過單片機(jī)的開關(guān)量I/O口線進(jìn)行芯片選擇;當(dāng)芯片未選中時,數(shù)據(jù)端口均處于高阻狀態(tài);與單片機(jī)交換信息時均要求單片機(jī)串行口以方式0進(jìn)行;傳輸數(shù)據(jù)時的幀格式均要求先傳送命令/地址,再傳送數(shù)據(jù);大都具有圖8-7所示的時序波形。第二十七頁,共一百四十一頁,編輯于2023年,星期日圖8-7串行接口信號的一般時序圖第二十八頁,共一百四十一頁,編輯于2023年,星期日(5)擴(kuò)展多個串行接口芯片的典型控制器的結(jié)構(gòu)在圖8-8所示的控制器電路中,數(shù)據(jù)采集均由串行接口芯片完成。由于無總線擴(kuò)展,單片機(jī)節(jié)余出來的其他資源可以作為打印機(jī)輸出控制、功能鍵、中斷邏輯等電路。在擴(kuò)展了系統(tǒng)功能的同時,極大地利用了系統(tǒng)資源,且使接口簡單,控制器體積減小,可靠性提高。系統(tǒng)的軟件設(shè)計與常規(guī)的單片機(jī)擴(kuò)展系統(tǒng)類似,只是在芯片選擇方面不是通過地址線完成,而是通過I/O口線來實(shí)現(xiàn)。第二十九頁,共一百四十一頁,編輯于2023年,星期日圖8-8基于串行接口控制器的電路結(jié)構(gòu)圖第三十頁,共一百四十一頁,編輯于2023年,星期日8.1.2I2C總線I2C(InterIntegratedCircuit)常譯為內(nèi)部集成電路總線,或集成電路間總線,它是由Philips公司推出的芯片間串行傳輸總線。使用2線實(shí)現(xiàn)數(shù)據(jù)通信。 1根串行數(shù)據(jù)線(SDA) 1根串行時鐘線(SCL)。第三十一頁,共一百四十一頁,編輯于2023年,星期日圖8-10I2C總線外圍擴(kuò)展示意圖第三十二頁,共一百四十一頁,編輯于2023年,星期日I2C總線有利于系統(tǒng)設(shè)計的模塊化和標(biāo)準(zhǔn)化,省去了電路板上的大量連線,提高了可靠性,降低了成本。在多種串行總線中,I2C總線只用兩條線,不需要片選線,支持帶電插拔,并有眾多的外圍接口芯片,可以作為優(yōu)先選擇。第三十三頁,共一百四十一頁,編輯于2023年,星期日I2C總線上支持多主和主從兩種工作方式。在多主方式中,通過硬件和軟件的仲裁主控制器取得總線控制權(quán)。而在多數(shù)情況下,系統(tǒng)中只有一個主器件,即單主節(jié)點(diǎn),總線上的其他器件都是具有I2C總線的外圍從器件,這時的I2C總線就工作在主從工作方式。第三十四頁,共一百四十一頁,編輯于2023年,星期日在主從方式中,從器件的地址包括器件編號地址和引腳地址,器件編寫地址由I2C總線委員會分配,引腳地址決定于引腳外接電平的高低。當(dāng)器件內(nèi)部有連續(xù)的子地址空間時,對這些空間進(jìn)行N個字節(jié)的連續(xù)讀/寫,子地址會自動加1。在主從方式的I2C總線系統(tǒng)中,只須考慮主方式的I2C總線操作。第三十五頁,共一百四十一頁,編輯于2023年,星期日3.I2C總線基本知識1)I2C總線的接口電路結(jié)構(gòu)I2C總線由一根數(shù)據(jù)線SDA和一根時鐘線SCL構(gòu)成。I2C總線中一個節(jié)點(diǎn)的每個電路器件都可視為有如圖8-11虛框所示的一個I2C總線接口電路,用于與I2C總線的SDA和SCL線掛接。數(shù)據(jù)線SDA和時鐘線SCL都是雙向傳輸線,平時均處于高電平備用狀態(tài),只有當(dāng)需要關(guān)閉I2C總線時,SCL線才會箝位在低電平。第三十六頁,共一百四十一頁,編輯于2023年,星期日圖8-11I2C總線的器件連接第三十七頁,共一百四十一頁,編輯于2023年,星期日2)I2C總線信號定義在I2C總線上,SDA用于傳送有效數(shù)據(jù),其上傳輸?shù)拿课挥行?shù)據(jù)均對應(yīng)于SCL線上的一個時鐘脈沖。也就是說,只有當(dāng)SCL線上為高電平(SCL=1)時,SDA線上的數(shù)據(jù)信號才會有效(高電平表示1,低電平表示0);SCL線為低電平(SCL=0)時,SDA線上的數(shù)據(jù)信號無效。因此,只有當(dāng)SCL線為低電平(SCL=0)時,SDA線上的電平狀態(tài)才允許發(fā)生變化(見圖8-12)。第三十八頁,共一百四十一頁,編輯于2023年,星期日圖8-12I2C總線信號的時序第三十九頁,共一百四十一頁,編輯于2023年,星期日SDA線上傳送的數(shù)據(jù)均以起始信號(START)開始,停止信號(STOP)結(jié)束,SCL線在不傳送數(shù)據(jù)時保持Mark(SCL=1)。當(dāng)串行時鐘線SCL為Mark(SCL=1)時,串行數(shù)據(jù)線SDA上發(fā)生一個由高到低的變化過程(下降沿),即為起始信號;發(fā)生一個由低到高的變化過程,即稱為停止信號。第四十頁,共一百四十一頁,編輯于2023年,星期日起始信號和停止信號均由作為主控器的單片機(jī)發(fā)出,并由掛接在I2C總線上的被控器檢測。對于不具備I2C總線接口的單片機(jī),為了能準(zhǔn)確檢測到這些信號,必須保證在總線的一個時鐘周期內(nèi)對SDA線進(jìn)行至少兩次采樣。第四十一頁,共一百四十一頁,編輯于2023年,星期日4.I2C總線的數(shù)據(jù)傳送在I2C總線上每傳輸一位數(shù)據(jù)都有一個時鐘脈沖相對應(yīng)。注意這里的時鐘脈沖不像一般的時鐘那樣必須是周期性的,它的時鐘間隔可以不同??偩€備用時(即處于“非忙”狀態(tài)),SDA和SCL都必須保持高電平狀態(tài),關(guān)閉I2C總線時才使SCL箝位在低電平。只有總線處于“非忙”狀態(tài)時,數(shù)據(jù)傳輸才能被初始化。在數(shù)據(jù)傳輸期間,只要時鐘線為高電平,數(shù)據(jù)線就必須保持穩(wěn)定。只有在時鐘線為低電平時,才允許數(shù)據(jù)線上的電平狀態(tài)變化。在時鐘線保持高電平期間,數(shù)據(jù)線出現(xiàn)下降沿為啟動信號、上升沿為停止信號,啟動和停止信號都由主機(jī)產(chǎn)生,總線上帶有I2C總線接口的器件很容易檢測到這些信號。第四十二頁,共一百四十一頁,編輯于2023年,星期日I2C總線上傳輸?shù)臄?shù)據(jù)和地址字節(jié)均為8位,且高位在前,低位在后。I2C總線以起始信號為啟動信號,接著傳輸?shù)氖堑刂泛蛿?shù)據(jù)字節(jié),數(shù)據(jù)字節(jié)是沒有限制的,但每個字節(jié)后都必須跟隨一個應(yīng)答位,全部數(shù)據(jù)傳輸完畢后,以終止信號結(jié)尾。I2C總線上數(shù)據(jù)的傳送時序如圖8-13所示。第四十三頁,共一百四十一頁,編輯于2023年,星期日圖8-13I2C總線的數(shù)據(jù)傳送字節(jié)格式第四十四頁,共一百四十一頁,編輯于2023年,星期日利用SDA線進(jìn)行數(shù)據(jù)傳輸時,發(fā)送器每發(fā)完一個數(shù)據(jù)字節(jié)后,都要求接收方發(fā)回一個應(yīng)答信號。但與應(yīng)答信號相對應(yīng)的時鐘仍由主控器在SCL線上產(chǎn)生,因此主控發(fā)送器必須在被控接收器發(fā)送應(yīng)答信號前,預(yù)先釋放對SDA線的控制,以便主控器對SDA線上應(yīng)答信號的檢測。第四十五頁,共一百四十一頁,編輯于2023年,星期日應(yīng)答信號在第9個時鐘位上出現(xiàn),接收器在SDA線上輸出低電平為應(yīng)答信號(A),輸出高電平為非應(yīng)答信號(A)。時鐘信號以及應(yīng)答和非應(yīng)答信號間的關(guān)系如圖8-14所示。圖8-14I2C總線的應(yīng)答位第四十六頁,共一百四十一頁,編輯于2023年,星期日在主控器發(fā)送數(shù)據(jù)時,被控器接收完一個數(shù)據(jù)字節(jié)后都要向主控器發(fā)回一個應(yīng)答信號(A),主控器據(jù)此便可進(jìn)行下一字節(jié)的發(fā)送。但如果被控器由于某種原因需要進(jìn)行其他處理而無法繼續(xù)接收SDA線上數(shù)據(jù)時,便可向SDA線輸出一個非應(yīng)答信號(A),使SDA線保持高電平,主控器據(jù)此便可產(chǎn)生一個停止信號來終止SDA線上的數(shù)據(jù)傳輸。第四十七頁,共一百四十一頁,編輯于2023年,星期日當(dāng)主控器作為接收器接收被控器送來的最后一個數(shù)據(jù)時,必須給被控器發(fā)送一個非應(yīng)答信號(A),令被控器釋放SDA線,以便主控器可以發(fā)送停止信號來結(jié)束數(shù)據(jù)的傳輸。I2C總線上的應(yīng)答信號是比較重要的,在編制程序時應(yīng)該著重考慮。第四十八頁,共一百四十一頁,編輯于2023年,星期日5I2C總線數(shù)據(jù)傳輸協(xié)議1)總線節(jié)點(diǎn)的尋址字節(jié)主機(jī)產(chǎn)生起始條件后,發(fā)送的第一個字節(jié)為尋址字節(jié)。該字節(jié)的前7位(高7位)為從機(jī)地址,最后一位(LSB)決定了數(shù)據(jù)傳輸?shù)姆较颍?表示主機(jī)寫信息到從機(jī),1表示主機(jī)讀從機(jī)中的信息。當(dāng)發(fā)送了一個地址后,系統(tǒng)中的每個器件都將頭7位與它自己的地址比較。如果一樣,器件會應(yīng)答主機(jī)的尋址,至于是從機(jī)接收器還是從機(jī)發(fā)送器由R/W位決定。第四十九頁,共一百四十一頁,編輯于2023年,星期日從機(jī)地址由一個固定的和一個可編程的部分構(gòu)成。例如,某些器件有4個固定的位(高4位)和3個可編程的地址位(低3位),那么同一總線上共可以連接8個相同的器件。I2C總線委員會協(xié)調(diào)I2C地址的分配,保留了2組8位地址(0000×××和1111×××),這2組地址的用途可查閱有關(guān)資料。第五十頁,共一百四十一頁,編輯于2023年,星期日掛接到總線上的所有外圍器件、外設(shè)接口都是總線上的節(jié)點(diǎn)。在任何時刻總線上只有一個主控器件(主節(jié)點(diǎn))實(shí)現(xiàn)總線的控制操作,對總線上的其他節(jié)點(diǎn)尋址,分時實(shí)現(xiàn)點(diǎn)對點(diǎn)的數(shù)據(jù)傳送。因此,總線上每個節(jié)點(diǎn)都有一個固定的節(jié)點(diǎn)地址。第五十一頁,共一百四十一頁,編輯于2023年,星期日I2C總線上的單片機(jī)都可以成為主節(jié)點(diǎn),其器件地址由軟件給定,存放在I2C總線的地址寄存器中,稱為主器件的從地址。在I2C總線的多主系統(tǒng)中,單片機(jī)作為從節(jié)點(diǎn)時,其從地址才有意義。I2C總線上所有的外圍器件都有規(guī)范的器件地址。器件地址由7位組成,它和1位方向位構(gòu)成了I2C總線器件的尋址字節(jié)SLA。第五十二頁,共一百四十一頁,編輯于2023年,星期日主機(jī)產(chǎn)生起始信號后的第一個尋址字節(jié)格式如下:D7D0SLADA3DA2DA1DA0A2A1A0R/W

從機(jī)地址第五十三頁,共一百四十一頁,編輯于2023年,星期日其各位含義如下:器件地址(DA3、DA2、DA1和DA0):是I2C總線外圍接口器件固有的地址編碼,器件出廠時,就已給定。例如,I2C總線E2PROMAT24C××的器件地址為1010,4位LED驅(qū)動器SAA1064的器件地址為0111。引腳地址(A2、A1和A0):是由I2C總線外圍器件地址端口A2、A1和A0在電路中接電源或接地的不同而形成的地址數(shù)據(jù)。數(shù)據(jù)方向(R/W):規(guī)定了總線上主節(jié)點(diǎn)對從節(jié)點(diǎn)的數(shù)據(jù)傳送方向,R——接收,——發(fā)送。表8-1列出了一些常用外圍器件的節(jié)點(diǎn)地址和尋址字節(jié)。第五十四頁,共一百四十一頁,編輯于2023年,星期日表8-1常用I2C接口通用器件的種類、型號和尋址字節(jié)第五十五頁,共一百四十一頁,編輯于2023年,星期日2)I2C總線數(shù)據(jù)傳輸?shù)母袷絀2C總線傳輸數(shù)據(jù)時必須遵循規(guī)定的數(shù)據(jù)傳輸格式,圖815示出了I2C總線一次完整的數(shù)據(jù)傳輸格式。圖8-15I2C總線一次完整的數(shù)據(jù)傳輸格式第五十六頁,共一百四十一頁,編輯于2023年,星期日在圖8-15中,起始信號表明一次數(shù)據(jù)傳送的開始,其后為被控器的地址字節(jié),高位在前,低位在后,第8位為R/W方向位。方向位R/W表明主控器和被控器間數(shù)據(jù)傳輸?shù)姆较颉H鬜/W=0,表明數(shù)據(jù)由主控器按地址字節(jié)寫入被控器;若R/W=1,表明數(shù)據(jù)從由地址字節(jié)決定的被控器讀入主控器。方向位后面是被控器發(fā)出的應(yīng)答位ACK。地址字節(jié)傳輸完后是數(shù)據(jù)字節(jié),數(shù)據(jù)字節(jié)仍是高位在前,低位在后,然后是應(yīng)答位。第五十七頁,共一百四十一頁,編輯于2023年,星期日若有多個數(shù)據(jù)字節(jié)需要傳送,則每個數(shù)據(jù)字節(jié)的格式相同。數(shù)據(jù)字節(jié)傳送完后,被控接收器發(fā)回一個非應(yīng)答信號(高電平有效),主控器據(jù)此發(fā)送停止信號,以結(jié)束這次數(shù)據(jù)的傳輸。但是,如果主機(jī)仍希望在總線上通信,它可以產(chǎn)生重復(fù)的起始信號(Sr)和尋址另一個從機(jī),而不是首先產(chǎn)生一個停止信號。總線上數(shù)據(jù)傳輸有多種組合方式,現(xiàn)以圖解方式分別介紹如下3類數(shù)據(jù)傳輸格式。第五十八頁,共一百四十一頁,編輯于2023年,星期日(1)主控器的寫數(shù)據(jù)操作格式主控器產(chǎn)生起始信號后,發(fā)送一個尋址字節(jié),收到應(yīng)答后跟著就是數(shù)據(jù)傳輸,當(dāng)主機(jī)產(chǎn)生停止信號后,數(shù)據(jù)傳輸停止。主機(jī)向被尋址的從機(jī)寫入n個數(shù)據(jù)字節(jié)。整個過程均為主機(jī)發(fā)送,從機(jī)接收,先發(fā)數(shù)據(jù)高位,再發(fā)低位,應(yīng)答位ACK由從機(jī)發(fā)送。主控器向被控器發(fā)送數(shù)據(jù)時,數(shù)據(jù)的方向位(R/W=0)是不會改變的。傳輸n字節(jié)的數(shù)據(jù)格式如下:第五十九頁,共一百四十一頁,編輯于2023年,星期日具體內(nèi)容為:其中:為主控器發(fā)送,被控器接收;為被控器發(fā)送,主控器接收;A為應(yīng)答信號,S為起始信號,P為停止信號;SLA為尋址字節(jié)(寫);data1~datan為被傳輸?shù)膎個數(shù)據(jù)字節(jié)。第六十頁,共一百四十一頁,編輯于2023年,星期日(2)主控器的讀數(shù)據(jù)操作格式主機(jī)從被尋址的從機(jī)讀出n個數(shù)據(jù)字節(jié)。在傳輸過程中,除了尋址字節(jié)為主機(jī)發(fā)送、從機(jī)接收外,其余的n字節(jié)均為從機(jī)發(fā)送,主機(jī)接收。主機(jī)接收完數(shù)據(jù)后,應(yīng)發(fā)非應(yīng)答位,向從機(jī)表明讀操作結(jié)束。第六十一頁,共一百四十一頁,編輯于2023年,星期日主控器從被控器讀取數(shù)據(jù)時,數(shù)據(jù)傳輸?shù)姆较蛭籖/W=1。主控器從被控器讀取n字節(jié)的數(shù)據(jù)格式為:第六十二頁,共一百四十一頁,編輯于2023年,星期日具體內(nèi)容為:其中:SLAR為尋址字節(jié)(讀),其余與前述相同。注意:主控器在發(fā)送停止信號前,應(yīng)先給被控器發(fā)送一個非應(yīng)答信號,向被控器表明讀操作結(jié)束。第六十三頁,共一百四十一頁,編輯于2023年,星期日3)主控器的讀/寫數(shù)據(jù)操作格式讀/寫操作時,在一次數(shù)據(jù)傳輸過程中需要改變數(shù)據(jù)的傳送方向,即主機(jī)在一段時間內(nèi)為讀操作,在另一段時間內(nèi)為寫操作。由于讀/寫方向有變化,起始信號和尋址字節(jié)都會重復(fù)一次,但讀/寫方向(R/W)相反。例如,由單片機(jī)主機(jī)讀取存儲器從機(jī)中某存儲單元的內(nèi)容,就需要主機(jī)先向從機(jī)寫入該存儲單元的地址,再發(fā)一個啟動位,進(jìn)行讀操作。第六十四頁,共一百四十一頁,編輯于2023年,星期日主控器向被控器先讀后寫的數(shù)據(jù)格式如下:第六十五頁,共一百四十一頁,編輯于2023年,星期日具體內(nèi)容為:其中:Sr為重復(fù)起始信號;data1~datan為主控器的讀數(shù)據(jù);DATA1~DATAn為主控器的寫數(shù)據(jù);其余與前述相同。第六十六頁,共一百四十一頁,編輯于2023年,星期日無論總線處于何種方式,起始信號、終止信號和尋址字節(jié)均由主控器發(fā)送和被控器接收。尋址字節(jié)中,7位地址是指器件地址,即被尋址的被控器的固有地址,R/W方向位用于指定SDA線上數(shù)據(jù)傳送的方向。R/W=0為主控器寫和被控器收,R/W=1為主控器讀(收)和被控器發(fā)。每個器件(主控器或被控器)內(nèi)部都有一個數(shù)據(jù)存儲器RAM,RAM的地址是連續(xù)的,并能自動加/減1。n個被傳送數(shù)據(jù)的RAM地址可由系統(tǒng)設(shè)計者規(guī)定,通常作為數(shù)據(jù)放在上述數(shù)據(jù)傳輸格式中,即第一個數(shù)據(jù)字節(jié)data1或DATA1。總線上傳輸?shù)拿總€字節(jié)后必須跟一個應(yīng)答或非應(yīng)答信號A/A。通過上述分析,可以得出如下結(jié)論:第六十七頁,共一百四十一頁,編輯于2023年,星期日651單片機(jī)與I2C總線的接口1)單片機(jī)與I2C總線的硬件連接用不帶I2C接口的51單片機(jī)控制I2C總線時,硬件也非常簡單,只需兩個I/O口線,在軟件中分別定義成SCL和SDA,與I2C總線的SCL和SDA直接相連,再加上上拉電阻即可。以51系列單片機(jī)為例,可以用P1.6和P1.7直接與SCL和SDA相連,硬件接口如圖8-16所示。圖8-16模擬I2C總線第六十八頁,共一百四十一頁,編輯于2023年,星期日2)51單片機(jī)對I2C總線的控制程序這里以51系列單片機(jī)為例,介紹如何根據(jù)I2C總線的工作原理用匯編語言編寫控制程序。第六十九頁,共一百四十一頁,編輯于2023年,星期日首先,應(yīng)根據(jù)I2C總線對SDA和SCL在各個時段的時序要求寫出起始、停止、送應(yīng)答位、送非應(yīng)答位、檢查應(yīng)答位以及發(fā)送一字節(jié)、接收一字節(jié)的子程序,具體代碼可參見《電子世界》網(wǎng)站()上的匯編源程序,該程序中設(shè)置“I2C_ERROR”為出錯標(biāo)志。若在程序中適當(dāng)增加NOP指令的條數(shù),可以提高I2C總線數(shù)據(jù)傳輸?shù)目煽啃?。第七十頁,共一百四十一頁,編輯?023年,星期日注意在使用這些程序前,先要確定從機(jī)的地址和從機(jī)中要操作的內(nèi)部單元的地址。程序中用“DeviceaddressW”表示從機(jī)的7位地址加上寫標(biāo)志0,“DeviceaddressR”表示從機(jī)的7位地址加上讀標(biāo)志1,“Subaddress”表示內(nèi)部單元的8位地址,“DATA_I2C”表示操作數(shù)據(jù)在單片機(jī)內(nèi)的存放地址。這些程序可以實(shí)現(xiàn)簡單的I2C總線操作,用戶也可以根據(jù)具體要求再附加相應(yīng)的程序。第七十一頁,共一百四十一頁,編輯于2023年,星期日7I2C總線數(shù)據(jù)傳送軟件包如果是不帶I2C總線的單片機(jī),則不必擴(kuò)展I2C總線接口,只須通過軟件模擬,這無疑會給I2C總線的應(yīng)用提供更廣泛的空間。通常大多數(shù)單片機(jī)應(yīng)用系統(tǒng)中只有一個CPU,這種單主系統(tǒng)如果采用I2C總線技術(shù),則總線上只有單片機(jī)對I2C總線從器件的訪問,沒有總線的競爭等問題,這種情況下只需要模擬主發(fā)送和主接收時序?;谏鲜隹紤],這里提供了這種使用情況下的時序模擬軟件,使I2C總線的使用不受單片機(jī)必須帶有I2C總線接口的限制。第七十二頁,共一百四十一頁,編輯于2023年,星期日本教程在模擬主方式下的I2C總線時序時,選用如圖8-16所示P1.6和P1.7作為時鐘線SCL和數(shù)據(jù)線SDA,晶振采用6MHz。這里提供一個軟件包,包括啟動(STA),停止(STOP),發(fā)送應(yīng)答位(MACK),發(fā)送非應(yīng)答位(MNACK),應(yīng)答位檢查(CACK),發(fā)送一字節(jié)數(shù)據(jù)(WRBYT),接收一字節(jié)數(shù)據(jù)(RDBYT),發(fā)送N字節(jié)數(shù)據(jù)和接收N字節(jié)數(shù)據(jù)(RDNBYT)9個子程序。第七十三頁,共一百四十一頁,編輯于2023年,星期日1)I2C總線典型信號時序及信號模擬子程序I2C總線數(shù)據(jù)傳送時,有起始位(S)、終止位(P)、發(fā)送0代表應(yīng)答位(A)、發(fā)送1代表非應(yīng)答位(A)等信號。按照典型I2C總線傳送速率的要求,這些信號、時序如圖8-17(a)、(b)、(c)和(d)所示。第七十四頁,共一百四十一頁,編輯于2023年,星期日圖8-17I2C總線數(shù)據(jù)傳送典型信號時序第七十五頁,共一百四十一頁,編輯于2023年,星期日圖8-17I2C總線數(shù)據(jù)傳送典型信號時序?qū)τ贗2C總線的典型信號,可以用指令操作來模擬其時序過程。若89C51單片機(jī)的系統(tǒng)時鐘為6MHz,相應(yīng)的單周期指令的周期為2μs,則起始(STA)、終止(STOP)、發(fā)送應(yīng)答位(MACK)、發(fā)送非應(yīng)答位(MNACK)的4個模擬子程序如下:第七十六頁,共一百四十一頁,編輯于2023年,星期日1)啟動I2C總線子程序STASTA:SETB SDASETB SCL;起始條件建立時間大于4.7μsNOPNOPCLR SDANOP ;起始條件鎖定時間大于4μsNOPCLR SCL;箝住總線,準(zhǔn)備發(fā)送數(shù)據(jù)RET第七十七頁,共一百四十一頁,編輯于2023年,星期日(2)停止I2C總線子程序STOPSTOP:CLR SDASETB SCL;發(fā)送停止條件的時鐘信號NOP ;停止總線時間大于4μsNOPSETB SDA;停止總線NOPNOPCLR SDACLR SCLRET第七十八頁,共一百四十一頁,編輯于2023年,星期日(3)發(fā)送應(yīng)答位信號子程序MACKMACK:CLR SDASETB SCLNOP ;保持?jǐn)?shù)據(jù)時間,即SCL為高,時間大于4μsNOPCLR SCLSETB SDARET第七十九頁,共一百四十一頁,編輯于2023年,星期日(4)發(fā)送非應(yīng)答位信號子程序MNACKMNACK:SETB SDASETB SCLNOP ;保持?jǐn)?shù)據(jù)時間,即SCL為高,時間大于4.0μsNOPCLR SCLCLR SDARET在使用上述子程序時,如果單片機(jī)的主時鐘不是6MHz,則應(yīng)調(diào)整NOP指令個數(shù),以滿足時序要求。第八十頁,共一百四十一頁,編輯于2023年,星期日2)I2C總線數(shù)據(jù)傳送的模擬子程序

從I2C總線的數(shù)據(jù)操作中可以看出,除了基本的啟動(STA)、終止(STOP)、發(fā)送應(yīng)答位(MACK)、發(fā)送非應(yīng)答位(MNACK)外,還應(yīng)有應(yīng)答位檢查(CACK)、發(fā)送一字節(jié)(WRBYT)、接收一字節(jié)(RBYT)、發(fā)送N字節(jié)(WRNBYT)和接收N字節(jié)(RDNBYT)這5個子程序。第八十一頁,共一百四十一頁,編輯于2023年,星期日(1)應(yīng)答位檢查子程序CACK在應(yīng)答位檢查子程序(CACK)中,設(shè)置了標(biāo)志位。CACK中用F0作標(biāo)志位,當(dāng)檢查到正常應(yīng)答位后,F(xiàn)0=0;否則F0=1。CACK: SETBSDA;置SDA為輸入方式 SETBSCL;使SDA上數(shù)據(jù)有效 CLRF0;預(yù)設(shè)F0=0 MOV C,SDA;輸入SDA引腳狀態(tài) JNCCEND;檢查SDA狀態(tài),正常應(yīng)答轉(zhuǎn)CEND,且F0=0 SETBF0;無正常應(yīng)答,F(xiàn)0=1CEND: CLRSCL;子程序結(jié)束,使SCL=0 RET第八十二頁,共一百四十一頁,編輯于2023年,星期日(2)發(fā)送一字節(jié)數(shù)據(jù)子程序WRBYT該子程序是向虛擬I2C總線的數(shù)據(jù)線SDA上發(fā)送一字節(jié)數(shù)據(jù)的操作。調(diào)用該子程序前,將要發(fā)送的數(shù)據(jù)送入A中。占用資源:R0,C。WRBYT:MOV R0,#08H;8位數(shù)據(jù)長度送R0中WLP: RLCA;發(fā)送數(shù)據(jù)左移,使發(fā)送位入C JC WR1;判斷發(fā)送1還是0,發(fā)送1轉(zhuǎn)WR1 AJMP WR0;發(fā)送0轉(zhuǎn)WR0WLP1: DJNZ R0,WLP;8位是否發(fā)送完,未完轉(zhuǎn)WLP RET;8位發(fā)送完結(jié)束WR1: SETB SDA;發(fā)送1程序段 SETB SCL NOP NOP CLR SCL CLRS DA AJMP WLP1WR0: CLR SDA;發(fā)送0程序段 SETB SCL NOP NOP CLR SCL AJMP WLP1第八十三頁,共一百四十一頁,編輯于2023年,星期日(3)從SDA上接收一字節(jié)數(shù)據(jù)子程序RDBYT該子程序用來從SDA上讀取一字節(jié)數(shù)據(jù),執(zhí)行本程序后,從SDA上讀取的一字節(jié)存放在R2或A中。占用資源:R0、R2和C。RDBYT: MOV R0,#08H;8位數(shù)據(jù)長度送R0中RLP: SETB SDA;置SDA為輸入方式 SETB SCL;使SDA上數(shù)據(jù)有效 MOV C,SDA;讀入SDA引腳狀態(tài) MOV A,R2;讀入0程序段,由C拼裝入R2中 RLCA MOV R2,A CLR SCL;使SCL=0可繼續(xù)接收數(shù)據(jù)位 DJNZ R0,RLP;8位讀完了嗎?未讀完轉(zhuǎn)RLP RET第八十四頁,共一百四十一頁,編輯于2023年,星期日(4)向被控器發(fā)送N字節(jié)數(shù)據(jù)子程序WRNBYT在I2C總線數(shù)據(jù)傳送中,主節(jié)點(diǎn)常常需要連續(xù)地向外圍器件發(fā)送多個字節(jié)數(shù)據(jù),本子程序是用來向SDA線上發(fā)送N字節(jié)數(shù)據(jù)的操作。該子程序的編寫必須按照I2C總線規(guī)定的讀/寫操作格式進(jìn)行。如主控器向I2C總線上某個外圍器件連續(xù)發(fā)送N個數(shù)據(jù)字節(jié)時,其數(shù)據(jù)操作格式如下:其中,SLAW為外圍器件尋址字節(jié)(寫)。第八十五頁,共一百四十一頁,編輯于2023年,星期日按照上述操作格式所編寫的發(fā)送N字節(jié)的通用子程序(WRNBYT)清單如下:

WRNBYT: MOV R3,NUMBYT LCALL STA;啟動I2C總線 MOV A,SLA;發(fā)送SLAW字節(jié) LCALL WRBYT LCALL CACK;檢查應(yīng)答位 JB F0,WRNBYT;非應(yīng)答位則重發(fā) MOV R1,#MTDWRDA: MOV A,@R1 LCALL WRBYT LCALL CACK JB F0,WRNBYT INC R1 DJNZ R3,WRDA LCALL STOP RET第八十六頁,共一百四十一頁,編輯于2023年,星期日在使用本子程序時,占用資源為R1和R3,但須調(diào)用STA、STOP、WRBYT和CACK子程序,而且使用了一些符號單元。在使用這些符號單元時,應(yīng)在片內(nèi)RAM中分配好這些地址。這些符號單元有:MTD主節(jié)點(diǎn)發(fā)送數(shù)據(jù)緩沖區(qū)首址;SLA外圍器件尋址字節(jié)存放單元;NUMBYT發(fā)送數(shù)據(jù)字節(jié)數(shù)存放單元。第八十七頁,共一百四十一頁,編輯于2023年,星期日在調(diào)用本子程序之前,必須將要發(fā)送的N字節(jié)數(shù)據(jù)依次存放在以MTD為首地址的發(fā)送數(shù)據(jù)緩沖區(qū)中。調(diào)用本子程序后,N字節(jié)數(shù)據(jù)依次傳送到外圍器件內(nèi)部相應(yīng)的地址單元中。第八十八頁,共一百四十一頁,編輯于2023年,星期日(5)從外圍器件讀取N字節(jié)數(shù)據(jù)子程序RDNBYT在I2C總線系統(tǒng)中,主控器按主接收方式從外圍器件中讀出N字節(jié)數(shù)據(jù)的操作格式如下:其中,A:非應(yīng)答位,主節(jié)點(diǎn)在接收完N字節(jié)后,必須發(fā)送一個非應(yīng)答位;SLAR:外圍器件尋址字節(jié)(讀)。第八十九頁,共一百四十一頁,編輯于2023年,星期日按照上述操作格式所編寫的通用N字節(jié)接收子程序(RDNBYT)清單如下:RDNBYT: MOV R3,NUMBYT LCALL STA;發(fā)送啟動位 MOV A,SLA;發(fā)送尋址字節(jié)(讀) LCALL WRBYT LCALL CACK;檢查應(yīng)答位 JB F0,RDNBYT;非正常應(yīng)答時重新開始RDN: MOV R1,#MRD;接收數(shù)據(jù)緩沖區(qū)首址MRD入R1RDN1: LCALL RDBYT;讀入一字節(jié)到接收數(shù)據(jù)緩沖區(qū)中 MOV @R1,A DJNZ R3,ACK;N字節(jié)讀完了嗎?未完轉(zhuǎn)ACK LCALL MNACK;N字節(jié)讀完發(fā)送非應(yīng)答位 LCALL STOP;發(fā)送停止信號 RET;子程序結(jié)束ACK: LCALL MACK;發(fā)送應(yīng)答位 INC R1;指向下一個接收數(shù)據(jù)緩沖單元 SJMP RDN1;轉(zhuǎn)讀入下一個字節(jié)數(shù)據(jù)第九十頁,共一百四十一頁,編輯于2023年,星期日在使用RDNBYT子程序時,占用資源R1和R3,但須調(diào)用STA、STOP、WRBYT、RDBYT、CACK、MACK和MNACK等子程序并滿足這些子程序的調(diào)用要求。RDNBYT子程序中使用了一些符號單元,除了在WRNDYT子程序中使用過的SLA、MTD和NUMBYT外,還有以下幾個:SLA器件尋址(讀)存放單元;MRD主節(jié)點(diǎn)中數(shù)據(jù)接收緩沖區(qū)首址;在調(diào)用RDNBYT子程序后,從節(jié)點(diǎn)中所指定首地址中的N字節(jié)數(shù)據(jù)將被讀入主節(jié)點(diǎn)片內(nèi)以MRD為首址的數(shù)據(jù)緩沖器中。第九十一頁,共一百四十一頁,編輯于2023年,星期日3)主程序在主程序初始化中,應(yīng)有如下的語句: SDA BIT P1.7 SCL BIT P1.6 MTD EQU 30H;MTD:發(fā)送數(shù)據(jù)緩沖區(qū)首址 MRD EQU 40H;MRD:接收數(shù)據(jù)緩沖區(qū)首址 SLA EQU 60H;SLA:尋址字節(jié)SLAR/W的存放單元NUMBYT EQU 61H;NUMBYT:傳送字節(jié)數(shù)存放單元第九十二頁,共一百四十一頁,編輯于2023年,星期日8.1.3單總線近年來,美國的達(dá)拉斯半導(dǎo)體公司(DALLASSEMICONDUCTOR)推出了一項(xiàng)特有的單總線(1-WireBus)技術(shù)。該技術(shù)與上述總線不同,它采用單根信號線,既可傳輸時鐘,又能傳輸數(shù)據(jù),而且數(shù)據(jù)傳輸是雙向的,因而這種單總線技術(shù)具有線路簡單,硬件開銷少,成本低廉,便于總線擴(kuò)展和維護(hù)等優(yōu)點(diǎn)。單總線適用于單主機(jī)系統(tǒng),能夠控制一個或多個從機(jī)設(shè)備。主機(jī)可以是微控制器,從機(jī)可以是單總線器件,它們之間的數(shù)據(jù)交換只通過一條信號線。當(dāng)只有一個從機(jī)設(shè)備時,系統(tǒng)可按單節(jié)點(diǎn)系統(tǒng)操作;當(dāng)有多個從設(shè)備時,系統(tǒng)則按多節(jié)點(diǎn)系統(tǒng)操作。圖1所示是單總線多節(jié)點(diǎn)系統(tǒng)的示意圖。第九十三頁,共一百四十一頁,編輯于2023年,星期日圖1單總線構(gòu)成的分布式溫度監(jiān)測系統(tǒng)第九十四頁,共一百四十一頁,編輯于2023年,星期日單總線的工作原理顧名思義,單總線即只有一根數(shù)據(jù)線,系統(tǒng)中的數(shù)據(jù)交換、控制都由這根線完成。設(shè)備(主機(jī)或從機(jī))通過一個漏極開路或三態(tài)端口連至該數(shù)據(jù)線,以允許設(shè)備在不發(fā)送數(shù)據(jù)時能夠釋放總線,而讓其它設(shè)備使用總線。單總線通常要求外接一個約為4.7kΩ的上拉電阻,這樣,當(dāng)總線閑置時,其狀態(tài)為高電平。主機(jī)和從機(jī)之間的通信可通過3個步驟完成,分別為初始化1-wire器件、識別1-wire器件和交換數(shù)據(jù)。由于它們是主從結(jié)構(gòu),只有主機(jī)呼叫從機(jī)時,從機(jī)才能應(yīng)答,因此主機(jī)訪問1-wire器件都必須嚴(yán)格遵循單總線命令序列,即初始化、ROM、命令功能命令。如果出現(xiàn)序列混亂,1-wire器件將不響應(yīng)主機(jī)(搜索ROM命令,報警搜索命令除外)。第九十五頁,共一百四十一頁,編輯于2023年,星期日1DS18S20單總線測溫系統(tǒng)DS18S20是美國Dallas公司生產(chǎn)的單總線數(shù)字溫度傳感器。它可以把溫度信號直接轉(zhuǎn)換成串行數(shù)字信號供單片機(jī)處理,特別適合構(gòu)成多點(diǎn)溫度巡回檢測系統(tǒng)。由于每片DS18S20都含有惟一的產(chǎn)品號,所以從理論上來說,在一條總線上可以掛接任意多個DS18S20芯片。從DS18S20讀出或?qū)懭胄畔H需一根口線(單線接口)。讀/寫及溫度變換功率來源于數(shù)據(jù)總線,總線本身也可以向所掛接的DS18S20供電,而無需額外電源。DS18S20提供9位溫度讀數(shù),構(gòu)成多點(diǎn)溫度檢測系統(tǒng)而無需任何外圍硬件。第九十六頁,共一百四十一頁,編輯于2023年,星期日1)DS18S20的特性及引腳單線接口,僅需一根口線與MCU相連,無需外圍元件;由數(shù)據(jù)線提供電源;測溫范圍為-55~125℃,精度為0.5℃(-10~85℃范圍內(nèi));9位溫度讀數(shù);溫度轉(zhuǎn)換時間最長為750ms;用戶可自行設(shè)定溫度報警上下限,其值是非易失性的;報警搜索命令可識別哪片DS18S20超溫度界限。DS18S20采用3腳PR35封裝(或8腳SOIC封裝),引腳排列如圖819所示。圖中GND為地,DQ為數(shù)據(jù)輸入/輸出腳(單線接口,可作寄生供電),VDD為電源電壓。圖8-19DS18S20的引腳排列第九十七頁,共一百四十一頁,編輯于2023年,星期日2)DS18S20的內(nèi)部結(jié)構(gòu)DS18S20的內(nèi)部結(jié)構(gòu)如圖8-20所示。DS18S20主要包括寄生電源、溫度傳感器、64位激光ROM單線接口、存放中間數(shù)據(jù)的高速暫存器(內(nèi)含便箋式RAM)、用于存儲用戶設(shè)定的溫度上下限值TH和TL的觸發(fā)器、存儲與控制邏輯、8位循環(huán)冗余校驗(yàn)碼(CRC)發(fā)生器8部分。DS18S20既可以采用寄生供電,也可以采用外部5V電源供電。寄生供電時,當(dāng)總線上是高電平時,DS18S20從總線上獲得能量并儲存在內(nèi)部電容上。當(dāng)總線上是低電平時,由電容向DS18S20供電。第九十八頁,共一百四十一頁,編輯于2023年,星期日圖8-20DS18S20內(nèi)部結(jié)構(gòu)圖第九十九頁,共一百四十一頁,編輯于2023年,星期日DS18S20的測溫原理是:內(nèi)部計數(shù)器對一個受溫度影響的振蕩器計數(shù)。溫度表示值應(yīng)為9位,高位為符號位,但因符號位擴(kuò)展成高8位,故以16位補(bǔ)碼形式讀出,溫度與數(shù)字量的關(guān)系如表8-2所列。第一百頁,共一百四十一頁,編輯于2023年,星期日3)溫度巡回檢測系統(tǒng)電路系統(tǒng)如圖8-21所示,采用寄生電源供電方式。圖8-21DS18S20溫度巡回檢測系統(tǒng)第一百零一頁,共一百四十一頁,編輯于2023年,星期日為保證在有效的DS18S20周期內(nèi)提供足夠的電流,用一個MOSFET管和89C51的一個I/O口線(P1.0)來完成對DS18S20總線的上拉。采用寄生電源供電時,VDD必須接地。在此系統(tǒng)中采用89C51的P1.1口作發(fā)送口Tx,P1.2口作接收口Rx。實(shí)驗(yàn)發(fā)現(xiàn)這種方法可接數(shù)十片DS18S20,距離可達(dá)50m;而用1根口線(如圖8-21所示)時,僅能掛接10片DS18S20,距離僅為20m以內(nèi),同時由于讀/寫在操作上是分開的,故不存在信號競爭問題。第一百零二頁,共一百四十一頁,編輯于2023年,星期日4)工作過程89C51首先發(fā)復(fù)位DS18S20的負(fù)脈沖,接著收DS18S20的回應(yīng)脈沖,這時89C51再發(fā)ROM命令(33H),最后發(fā)存儲和控制命令。第一百零三頁,共一百四十一頁,編輯于2023年,星期日(1)DS18S20ROM命令主機(jī)操作ROM的命令有5種,如表8-3所列。64位激光ROM的結(jié)構(gòu)如下:開始8位是產(chǎn)品類型編號(DS18S20為10H);接著是每個器件的惟一序號,共有48位;最后8位是前56位的CRC校驗(yàn)碼,這也是多個DS18S20可以采用一線的原因。第一百零四頁,共一百四十一頁,編輯于2023年,星期日第一百零五頁,共一百四十一頁,編輯于2023年,星期日(2)DS18S20存儲控制命令DS18S20存儲控制命令共有6種,如表8-4所列。DS18S20的存儲器由便箋式RAM和非易失性電擦寫EERAM組成,后者用于存儲TH和TL值。數(shù)據(jù)先寫入RAM,經(jīng)校驗(yàn)后再傳給EERAM。便箋式RAM占9字節(jié),包括溫度信息(第1、2字節(jié))、TH、TL值(第3、4字節(jié))、計數(shù)寄存器(第7、8字節(jié))、CRC(第9字節(jié))等,第5、6字節(jié)不用。第一百零六頁,共一百四十一頁,編輯于2023年,星期日(3)DS18S20的執(zhí)行序列1)初始化時序,初始化時序包括主機(jī)發(fā)出的復(fù)位脈沖和從機(jī)發(fā)出的應(yīng)答脈沖。主機(jī)通過拉低單總線至少480μs產(chǎn)生Tx復(fù)位脈沖;然后由主機(jī)釋放總線,并進(jìn)入Rx接收模式。主機(jī)釋放總線時,會產(chǎn)生一由低電平跳變?yōu)楦唠娖降纳仙?,單總線器件檢測到該上升沿后,延時15~60μs,接著單總線器件通過拉低總線60~240μsμ來產(chǎn)生應(yīng)答脈沖。主機(jī)接收到從機(jī)的以應(yīng)答脈沖后,說明有單總線器件在線,然后主機(jī)就可以開始對從機(jī)進(jìn)行ROM命令和功能命令操作。

第一百零七頁,共一百四十一頁,編輯于2023年,星期日2)寫時序當(dāng)主機(jī)將數(shù)據(jù)線的電平從高拉到低時,形成寫時序,有寫0和寫1兩種時序。寫時序開始后,DS18B20在15-60us期間從數(shù)據(jù)線上采樣,如果采樣到低電平,則向DS18B20寫0,否則寫1,兩個獨(dú)立的時序之間至少需要1us的恢復(fù)時間。3)讀時序當(dāng)主機(jī)從DS18B20讀取數(shù)據(jù)時,產(chǎn)生讀時序,此時,主機(jī)將數(shù)據(jù)線的電平從高拉到低使讀時序被初始化。如果此后15us內(nèi),主機(jī)在總線上采樣到低電平,則從DS18B20讀0,否則讀1.第一百零八頁,共一百四十一頁,編輯于2023年,星期日程序框圖如圖8-22所示。圖8-22程序框圖第一百零九頁,共一百四十一頁,編輯于2023年,星期日8.2并行擴(kuò)展三總線的產(chǎn)生通常情況下,微機(jī)的CPU外部都有單獨(dú)的并行地址總線、數(shù)據(jù)總線和控制總線,而89C51單片機(jī)由于受引腳的限制,數(shù)據(jù)線和地址線是復(fù)用的,而且由I/O口線兼用。為了將它們分離出來,以便同單片機(jī)片外的芯片正確地連接,需要在單片機(jī)外部增加地址鎖存器,從而構(gòu)成與一般CPU相類似的片外三總線,如圖8-25所示。采用74HC373作鎖存器的地址總線擴(kuò)展電路如圖8-26所示。第一百一十頁,共一百四十一頁,編輯于2023年,星期日圖8-2589C51擴(kuò)展的并行三總線圖8-2689C51地址總線擴(kuò)展電路第一百一十一頁,共一百四十一頁,編輯于2023年,星期日由89C51P0口送出的低8位有效地址信號是在ALE(地址鎖存允許)信號變高的同時出現(xiàn)的,并在ALE由高變低時,將出現(xiàn)在P0口的地址信號鎖存到外部地址鎖存器74HC373中,直到下一次ALE變高時,地址才發(fā)生變化。第一百一十二頁,共一百四十一頁,編輯于2023年,星期日8.2.1片外三總線結(jié)構(gòu)所謂總線,就是連接系統(tǒng)中各擴(kuò)展部件的一組公共信號線。按照功能,通常把系統(tǒng)總線分為3組,即地址總線、數(shù)據(jù)總線和控制總線。89C51單片機(jī)的片外引腳可構(gòu)成如圖825所示的并行三總線結(jié)構(gòu),所有的外圍芯片都將通過這三種總線進(jìn)行擴(kuò)展。第一百一十三頁,共一百四十一頁,編輯于2023年,星期日1.地址總線地址總線(AddressBus,AB)用于傳送單片機(jī)送出的地址信號,以便進(jìn)行存儲單元和I/O端口的選擇。地址總線是單向的,只能由單片機(jī)向外發(fā)送信息。地址總線的數(shù)目決定了可直接訪問的存儲單元的數(shù)目。例如,n位地址可以產(chǎn)生2n個連續(xù)地址編碼,因此,可訪問2n個存儲單元,即通常所說的尋址范圍為2n個地址單元。89C51單片機(jī)存儲器擴(kuò)展最多可達(dá)64KB,即216個地址單元,因此,最多需16位地址。第一百一十四頁,共一百四十一頁,編輯于2023年,星期日2.數(shù)據(jù)總線數(shù)據(jù)總線(DataBus,DB)用于單片機(jī)與存儲器之間或單片機(jī)與I/O端口之間傳送數(shù)據(jù)。數(shù)據(jù)總線的位數(shù)與單片機(jī)處理數(shù)據(jù)的字長一致。例如,89C51單片機(jī)是8位字長,所以,數(shù)據(jù)總線的位數(shù)也是8位。數(shù)據(jù)總線是雙向的,可以進(jìn)行兩個方向的數(shù)據(jù)傳送。第一百一十五頁,共一百四十一頁,編輯于2023年,星期日3.控制總線控制總線(ControlBus,CB)是單片機(jī)發(fā)出的以控制片外ROM、RAM和I/O口讀/寫操作的一組控制線。第一百一十六頁,共一百四十一頁,編輯于2023年,星期日8.2.2系統(tǒng)擴(kuò)展的實(shí)現(xiàn)1.以P0口作地址/數(shù)據(jù)總線此處的地址總線是指系統(tǒng)的低8位地址線。因?yàn)镻0口線既用作地址線,又用作數(shù)據(jù)線(分時使用),因此,需要加一個8位鎖存器。在實(shí)際應(yīng)用時,先把低8位地址送鎖存器暫存,然后再由地址鎖存器給系統(tǒng)提供低8位地址,而把P0口線作為數(shù)據(jù)線使用。實(shí)際上,單片機(jī)P0口的電路設(shè)計已考慮了這種應(yīng)用需要,P0口線電路中的多路轉(zhuǎn)接電路MUX以及地址/數(shù)據(jù)控制即是為此目的而設(shè)計的。第一百一十七頁,共一百四十一頁,編輯于2023年,星期日2.以P2口的口線作高位地址線如果使用P2口的全部8位口線,再加上P0口提供的低8位地址,便可形成完整的16位地址總線,使單片機(jī)系統(tǒng)的尋址范圍達(dá)到64KB。但實(shí)際應(yīng)用系統(tǒng)中,高位地址線并不固定為8位,需要用幾位就從P2口中引出幾條口線。第一百一十八頁,共一百四十一頁,編輯于2023年,星期日

除了地址線和數(shù)據(jù)線之外,在擴(kuò)展系統(tǒng)中還需要一些控制信號線,以構(gòu)成擴(kuò)展系統(tǒng)的控制總線。這些信號有的是單片機(jī)引腳的第一功能信號,有的則是第二功能信號。其中包括:使用ALE作為地址鎖存的選通信號,以實(shí)現(xiàn)低8位地址的鎖存;以PSEN信號作為擴(kuò)展程序存儲器的讀選通信號;以EA信號作為內(nèi)、外程序存儲器的選擇信號;以RD和WR作為擴(kuò)展數(shù)據(jù)存儲器和I/O端口的讀/寫選通信號。執(zhí)行MOVX指令時,這兩個信號分別自動有效。第一百一十九頁,共一百四十一頁,編輯于2023年,星期日可以看出,盡管89C51單片機(jī)號稱有4個I/O口,共32條口線,但由于系統(tǒng)擴(kuò)展的需要,真正能作為數(shù)據(jù)I/O使用的,就只剩下P1口和P3口的部分口線了。特別需要強(qiáng)調(diào)的是,程序存儲器不應(yīng)再采用外擴(kuò)的方案。因?yàn)?9系列單片機(jī)內(nèi)有4~32KB的不同型號產(chǎn)品可供選擇。如果課題需要功能更強(qiáng)的MCU,則可選擇ADμC8××、C8051F×××和MAX7651等SOC芯片。關(guān)于程序存儲器的擴(kuò)展,本教程不作介紹。第一百二十頁,共一百四十一頁,編輯于2023年,星期日8.3擴(kuò)展數(shù)據(jù)存儲器由于89C51單片機(jī)片內(nèi)RAM僅有128字節(jié),當(dāng)系統(tǒng)需要較大容量RAM時,就需要片外擴(kuò)展數(shù)據(jù)存儲器RAM,最大可擴(kuò)展64KB。由于單片機(jī)是面向控制的,實(shí)際需要擴(kuò)展容量不大,因此,一般采用靜態(tài)RAM較方便,如6116(2K×8位),6264(8K×8位)。如有特殊需要,可采用62256(32K×8位),628128(128K×8位)等。與動態(tài)RAM相比,靜態(tài)RAM無須考慮保持?jǐn)?shù)據(jù)而設(shè)置的刷新電路,故擴(kuò)展電路較簡單;但由于靜態(tài)RAM是通過有源電路來保持存儲器中的數(shù)據(jù),因此要消耗較多的功率,價格也較高。第一百二十一頁,共一百四十一頁,編輯于2023年,星期日擴(kuò)展數(shù)據(jù)存儲器空間地址,由P2口提供高8位地址,P0口分時提供低8位地址和用作8位雙向數(shù)據(jù)總線。片外數(shù)據(jù)存儲器RAM的讀/寫由89C51的RD(P3.7)和WR(P3.6)信號控制。第一百二十二頁,共一百四十一頁,編輯于2023年,星期日8.3.1常用的數(shù)據(jù)存儲器芯片數(shù)據(jù)存儲器用于存儲現(xiàn)場采集的原始數(shù)據(jù)、運(yùn)算結(jié)果等,所以,外部數(shù)據(jù)存儲器應(yīng)能隨機(jī)讀/寫,通常由半導(dǎo)體靜態(tài)隨機(jī)存取存儲器RAM組成。E2PROM芯片也可用作外部數(shù)據(jù)存儲器,且掉電后信息不丟失。第一百二十三頁,共一百四十一頁,編輯于2023年,星期日1.靜態(tài)RAM(SRAM)芯片目前常用的靜態(tài)RAM電路有6116、6264、62256、628128等。它們的引腳排列如圖8-27所示。注:6264的26腳為高電平有效的片選端。圖8-27常用靜態(tài)RAM芯片引腳圖第一百二十四頁,共一百四十一頁,編輯于2023年,星期日其引腳功能如下:A0~Ai地址輸入線,i=10(6116),12(6264),14(62256)。D0~D7雙向三態(tài)數(shù)據(jù)線;CE片選信號輸入線,低電平有效,當(dāng)6264的26腳(CS)為高電平,且CE為低電平時。才選中該片;OE讀選通信號輸入線,低電平有效;WE寫允許信號輸入線,低電平有效;VCC工作電源,電壓為+5V;GND線路地。這3種RAM電路的主要技術(shù)特性見表8-5。第一百二十五頁,共一百四十一頁,編輯于2023年,星期日第一百二十六頁,共一百四十一頁,編輯于2023年,星期日靜態(tài)RAM存儲器有讀出、寫入和維持3種工作方式,這些工作方式的操作控制如表8-6所列。第一百二十七頁,共一百四十一頁,編輯于2023年,星期日2串行E2PROM芯片由于串行E2PROM芯片引腳少(一般為8腳),系統(tǒng)擴(kuò)展時占用MCU的I/O口線少,接口簡單,應(yīng)該采用串行擴(kuò)展方案組成系統(tǒng)。串行E2PROM芯片有很多種,如24×××系列和93×××系列等等。但這里要特別推薦XICOR公司的具有E2PROM、看門狗、上電復(fù)位以及電壓監(jiān)控等功能的多用途芯片X5045,芯片引腳及接口電路見圖10-18。因?yàn)橐⒁粋€可靠的系統(tǒng),除需要有用數(shù)據(jù)的存儲外,看門狗和電壓監(jiān)控是十分必要的,所以最好選用一個多功能的芯片。第一百二十八頁,共一百四十一頁,編輯于2

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論