《單片機(jī)原理與應(yīng)用技術(shù)》課件第12章_第1頁
《單片機(jī)原理與應(yīng)用技術(shù)》課件第12章_第2頁
《單片機(jī)原理與應(yīng)用技術(shù)》課件第12章_第3頁
《單片機(jī)原理與應(yīng)用技術(shù)》課件第12章_第4頁
《單片機(jī)原理與應(yīng)用技術(shù)》課件第12章_第5頁
已閱讀5頁,還剩117頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第12章串行總線擴(kuò)展技術(shù)12.1SPI總線擴(kuò)展技術(shù)12.2I2C總線擴(kuò)展技術(shù)

12.1SPI總線擴(kuò)展技術(shù)

串行外圍設(shè)備接口SPI總線技術(shù)是Motorola公司推出的一種同步串行接口。它可以使MCU與各種外圍設(shè)備以串行方式進(jìn)行通信以此交換信息,如外圍FlashRAM、網(wǎng)絡(luò)控制器、LCD顯示驅(qū)動(dòng)器、A/D、D/A轉(zhuǎn)換器和MCU等。SPI總線系統(tǒng)可直接與各個(gè)廠家生產(chǎn)的多種標(biāo)準(zhǔn)外圍器件直接接口,該接口一般使用3~4根連接線:串行時(shí)鐘線SCK、主機(jī)輸入/從機(jī)輸出數(shù)據(jù)線MISO、主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI(有的SPI接口芯片將主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI合為一根線)和低電平有效的從機(jī)選擇線SS。由于SPI系統(tǒng)總線一共只需3~4位數(shù)據(jù)、控制線,即可實(shí)現(xiàn)與具有SPI總線接口功能的各種I/O器件接口,而擴(kuò)展并行總線則需要8位數(shù)據(jù)線、8~16位地址線、2~3位控制線,因此,采用SPI總線接口可以簡化電路設(shè)計(jì),節(jié)省很多常規(guī)電路中的接口器件和I/O口線,提高設(shè)計(jì)的可靠性。利用SPI總線可在軟件的控制下構(gòu)成各種系統(tǒng)。如一個(gè)“主MCU”與多個(gè)“從MCU”構(gòu)成的系統(tǒng)、多個(gè)“從MCU”相互連接構(gòu)成的多主機(jī)系統(tǒng)(分布式系統(tǒng))、一個(gè)“主MCU”和一個(gè)或多個(gè)“從外圍I/O器件(設(shè)備)”所構(gòu)成的系統(tǒng)等。在大多數(shù)應(yīng)用場合,可使用一個(gè)MCU作為主機(jī)來控制,并向一個(gè)或數(shù)個(gè)“從外圍I/O器件”傳送該數(shù)據(jù)?!皬耐鈬鶬/O器件”只有在主機(jī)發(fā)命令時(shí)才能接收或發(fā)送數(shù)據(jù),其數(shù)據(jù)的傳輸格式是高位(MSB)在前,低位(LSB)在后。這種系統(tǒng)結(jié)構(gòu)如圖12.1所示。圖12.1SPI總線接口系統(tǒng)的典型結(jié)構(gòu)當(dāng)一個(gè)主控機(jī)通過SPI與幾種不同的串行I/O芯片相連時(shí),必須使用每片的允許控制端SS,這可通過MCU的一般I/O端口輸出線來實(shí)現(xiàn)。但應(yīng)該特別注意這些串行I/O芯片的輸入/輸出特性:

(1)輸入芯片的串行數(shù)據(jù)輸出是否有三態(tài)控制端。平時(shí)未選中芯片時(shí),輸出端應(yīng)處于高阻態(tài)。若沒有三態(tài)控制端,則應(yīng)外加三態(tài)門。否則MCU的MISO端只能連接一個(gè)輸入芯片。

(2)輸出芯片的串行數(shù)據(jù)輸入是否有允許控制端。只有在此芯片允許時(shí),SCK脈沖才把串行數(shù)據(jù)移入該芯片;在禁止時(shí),SCK對芯片無影響。若沒有允許控制端,則應(yīng)在外圍用門電路對SCK進(jìn)行控制,然后再加到芯片的時(shí)鐘輸入端;當(dāng)然,也可以只在SPI總線上連接一個(gè)芯片,而不再連接其他輸入或輸出芯片。主機(jī)方式傳送數(shù)據(jù)的最高速率達(dá)到5Mb/s。

對于大多數(shù)不帶SPI串行總線接口的MCS-51系列單片機(jī)來說,可以使用軟件來模擬SPI的操作,包括串行時(shí)鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出。對于不同的串行接口外圍芯片,它們的時(shí)鐘時(shí)序略有不同,編程時(shí)要加以注意。12.1.1ADC0832模塊的設(shè)計(jì)

1.?ADC0832性能特性及基本結(jié)構(gòu)

ADC0832是美國國家半導(dǎo)體公司生產(chǎn)的一種8位分辨率、雙通道A/D轉(zhuǎn)換芯片。ADC0832具有以下特點(diǎn):

●?8位分辨率;

●雙通道A/D轉(zhuǎn)換(差分輸入時(shí)為一個(gè)通道);

●輸入輸出電平與TTL/CMOS相兼容;

●?5V電源供電時(shí)輸入電壓為0V~5V;

●工作頻率為250?kHz,轉(zhuǎn)換時(shí)間為32μs;

●一般功耗僅為15?mW;

●?8P、14P-DIP(雙列直插)、PICC多種封裝;

●商用級芯片溫寬為0℃~70℃,工業(yè)級芯片溫寬為?+40℃~85℃。圖12.2ADC0832的引腳及功能

ADC0832與51單片機(jī)的接口如圖12.3所示,要采用四根連接線,分別是CS、CLK、DO、DI。但由于DO端與DI端在通信時(shí)并未同時(shí)有效,并且與單片機(jī)的接口是雙向的,所以可以將DO和DI并聯(lián)在一根數(shù)據(jù)線上分時(shí)使用,這樣就只需要三根線。圖12.3ADC0832與51單片機(jī)的接口

2.?ADC0832驅(qū)動(dòng)程序的設(shè)計(jì)

如圖12.3所示,當(dāng)ADC0832的控制引腳CS、CLK、DO、DI占用了P3.2、P3.3、P3.4三個(gè)I/O口時(shí),由于DO端和DI端在通信時(shí)并不同時(shí)有效,與單片機(jī)接口又是雙向的,所以可將DO和DI并聯(lián)在一根數(shù)據(jù)線上使用。通過時(shí)序圖12.4,可知道如何對它進(jìn)行控制。圖12.4ADC0832時(shí)序圖

CS作為選通信號,從時(shí)序圖中可以看到,以CS置為低電平開始,一直到置為高電平結(jié)束。CLK提供時(shí)鐘信號,要注意CLK信號的箭頭指向,向上為上升沿有效,向下為下降沿有效。DI、DO作為數(shù)據(jù)端口。

當(dāng)ADC0832未工作時(shí)其CS輸入端應(yīng)為高電平,此時(shí)芯片禁用,CLK和DO/DI的電平可任意。當(dāng)要進(jìn)行A/D轉(zhuǎn)換時(shí),須先將CS使能端置于低電平,并且保持低電平直到轉(zhuǎn)換完全結(jié)束。此時(shí)芯片開始轉(zhuǎn)換工作,同時(shí)由處理器向芯片時(shí)鐘輸入端CLK輸入時(shí)鐘脈沖,DO/DI端則使用DI端輸入通道功能選擇的數(shù)據(jù)信號。其選擇邏輯如表12.1所示。在第一個(gè)時(shí)鐘脈沖下沉之前DI端必須是高電平,表示起始信號。在第二、三個(gè)脈沖下沉之前DI端應(yīng)輸入兩位數(shù)據(jù)(SGL/Dif:單極性/差分;Odd/Even:極性)用于選擇通道功能。例如:當(dāng)兩位數(shù)據(jù)為“0”、“0”時(shí)為差分輸入,將CH0作為正輸入端IN+,CH1作為負(fù)輸入端IN-?進(jìn)行輸入;當(dāng)兩位數(shù)據(jù)為“0”、“1”時(shí)為差分輸入,將CH0作為負(fù)輸入端IN-,CH1作為正輸入端IN+?進(jìn)行輸入;當(dāng)兩位數(shù)據(jù)為“1”、“0”時(shí),只對CH0進(jìn)行單通道轉(zhuǎn)換;當(dāng)兩位數(shù)據(jù)為“1”、“1”時(shí),只對CH1進(jìn)行單通道轉(zhuǎn)換。表12.1ADC0832多路器控制邏輯表

到第三個(gè)脈沖下降之后,DI端的輸入電平就失去了輸入作用,此后DO/DI端則開始利用數(shù)據(jù)輸出DO進(jìn)行轉(zhuǎn)換數(shù)據(jù)的讀取。從第四脈沖下降開始由DO端輸出轉(zhuǎn)換數(shù)據(jù)最高位DATA7,隨后每一個(gè)脈沖下降DO端輸出下一位數(shù)據(jù)。直到第11脈沖時(shí)發(fā)出最低位數(shù)據(jù)DATA0,一個(gè)字節(jié)的數(shù)據(jù)輸出完成。也正是從此位開始輸出下一個(gè)相反字節(jié)的數(shù)據(jù),即從第11個(gè)字節(jié)的下沉輸出DATD0。隨后輸出8位數(shù)據(jù),到第19個(gè)脈沖時(shí)數(shù)據(jù)輸出完成,也標(biāo)志著一次A/D轉(zhuǎn)換的結(jié)束。最后將CS置高電平禁用芯片,直接將轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行處理就可以了??梢?,在完成輸入啟動(dòng)位、通道選擇之后,就開始讀出數(shù)據(jù),轉(zhuǎn)換得到的數(shù)據(jù)被送出了兩次,一次高位在前傳送,一次低位在前傳送。因此,在程序讀取兩次數(shù)據(jù)后,可以加檢驗(yàn)程序來驗(yàn)證數(shù)據(jù)是否被正確讀取。

ADC0832匯編語言的驅(qū)動(dòng)程序如下:

NAMEADC0832

;--------------------------------------------------------------

;模塊名:ADC0832.a51

;--------------------------------------------------------------

;ADC0832與89C51接口的定義,可根據(jù)硬件連線更改

ADCS BITP3.2 ;片選端

ADCLK BITP3.3 ;時(shí)鐘端

ADDO BITP3.4 ;數(shù)據(jù)輸出端(復(fù)用)

ADDI BITP3.4 ;數(shù)據(jù)輸入端

;------------------------------------------------------------------------------

;子程序名:AD0832

;功能:讀取ADC0832的數(shù)據(jù)

;參數(shù):B-選擇通道 ;A-獲得的A/D轉(zhuǎn)換值

;通道設(shè)置CH0CH1 極性

; 1 0+ 單極性

; 1 1 + 單極性

; 0 0+ - 差分

; 0 1- + 差分

;占用寄存器:A、B、R7、Cy

;Examp:

;MOVB,#02H ;單通道ch0

;LCALLAD0832 ;調(diào)用

;MOV30H,A ;轉(zhuǎn)換結(jié)果存30H

;------------------------------------------------------------------------------

PUBLICAD0832 ;聲明AD0832為公用子程序

?PR?AD0832SEGMENTCODE

RSEG?PR?AD0832

AD0832:SETB ADDI ;初始化通道選擇

NOP

NOP

CLR ADCS ;拉低端

NOP

NOP

SETB ADCLK ;拉高CLK端

NOP

NOP

CLR ADCLK ;拉低CLK端,形成下降沿

MOV A, B

MOV C,ACC.1 ;確定取值通道選擇

MOV ADDI,C

NOP

NOP

SETB ADCLK ;拉高CLK端

NOP

NOP

CLR ADCLK ;拉低CLK端,形成下降沿2

MOV A,B

MOV C,ACC.0 ;確定取值通道選擇

MOV ADDI,C

NOP

NOP

SETB ADCLK ;拉高CLK端

NOP

NOP

CLR ADCLK ;拉低CLK端,形成下降沿3

SETB ADDI

NOP

NOP

MOV R7,#8 ;準(zhǔn)備送后面8個(gè)時(shí)鐘脈沖

AD_1: MOV C,ADDO ;接收數(shù)據(jù)

MOV ACC.0,C

RL A ;左移一次

SETB ADCLK

NOP

NOP

CLR ADCLK ;形成一次時(shí)鐘脈沖

NOP

NOP

DJNZ R7,AD_1 ;循環(huán)8次

MOV C,ADDO ;接收數(shù)據(jù)

MOV ACC.0,C

MOV B,A

MOV R7,#8

AD_13: MOV C,ADDO ;接收數(shù)據(jù)

MOV ACC.0,C

RR A ;左移一次

SETB ADCLK

NOP

NOP

CLR ADCLK ;形成一次時(shí)鐘脈沖

NOP

NOP

DJNZ R7,AD_13 ;循環(huán)8次

CJNE A,B,AD0832 ;數(shù)據(jù)校驗(yàn)

SETB ADCS ;拉高端

CLR ADCLK ;拉低CLK端

SETB ADDO ;拉高數(shù)據(jù)端,回到初始狀態(tài)

RET

END

3.?ADC0832模塊的調(diào)用

下面舉例說明ADC0832模塊子程序的調(diào)用,其電路原理如圖12.5所示,利用LM1602顯示ADC0832采集數(shù)據(jù)的結(jié)果。為了適應(yīng)LM1602驅(qū)動(dòng)模塊,對采集的數(shù)據(jù)要作一個(gè)分解和轉(zhuǎn)換成ASCII碼的處理。用Keil匯編時(shí),要把LCD1602.a51和ADC0832.a51加入到項(xiàng)目中。Proteus仿真結(jié)果如圖12.5所示。圖12.5ADC0832仿真效果圖主程序清單如下,說明見注釋。

;-------------------------------------------------------------------------------------;功能:ADC0832數(shù)據(jù)采集的演示主程序

;-------------------------------------------------------------------------------------

EXTRNCODE(LCD_INITIAL);聲明LCD1602模塊公用子程序

EXTRNCODE(LCD_PRINT_S)

EXTRNCODE(LCD_PRINT_CHAR)

EXTRNCODE(AD0832);聲明ADC0832模塊公用子程序

ORG0000H

AJMPMAIN

ORG0030H20

MAIN:ACALLLCD_INITIAL ;LCM1602初始化

MOVA,#81H ;在第1行第1列顯示字符串

MOVDPTR,#TABLE ;字符串首地址放DPTR

LCALLLCD_PRINT_S ;調(diào)用顯示字符串模塊子程序

LOOP:MOVB,#02H ;單通道ch0

LCALLAD0832 ;讀A/D轉(zhuǎn)換結(jié)果

ACALLADC_CAL ;計(jì)算成相應(yīng)的電壓值

MOVA,#0C6H ;在第2行第7列開始顯示

MOVR5,#4 ;要顯示4個(gè)字符

MOVR1,#20H ;第1個(gè)字符存放的首地址為20H

LCALLLCD_PRINT_CHAR ;調(diào)用顯示字符模塊子程序

AJMPLOOP ;循環(huán)讀、計(jì)算、顯示A/D轉(zhuǎn)換結(jié)果

;--------------------------------------------------------------------------------

;子程序名稱:ADC_CAL

;功能:讀A/D轉(zhuǎn)換結(jié)果計(jì)算成相應(yīng)的電壓值,并將此值送LCD顯示

;計(jì)算公式:電壓的10倍?=?A

(5/255)

10?≈?A

50/256;程序中采用的這個(gè)算法簡單,但會(huì)有

;小誤差

;-------------------------------------------------------------------------------------

ADC_CAL:MOVB,#50 ;乘以50

MULAB ;乘的結(jié)果高8位在B,低8位在A

MOVA,B;只取B,相當(dāng)于除以256

MOVB,#10;由于采用的公式放大了10倍,得到 真正的電壓值要除以10

DIVAB

ADDA,#30H ;得到的個(gè)位數(shù)加30H獲得ASCII碼

MOV20H,A ;送LCD的顯示存儲(chǔ)區(qū)

MOVA,B ;余數(shù)為小數(shù)部分,加30H得到ASCII碼

ADDA,#30H

MOV22H,A ;送LCD的顯示存儲(chǔ)區(qū)

MOV21H,#'.' ;小數(shù)點(diǎn)的ASCII碼

MOV23H,#'v' ;“V”的ASCII碼

RET

TABLE:DB"THEVOLTIGEIS",00H ;顯示的字符串,注意:要以00H結(jié)束

END12.1.2TLC1543A/D模塊的設(shè)計(jì)

對于大多數(shù)不帶SPI串行總線接口的MCS-51系列單片機(jī)來說,可以使用軟件來模擬SPI的操作,包括串行時(shí)鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出。對于不同的串行接口外圍芯片,它們的時(shí)鐘時(shí)序略有不同,編程時(shí)要加以注意。

以下以TLC1543A/D轉(zhuǎn)換器為例說明如何在MCS-51單片機(jī)中模擬SPI總線。

1.?TLC1543簡介

TLC1543是TI公司推出的采用SPI技術(shù)的模/數(shù)轉(zhuǎn)換器,它為20腳封裝的CMOS、10位開關(guān)電容逐次A/D逼近模/數(shù)轉(zhuǎn)換器。其封裝如圖12.6所示。圖12.6TLC1543封裝圖

A0~A10為11路模擬輸入端;

REF+?和REF-?為基準(zhǔn)電壓正、負(fù)端;

ADDRESS為串行數(shù)據(jù)輸入端,輸入4位端口地址;

DATAOUT為A/D數(shù)據(jù)輸出端;

I/OCLOCK為數(shù)據(jù)輸入/輸出提供同步時(shí)鐘。

芯片內(nèi)部有一個(gè)14通道多路選擇器,可以選擇11路模擬輸入通道和3路內(nèi)部自測電壓中的任意一路進(jìn)行測試;片內(nèi)設(shè)有采樣-保持電路,在轉(zhuǎn)換結(jié)束時(shí)EOC置高表明轉(zhuǎn)換完成。

2.?TLC1543驅(qū)動(dòng)程序的設(shè)計(jì)

TLC1543具有高速(10μs轉(zhuǎn)換時(shí)間)、高精度(10位分辨率)和低噪聲的特點(diǎn)。

TLC1543工作時(shí)序如圖12.7所示,其工作過程分為兩個(gè)周期:訪問周期和采樣周期。

工作狀態(tài)由CS使能或禁止,工作時(shí)CS必須置低電平。CS為高電平時(shí),I/OCLOCK、ADDRESS被禁止,同時(shí)DATAOUT為高阻狀態(tài)。當(dāng)CPU使CS變低時(shí),TLC1543開始數(shù)據(jù)轉(zhuǎn)換,I/OCLOCK、ADDRESS、DATAOUT脫離高阻狀態(tài)。隨后,CPU向ADDRESS提供四位通道地址,控制14個(gè)模擬通道選擇器從11個(gè)外部模擬輸入,或三個(gè)內(nèi)部自測電壓中選通一路送到采樣保持電路。同時(shí),I/OCLOCK輸入時(shí)鐘時(shí)序,CPU從DATAOUT端接收前一次A/D轉(zhuǎn)換結(jié)果。I/OCLOCK從CPU接收10個(gè)時(shí)鐘長度的時(shí)鐘序列。前四個(gè)時(shí)鐘用于四位地址從ADDRESS端裝載地址寄存器,選擇所需的模擬通道,后六個(gè)時(shí)鐘對模擬輸入的采樣提供控制時(shí)序。模擬輸入的采樣起始于第四個(gè)I/OCLOCK下降沿,而采樣一直持續(xù)六個(gè)I/OCLOCK周期,并一直保持到第10個(gè)I/OCLOCK下降沿。轉(zhuǎn)換過程中,CS的下降沿使DATAOUT引腳脫離高阻狀態(tài)并啟動(dòng)一次I/OCLOCK工作過程,CS的上升沿將終止這個(gè)過程并在規(guī)定的延遲時(shí)間內(nèi)使DATAOUT引腳返回到高阻狀態(tài),經(jīng)過兩個(gè)系統(tǒng)時(shí)鐘周期后禁止I/OCLOCK和ADDRESS端。圖12.7TLC1543時(shí)序圖匯編語言的TLC1543的驅(qū)動(dòng)程序如下:

NAMETLC1543

;定義TLC1543轉(zhuǎn)換芯片的各引腳,根據(jù)硬件設(shè)計(jì)定義,如下

ADCS BIT P3.2 ;片選端(0選中)

ADDout BIT P3.0 ;數(shù)據(jù)端,SPI數(shù)據(jù)輸出線

ADaddr BIT P3.1 ;地址引腳,仿SPI數(shù)據(jù)輸入線

ADclk BIT P3.3 ;時(shí)鐘,仿SPI的時(shí)鐘線

EOC BIT P3.4 ;ADC轉(zhuǎn)換完成標(biāo)志(高電平為結(jié)束)

;-----------------------------------------------------------------------

;子程序名:READ_TLC1543

;功能描述:串行A/D轉(zhuǎn)換器TLC1543的驅(qū)動(dòng)程序

;參數(shù):R2輸入存通道號,如10H,為A1輸入通道號,即00010000B,高四位為地址;

;R0存AD結(jié)果的高2位;R1存AD結(jié)果的低8位

;-----------------------------------------------------------------------

PUBLICREAD_TLC1543 ;聲明AD0832為公用子程序

?PR?READ_TLC1543SEGMENTCODE

RSEG?PR?READ_TLC1543

READ_TLC1543:

;定義TLC1543轉(zhuǎn)換芯片的各引腳,根據(jù)硬件設(shè)計(jì)定義,如下

ADCS EQU P3.2 ;片選端(0選中)

ADDout EQU P3.0 ;數(shù)據(jù)端,SPI數(shù)據(jù)輸出線

ADaddr EQU P3.1 ;地址引腳,仿SPI數(shù)據(jù)輸入線

ADclk EQU P3.3 ;時(shí)鐘,仿SPI的時(shí)鐘線

EOC EQU P3.4 ;ADC轉(zhuǎn)換完成標(biāo)志(高電平為結(jié)束)

;-----------------------------------------------------------------------

;子程序名:ADconver

;功能描述:串行A/D轉(zhuǎn)換器TLC1543的驅(qū)動(dòng)程序;參數(shù):R2輸入存通道號,如10H,為A1輸入通道號,即00010000B,高四位為地址;

;R0存AD結(jié)果的高2位;R1存AD結(jié)果的低8位

;-----------------------------------------------------------------------

ADconver:

CLR ADclk ;前四位地址是ADclk的上升沿有效,這里先將其變成低

CLR ADCS

MOV A,R2 ;R2做通道號,轉(zhuǎn)換前輸入

;送出地址信號

MOV R7,#4 ;設(shè)置地址位數(shù),再由下面循環(huán)送給MCU

address1:

RLC A ;地址按位循環(huán)移入進(jìn)位位CY(標(biāo)號為C)

MOV ADaddr,C;地址從進(jìn)位位移入TLC1543的串行地址引腳

SETB ADclk ;拉高CLK端

CLR ADclk ;拉低CLK端,形成時(shí)鐘脈沖

DJNZ R7,address1

;補(bǔ)充6個(gè)脈沖,選中通道后A/D的電容列陣需要充電

MOV R7,#6 ;補(bǔ)充6個(gè)脈沖

LOOP1:

SETB ADclk ;拉高CLK端

CLR ADclk ;拉低CLK端,形成時(shí)鐘脈沖

DJNZ R7,LOOP1

;等待轉(zhuǎn)換結(jié)束

SETB ADCS

JNB EOC,$ ;判斷是否轉(zhuǎn)換結(jié)束

CLR ADCS

;取高2位到R0

SETB ADDout ;拉高數(shù)據(jù)端,回到初始狀態(tài)

SETB ADclk ;拉高CLK端

MOV C,ADDout ;接收數(shù)據(jù)

MOV ACC.0,C

RL A ;左移一次

CLR ADclk ;拉低CLK端,形成下降沿

SETB ADDout ;拉高數(shù)據(jù)端,回到初始狀態(tài)

SETB ADclk ;拉高CLK端

MOV C,ADDout ;接收第二位數(shù)據(jù)(給R0的)

MOV ACC.0,C

CLR ADclk ;拉低CLK端,形成第二個(gè)脈沖的下降沿

ANL A,#00000011B ;清除A的高六位

MOV R0,A ;保存數(shù)據(jù)

MOV R7,#8 ;準(zhǔn)備送后8個(gè)時(shí)鐘脈沖

LOOP2: ;接收8位數(shù)據(jù)到R1,注釋同上段程序

SETB ADDout

SETB ADclk

MOV C,ADDout

MOV ACC.0,C

RL A

CLR ADclk

DJNZ R7,LOOP2

SETB EOC

SETB ADCS

MOV R1,A

RET

END按圖12.8所示電路,編寫的TLC1543模塊演示主程序的清單如下,其Proteus的仿真結(jié)果如圖12.8所示,為了減少編程,數(shù)據(jù)顯示采用了BCD碼數(shù)碼管。;TLC1543模塊演示主程序

EXTRN CODE(READ_TLC1543);聲明TLC1543模塊公用子程序

ORG0000H

AJMPMAIN

ORG0030H

MAIN:MOVR2,#10H ;選通道1,即00010000,高四位為地址

LCALLREAD_TLC1543 ;調(diào)用AD轉(zhuǎn)換,結(jié)果高2位在R0, 低8位在R1

MOV P0,R0 ;送BCD數(shù)碼管顯示

MOV P2,R1

MOV R7,#0 ;延時(shí)

DJNZ R7,$

AJMP MAIN ;循環(huán)

END采用C語言的TLC1543驅(qū)動(dòng)程序如下:

/*------------------------------------------------------------

功能:TLC1543的驅(qū)動(dòng)程序

------------------------------------------------------------*/

#ifndef_TLC1543_H_

#define_TLC1543_H_

#include<reg52.h>

#include<INTRINS.H>

#defineucharunsignedchar

#defineuintunsignedint

/*------------------------------------------------------------

TLC1543與單片接口的引腳定義

------------------------------------------------------------*/

sbitCLOCK=P3^3;

sbitADDRESS=P3^1;

sbitDATAOUT=P3^0;

sbitCS=P3^2;

sbitOEC=P3^4;

/*------------------------------------------------------------

功能:從TLC1543讀取轉(zhuǎn)換值程序

參數(shù):port-TLC1543的模擬輸入通道號

返回:返回轉(zhuǎn)換的結(jié)果,為2個(gè)字節(jié)

------------------------------------------------------------*/

uintTLC1543_Read(ucharport)

{

uintdataad;

uintdatai;

uchardataal=0,ah=0;

CLOCK=0;

CS=0;

port<<=4;

for(i=0;i<4;i++) //把通道號輸入TLC1543

{

ADDRESS=(bit)(port&0x80);

CLOCK=1;

CLOCK=0;

port<<=1;

}

for(i=0;i<6;i++) //填充6個(gè)CLOCK

{

CLOCK=1;CLOCK=0;

}

CS=1;

while(OED==0);

CS=0; //進(jìn)行A/D轉(zhuǎn)換

_nop_();_nop_();

for(i=0;i<2;i++) //讀取D9、D8,存入高8位

{

DATAOUT=1;

CLOCK=1;

ah<<=1;

if(DATAOUT==1)

{

ah|=0x01;

}

CLOCK=0;

}

for(i=0;i<8;i++) //取D7~D0,存入低8位

{

DATAOUT=1;

CLOCK=1;

al<<=1;

if(DATAOUT==1)

{

al|=0x01;

}

CLOCK=0;

}

CS=1;

ad=ah*256+al; //得到AD值

return(ad);

}

#endif按以上驅(qū)動(dòng)程序,編寫TLC1543的演示程序如下:

#include"TLC1543.h"

main()

{

uintx;

while(1)

{

x=TLC1543_Read(1);

P0=x/256;

P2=x%256;

}

}圖12.8TLC1543仿真效果圖12.1.3LTC1456D/A模塊的設(shè)計(jì)

1.?LTC1456簡介

LTC1456是LINEAR公司生產(chǎn)的一個(gè)12位的DAC轉(zhuǎn)換芯片。它是一個(gè)單電源供電,軌對軌(rail-to-rail,輸入和輸出電壓范圍達(dá)到電源電壓范圍)電壓輸出的D/A轉(zhuǎn)換芯片。它采用三線的串行擴(kuò)展接口。LTC1456有一個(gè)內(nèi)部2.048V的參考電源,可輸出4.095V滿程電壓。LTC1456的工作電壓在4.5?V~5.5V,功耗為2.2mW,常采用8腳SO-8封裝(如圖12.9所示)。圖12.9LTC1456引腳圖其中:

CLK:同步時(shí)鐘端。

DIN:數(shù)據(jù)輸入端。同步時(shí)鐘上升沿時(shí),數(shù)據(jù)進(jìn)入移位寄存器。

CS/LD:片選和數(shù)據(jù)輸入端。低電平時(shí)時(shí)鐘信號使能,數(shù)據(jù)可以進(jìn)入移位寄存器;高電平時(shí),數(shù)據(jù)從移位寄存器進(jìn)入DAC寄存器,從而更新DAC的轉(zhuǎn)換輸出,CLK也在內(nèi)部停止。

DOUT:移位寄存器輸出端。

GND:接地端。

CLR:輸入清零端。低電平時(shí)將清零內(nèi)部移位和DAC寄存器的值,正常時(shí)應(yīng)為高電平。

VOUT:轉(zhuǎn)換電壓輸出端。

VCC:電源,4.5?V~5.5V。

2.?LTC1456驅(qū)動(dòng)程序

LTC1456與51單片機(jī)的接口如圖12.10所示,其時(shí)序如圖12.11所示。圖12.10LTC1456與51單片機(jī)的接口圖12.11LTC1456的時(shí)序根據(jù)時(shí)序編寫的驅(qū)動(dòng)程序如下:

/*------------------------------------------------------------功能:LTC1456的驅(qū)動(dòng)程序

------------------------------------------------------------*/

#include"reg51.h"

sbitDQ=P1^0;

sbitCK=P1^1;

sbitCS=P1^2;

/*------------------------------------------------------------功能:LTC1456的驅(qū)動(dòng)程序

------------------------------------------------------------*/

voidLTC1456_SendDat(unsignedintdat)

{

unsignedchari=0;

CS=1;

CS=0;

for(i=12;i>0;i--){

DQ=dat&0x80;

CK=1;

dat<<=1;

CK=0;

}

CS=1;

CS=0;

}

Voidmain()//主程序

{

unsignedintk=0;

CK=0;

CS=0;

while(1)

{

LTC1456_SendDat(k);

k++;

}

}圖12.12LTC1456仿真效果圖 12.2I2C總線擴(kuò)展技術(shù)

12.2.1I2C總線的協(xié)議簡介

在現(xiàn)代電子系統(tǒng)中,一個(gè)系統(tǒng)中有眾多的IC需要進(jìn)行相互之間以及與外界的通信。為了提高硬件的效率和簡化電路的設(shè)計(jì),PHILIPS公司開發(fā)了一種用于內(nèi)部IC控制的簡單雙向兩線串行總線IIC(InterIntergratedCircuit,又可縮寫為I2C)。PHILIPS及其他廠商提供了種類非常豐富的總線兼容芯片。作為一個(gè)專利的控制總線,I2C實(shí)際上已經(jīng)成為世界性的工業(yè)標(biāo)準(zhǔn)之一。基本的I2C總線規(guī)范于20世紀(jì)80年代發(fā)布,其數(shù)據(jù)傳輸速率在標(biāo)準(zhǔn)模式下為100Kb/s,但隨著數(shù)據(jù)傳輸速率和應(yīng)用功能的迅速增加,I2C總線也增強(qiáng)為快速模式(400Kb/s)甚至高速模式(3.4Mb/s),I2C總線始終和先進(jìn)技術(shù)保持同步,并保持其向下兼容性。

I2C總線采用二線制傳輸,一根是數(shù)據(jù)線SDA,另一根是時(shí)鐘線SCL,所有I2C器件都連接在同名端的SDA和SCL上,每一個(gè)器件有一個(gè)唯一的地址。

I2C總線是一個(gè)多主機(jī)總線,即總線上可以有一個(gè)或多個(gè)主機(jī)(或稱主控制器件),總線運(yùn)行由主機(jī)控制。這里所說的主機(jī)是指啟動(dòng)數(shù)據(jù)的傳送(發(fā)起始信號)、發(fā)出時(shí)鐘信號、發(fā)出終止信號的器件。通常,主機(jī)由單片機(jī)或其他微處理器擔(dān)任,被主機(jī)訪問的器件叫從機(jī)(或稱從器件),它可以是其他單片機(jī),更多的是如A/D、D/A、LED或LCD驅(qū)動(dòng)、時(shí)鐘日歷芯片、串行存儲(chǔ)器等擴(kuò)展芯片。

I2C總線支持多主和主從兩種工作方式。多主方式即總線上可以有多個(gè)主機(jī)的工作方式。I2C總線需通過硬件和軟件仲裁主機(jī)對總線的控制權(quán)。這種方式中,由于存在仲裁總控制權(quán)問題,I2C總線的協(xié)議模擬非常困難,所以一般都采用具有I2C總線接口的單片機(jī)擔(dān)任主機(jī)。目前有很多半導(dǎo)體集成電路上都集成了I2C接口。帶有I2C接口的單片機(jī)有:PHILIPSP87LPC7XX系列,CYGNAL的C8051F0XX系列,MICROCHIP的PIC16C6XX系列等。在主從工作方式中,系統(tǒng)中只有一個(gè)主機(jī),總線上的其他器件都是具有I2C總線接口的外圍從器件(稱為從機(jī)或從器件),總線上只有主機(jī)對I2C總線對從器件的讀/寫訪問,沒有總線的競爭等問題。這種方式下,只需要單片機(jī)模擬主發(fā)送和主接收時(shí)序,就可以完成對從器件的讀寫操作(SCL時(shí)鐘信號由主機(jī)產(chǎn)生)。這種情況下,I2C總線的時(shí)序可以模擬,使I2C總線的使用不受主機(jī)必須帶I2C總線接口的限制?;谝陨峡紤],本章將介紹這種情況下,如何模擬I2C總線的時(shí)序和程序。

在MCS-51系列單片系統(tǒng)的串行總線擴(kuò)展中,經(jīng)常遇到的是以51單片機(jī)為主機(jī),其他器件為從機(jī)的單主機(jī)系統(tǒng),如圖12.13所示。圖12.13單主機(jī)系統(tǒng)I2C總線擴(kuò)展示意圖

I2C總線主要有以下幾個(gè)方面的特點(diǎn):

(1)總線驅(qū)動(dòng)能力強(qiáng)。I2C總線的外圍擴(kuò)展器件都是CMOS型的,功耗極低,因此總線上擴(kuò)展的節(jié)點(diǎn)數(shù)不是由電流負(fù)載能力決定,而是由電容負(fù)載確定。通常I2C總線負(fù)載能力為400pF,據(jù)此可計(jì)算出總線長度及所帶器件的數(shù)量。總線上擴(kuò)展的I2C器件的數(shù)量主要受到器件地址的限制。

(2)任何一個(gè)I2C總線接口的外圍器件,不論其功能差別有多大,都是通過串行數(shù)據(jù)線(SDA)和串行時(shí)鐘線(SCL)連接到I2C總線上的。這一特點(diǎn)給用戶在設(shè)計(jì)應(yīng)用系統(tǒng)時(shí)帶來了極大的方便,用戶不必理解每個(gè)I2C總線接口器件的功能如何,只要將器件的SDA和SCL引腳連到I2C總線上,然后對該器件模塊進(jìn)行獨(dú)立的電路設(shè)計(jì),從而簡化了系統(tǒng)設(shè)計(jì)的復(fù)雜性,提高了系統(tǒng)抗干擾的能力,符合EMC(ElectromagneticCompatibility,電磁兼容性)設(shè)計(jì)原則。

(3)在主從系統(tǒng)中,每個(gè)I2C總線接口芯片具有唯一的器件地址,各器件之間互不干擾,相互之間不能進(jìn)行通信。主機(jī)與I2C器件之間的通信是通過唯一的器件地址來實(shí)現(xiàn)的。

(4)?PHILIPS公司在推出I2C總線的同時(shí)為I2C總線制定了嚴(yán)格的規(guī)范。如接口的電氣特性、信號時(shí)序、信號傳輸?shù)亩x等,這就決定了I2C總線軟件編寫的一致性。

I2C總線器件必須是漏極或集電極開路結(jié)構(gòu),如圖12.14所示,即SDA和SCL接線上必須加上拉電阻RP,其阻值可參考有關(guān)數(shù)據(jù)手冊,通常選(5~10)kΩ。圖12.14I2C總線接口的電路圖12.2.2I2C的尋址方式

所有掛到I2C總線的外圍器件,各自都有一個(gè)唯一確定的地址。任何時(shí)刻總線上只有一個(gè)主控器件對總線實(shí)行控制權(quán),分時(shí)實(shí)現(xiàn)點(diǎn)對點(diǎn)的數(shù)據(jù)傳送。I2C總線上所有外圍器件都有規(guī)范的器件地址,器件地址由7位組成,它和1位方向位(R/W)構(gòu)成了I2C總線器件的尋址字節(jié)SLA,格式如下:(1)?DA7~DA4這4位器件地址是I2C總線器件固有的地址編碼,器件出廠時(shí)就已給定(如表12.2所示),用戶不能自行設(shè)置。

(2)?A2A1A03位引腳地址用于相同地址器件的識別。若I2C總線上掛有相同地址的器件,或同時(shí)掛有多片相同器件,則可用硬件連接方式對3位引腳A2A1A0接VCC或接地,形成器件從地址(SLA)。

(3)?R/W為數(shù)據(jù)傳送方向。R/W=1時(shí),R/W=0主機(jī)接收(讀);=?0時(shí),主機(jī)發(fā)送(寫)。12.2.3I2C總線時(shí)序

I2C總線一次完整的數(shù)據(jù)傳送過程包括起始(S)、發(fā)送尋址字節(jié)(SLAR/W)、應(yīng)答、發(fā)送數(shù)據(jù)、應(yīng)答、…、發(fā)送數(shù)據(jù)、應(yīng)答和終止(P),其時(shí)序如圖12.15所示。

在I2C總線啟動(dòng)后或應(yīng)答信號后的第1~8個(gè)時(shí)鐘脈沖對應(yīng)于一個(gè)字節(jié)的8位數(shù)據(jù)傳送。脈沖高電平期間,數(shù)據(jù)傳送,低電平期間為數(shù)據(jù)準(zhǔn)備,允許總線上數(shù)據(jù)電平變換。

一旦I2C總線啟動(dòng)后,傳送的字節(jié)多少?zèng)]有限制,只要求每傳送一個(gè)字節(jié)后,對方回應(yīng)一個(gè)應(yīng)答位。發(fā)送時(shí),最先發(fā)送的是數(shù)據(jù)的最高位。每次傳送開始有起始信號,結(jié)束時(shí)有停止信號。每傳送完一個(gè)字節(jié),都可以通過對時(shí)鐘線的控制,使傳送暫停。

I2C總線為同步傳輸總線,其信號完全與時(shí)鐘同步。I2C總線上與數(shù)據(jù)傳送有關(guān)的典型信號包括起始信號(S)、停止信號(P)、應(yīng)答位信號(低電平A)和非應(yīng)答信號(高電平A),如圖12.16所示。圖12.15I2C總線時(shí)序圖圖12.16I2C總線數(shù)據(jù)傳送典型信號時(shí)序圖起始信號(S):當(dāng)時(shí)鐘SCL為高電平,數(shù)據(jù)線SDA出現(xiàn)由高到低的電平變化時(shí),啟動(dòng)I2C總線。

停止信號(P):當(dāng)時(shí)鐘SCL為高電平,數(shù)據(jù)線SDA出現(xiàn)由低到高的電平變化時(shí),停止I2C總線數(shù)據(jù)傳送。

應(yīng)答位信號(A):I2C總線上第9個(gè)時(shí)鐘脈沖對應(yīng)于應(yīng)答位。相應(yīng)數(shù)據(jù)線上低電平時(shí)為“應(yīng)答”信號,高電平時(shí)為“非應(yīng)答”信號。12.2.4虛擬I2C總線匯編語言程序

1.典型信號模擬子程序

I2C總線上與數(shù)據(jù)傳送有關(guān)的典型信號包括起始信號(S)、停止信號(P)、應(yīng)答位信號(低電平)和非應(yīng)答信號(高電平A)。虛擬I2C總線的編程首先要根據(jù)這幾個(gè)典型信號的時(shí)序(如圖12.16所示),編制以下子程序:

(1)啟動(dòng)信號START;

(2)終止信號STOP;

(3)發(fā)送應(yīng)答位()MACK;

(4)發(fā)送非應(yīng)答位(A)MNACK;

(5)檢查應(yīng)答位CACK。

2.?dāng)?shù)據(jù)傳送通用子程序

數(shù)據(jù)傳送通用子程序是應(yīng)用典型信號模擬子程序(起始、終止、應(yīng)答和檢查應(yīng)答),并按I2C總線數(shù)據(jù)傳送時(shí)序要求編制的以下子程序:

(1)發(fā)送一字節(jié)數(shù)據(jù)子程序WRBYT;

(2)接收一字節(jié)數(shù)據(jù)子程序RDBYT;

(3)發(fā)送N個(gè)字節(jié)數(shù)據(jù)子程序IWRNBYTE;

(4)接收N個(gè)字節(jié)數(shù)據(jù)子程序IRDNBYTE。其中(3)、(4)兩個(gè)子程序要按以下要求編程:

發(fā)送N個(gè)字節(jié)數(shù)據(jù)子程序WRNBYTE按照I2C總線數(shù)據(jù)傳送時(shí)序要求,一次完整的數(shù)據(jù)發(fā)送過程應(yīng)包括起始(S)、發(fā)送尋址字節(jié)(SLAR/W)、應(yīng)答(A)、發(fā)送數(shù)據(jù)(data)、應(yīng)答、…、發(fā)送數(shù)據(jù)、應(yīng)答和終止(P),其格式如下:其中,陰影部分由主器件發(fā)送,從器件接收;非陰影部分由從器件發(fā)送,主器件接收。接收N個(gè)字節(jié)數(shù)據(jù)子程序IRDNBYTE按照I2C總線數(shù)據(jù)傳送時(shí)序要求,接收N個(gè)字節(jié)數(shù)據(jù)應(yīng)按下列格式編程:其中,陰影部分由主器件發(fā)送,從器件接收;非陰影部分由從器件發(fā)送,主器件接收。全部虛擬I2C總線模塊程序VIIC.a51的清單如下:

;--------------------------------------------------------------

;模塊名:VIIC.a51

;功能:虛擬IIC總線

;--------------------------------------------------------------

;IIC總線與89C51接口的定義(可根據(jù)電路原理圖修改):

SDABITP3.2

SCLBITP3.1

ACKBIT08H ;為調(diào)試/測試位,ACK為0時(shí)表示無器件應(yīng)答

MTDEQU30H ;需寫入設(shè)備的數(shù)據(jù)存放在51內(nèi)部RAM單元的首地址

MRDEQU40H ;從設(shè)備讀出的數(shù)據(jù)存放在51內(nèi)部RAM單元的首地址

SLA DATA 50H ;器件從地址存儲(chǔ)單元(從地址是指設(shè)備地址)

SUBADATA51H ;器件子地址存儲(chǔ)單元(子地址是指設(shè)備內(nèi)部數(shù)據(jù)地址)

NUMBYTEDATA52H;讀/寫的字節(jié)數(shù)存儲(chǔ)單元

;啟動(dòng)I2C總線子程序

START:SETBSDA

NOP

SETBSCL ;起始條件建立時(shí)間大于4.7μs

NOP

NOP

NOP

NOP

NOP

CLRSDA

NOP ;起始條件鎖定時(shí)間大于4μs

NOP

NOP

NOP

NOP

CLRSCL ;鉗住總線,準(zhǔn)備發(fā)數(shù)據(jù)

NOP

RET

;停止IIC總線子程序

STOP: CLRSDA

NOP

SETBSCL ;發(fā)送停止條件的時(shí)鐘信號

NOP ;結(jié)束總線時(shí)間大于4μs

NOP

NOP

NOP

NOP

SETBSDA ;停止總線

NOP ;保證一個(gè)終止信號和起始信號的空閑時(shí)間大于4.7μs

NOP

NOP

NOP

RET

;發(fā)送應(yīng)答信號子程序

MACK:CLRSDA ;將SDA置0

NOP

NOP

SETBSCL

NOP;保持?jǐn)?shù)據(jù)時(shí)間,即SCL為高電平時(shí)大于4.7μs

NOP

NOP

NOP

NOP

CLRSCL

NOP

NOP

RET

;發(fā)送非應(yīng)答信號

MNACK:SETBSDA ;將SDA置1

NOP

NOP

SETBSCL

NOP

NOP ;保持?jǐn)?shù)據(jù)時(shí)間,即SCL為高電平時(shí)大于4.7μs

NOP

NOP

NOP

CLRSCL

NOP

NOP

RET;檢查應(yīng)答位子程序

;返回值,ACK=1時(shí)表示有應(yīng)答

CACK:SETBSDA

NOP

NOP

SETBSCL

CLRACK

NOP

NOP

MOVC,SDA

JC CEND

SETBACK ;判斷應(yīng)答位

CEND:NOP

CLRSCL

NOP

RET;發(fā)送一個(gè)字節(jié)子程序

;字節(jié)數(shù)據(jù)放入ACC

;每發(fā)送一字節(jié)要調(diào)用一次CACK子程序,取應(yīng)答位

WRBYTE:MOV R0,#08H

WLP: RLC A ;取數(shù)據(jù)位

JC WR1

SJMP WR0 ;判斷數(shù)據(jù)位

WLP1:DJNZ R0,WLP

NOP

RET

WR1: SETBSDA ;發(fā)送1

NOP

SETBSCL

NOP

NOP

NOP

NOP

NOP

CLRSCL

SJMPWLP1

WR0: CLRSDA ;發(fā)送0

NOP

SETBSCL

NOP

NOP

NOP

NOP

NOP

CLRSCL

SJMPWLP1;讀取一個(gè)字節(jié)子程序

;讀出的值在ACC

;每取一字節(jié)要發(fā)送一個(gè)應(yīng)答/非應(yīng)答信號

RDBYTE:MOVR0,#08H

RLP: SETBSDA

NOP

SETBSCL ;時(shí)鐘線為高,接收數(shù)據(jù)位

NOP

NOP

MOVC,SDA;讀取數(shù)據(jù)位

MOVA,R2

CLRSCL ;將SCL拉低,時(shí)間大于4.7μs

RLCA ;進(jìn)行數(shù)據(jù)位的處理

MOVR2,A

NOP

NOP

NOP

DJNZR0,RLP;沒到8位,再來一次

RET;----------------------------------------------------------------------------

;子程序名:IWRNBYTE

;功能: 向器件指定子地址寫N個(gè)數(shù)據(jù)

;入口參數(shù):SLA—器件從地址(從地址是指設(shè)備地址)

;SUBA—器件子地址(子地址是指設(shè)備內(nèi)部數(shù)據(jù)地址)

;MTD—51內(nèi)部RAM發(fā)送數(shù)據(jù)緩沖區(qū)首地址

;NUMBYTE—發(fā)送字節(jié)數(shù)

;占用資源:A、R0、R1、R3、CY

;---------------------------------------------------------------------------

IWRNBYTE:MOVA,NUMBYTE

MOVR3,A

LCALLSTART ;啟動(dòng)總線

MOVA,SLA

LCALLWRBYTE ;發(fā)送器件從地址

LCALLCACK

JNBACK,RETWRN ;無應(yīng)答則退出

MOVA,SUBA ;指定子地址

LCALLWRBYTE

LCALLCACK

MOVR1,#MTD

WRDA:MOVA,@R1

LCALLWRBYTE ;開始寫入數(shù)據(jù)

LCALLCACK

JNBACK,IWRNBYTE

INCR1

DJNZR3,WRDA ;判斷寫完沒有

RETWRN:LCALLSTOP

RET;----------------------------------------------------------------------------

;子程序名:IRDNBYTE

;功能:向器件指定子地址讀取N個(gè)數(shù)據(jù)

;入口參數(shù):SLA—器件從地址(從地址是指設(shè)備地址)

;SUBA—器件子地址(子地址是指設(shè)備內(nèi)部數(shù)據(jù)地址)

;MRD—51內(nèi)部RAM接收數(shù)據(jù)緩沖區(qū)首地址

;NUMBYTE—接收的字節(jié)數(shù)

;占用資源:A、R0、R1、R3、CY

;-----------------------------------------------------------------------------------

IRDNBYTE:MOV R3,NUMBYTE

LCALL START

MOV A,SLA

LCALL WRBYTE ;發(fā)送器件從地址

LCALL CACK

JNB ACK,RETRDN

MOV A,SUBA;指定子地址

LCALL WRBYTE

LCALL CACK

LCALLSTART;重新啟動(dòng)總線

MOVA,SLA

INC A ;準(zhǔn)備進(jìn)行讀操作

LCALLWRBYTE

LCALLCACK

JNB ACK,IRDNBYTE

MOVR1,#MRD

RDN1: LCALL RDBYTE ;讀操作開始

MOV @R1,A

DJNZ R3,SACK

LCALL MNACK ;最后一字節(jié)發(fā)非應(yīng)答位

RETRDN: LCALL STOP ;并結(jié)束總線

RET

SACK: LCALL MACK

INC R1

SJMP RDN1此模塊程序提供了8位器件子地址,如果是16位的子地址器件,如AT24C256,該如何對它進(jìn)行操作呢?

可采用現(xiàn)行地址讀/寫的方法:直接調(diào)用IRDBYTE和IWRBYT。

(1)指定地址讀。

先寫入16位地址:

MOV MTD,#suba1 ;把子地址低8位放在MTD的開頭

MOV SUBA,#subah ;對指定存儲(chǔ)單元進(jìn)行寫

MOV SLA,#AT24C256

MOV NUMBYTE,#01H

LCALL IWRNBYTE ;指定子16位地址

再讀入字節(jié)數(shù)據(jù):

LCALLIRDBYTE;讀取一個(gè)字節(jié)

(2)指定地址寫。把子地址的低8位放在MTD的開頭,后面的是數(shù)據(jù),即可調(diào)用IWRNBYTE進(jìn)行寫操作。

MTD區(qū)數(shù)據(jù)存放順序如下:12.2.5虛擬I2C總線C51程序

考慮到帶I2C總線的接口芯片豐富,在51單片機(jī)的實(shí)際應(yīng)用開發(fā)中大多采用C51編程,下面介紹用C語言編寫的虛擬I2C總線的程序。

頭文件程序:

#ifndef_IIC_H_

#define_IIC_H_

#include<reg52.h>

#defineuintunsignedint

#defineucharunsignedchar

sbitSDA=P3^2; //模擬IIC數(shù)據(jù)傳送位

sbitSCL=P3^1; //模擬IIC時(shí)鐘控制位

/*----------------------------------------------------------------

函數(shù)名:一字節(jié)數(shù)據(jù)發(fā)送函數(shù)

參數(shù):c—需發(fā)送的數(shù)據(jù)

----------------------------------------------------------------*/

voidSendByte(ucharc);

/*---------------------------------------------------------------

函數(shù)名:讀取一字節(jié)數(shù)據(jù)函數(shù)

返回參數(shù):無符號8位整型數(shù)uchar

----------------------------------------------------------------*/

ucharRcvByte(void);

/*-------------------------------------------------------------

溫馨提示

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

最新文檔

評論

0/150

提交評論