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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

●?8位分辨率;

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

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

●?5V電源供電時輸入電壓為0V~5V;

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

●一般功耗僅為15?mW;

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

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

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

2.?ADC0832驅(qū)動程序的設(shè)計

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

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

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

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

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

NAMEADC0832

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

;模塊名:ADC0832.a51

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

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

ADCS BITP3.2 ;片選端

ADCLK BITP3.3 ;時鐘端

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 ;準備送后面8個時鐘脈沖

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

MOV ACC.0,C

RL A ;左移一次

SETB ADCLK

NOP

NOP

CLR ADCLK ;形成一次時鐘脈沖

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 ;形成一次時鐘脈沖

NOP

NOP

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

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

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ū)動模塊,對采集的數(shù)據(jù)要作一個分解和轉(zhuǎn)換成ASCII碼的處理。用Keil匯編時,要把LCD1602.a51和ADC0832.a51加入到項目中。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 ;計算成相應(yīng)的電壓值

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

MOVR5,#4 ;要顯示4個字符

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

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

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

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

;子程序名稱:ADC_CAL

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

;計算公式:電壓的10倍?=?A

(5/255)

10?≈?A

50/256;程序中采用的這個算法簡單,但會有

;小誤差

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

ADC_CAL:MOVB,#50 ;乘以50

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

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

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

DIVAB

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

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

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

ADDA,#30H

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

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

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

RET

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

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

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

以下以TLC1543A/D轉(zhuǎn)換器為例說明如何在MCS-51單片機中模擬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-?為基準電壓正、負端;

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

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

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

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

2.?TLC1543驅(qū)動程序的設(shè)計

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

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

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

NAMETLC1543

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

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 ;時鐘,仿SPI的時鐘線

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

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

;子程序名:READ_TLC1543

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

;參數(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è)計定義,如下

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 ;時鐘,仿SPI的時鐘線

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

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

;子程序名:ADconver

;功能描述:串行A/D轉(zhuǎn)換器TLC1543的驅(qū)動程序;參數(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)移入進位位CY(標號為C)

MOV ADaddr,C;地址從進位位移入TLC1543的串行地址引腳

SETB ADclk ;拉高CLK端

CLR ADclk ;拉低CLK端,形成時鐘脈沖

DJNZ R7,address1

;補充6個脈沖,選中通道后A/D的電容列陣需要充電

MOV R7,#6 ;補充6個脈沖

LOOP1:

SETB ADclk ;拉高CLK端

CLR ADclk ;拉低CLK端,形成時鐘脈沖

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端,形成第二個脈沖的下降沿

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

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

MOV R7,#8 ;準備送后8個時鐘脈沖

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 ;延時

DJNZ R7,$

AJMP MAIN ;循環(huán)

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

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

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

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

#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個字節(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個CLOCK

{

CLOCK=1;CLOCK=0;

}

CS=1;

while(OED==0);

CS=0; //進行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ū)動程序,編寫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è)計

1.?LTC1456簡介

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

CLK:同步時鐘端。

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

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

DOUT:移位寄存器輸出端。

GND:接地端。

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

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

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

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

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

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

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

#include"reg51.h"

sbitDQ=P1^0;

sbitCK=P1^1;

sbitCS=P1^2;

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

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

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總線擴展技術(shù)

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

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

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

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

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

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

I2C總線主要有以下幾個方面的特點:

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

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

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

(4)?PHILIPS公司在推出I2C總線的同時為I2C總線制定了嚴格的規(guī)范。如接口的電氣特性、信號時序、信號傳輸?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總線的外圍器件,各自都有一個唯一確定的地址。任何時刻總線上只有一個主控器件對總線實行控制權(quán),分時實現(xiàn)點對點的數(shù)據(jù)傳送。I2C總線上所有外圍器件都有規(guī)范的器件地址,器件地址由7位組成,它和1位方向位(R/W)構(gòu)成了I2C總線器件的尋址字節(jié)SLA,格式如下:(1)?DA7~DA4這4位器件地址是I2C總線器件固有的地址編碼,器件出廠時就已給定(如表12.2所示),用戶不能自行設(shè)置。

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

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

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

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

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

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

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

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

1.典型信號模擬子程序

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

(1)啟動信號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ù)傳送時序要求編制的以下子程序:

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

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

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

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

發(fā)送N個字節(jié)數(shù)據(jù)子程序WRNBYTE按照I2C總線數(shù)據(jù)傳送時序要求,一次完整的數(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個字節(jié)數(shù)據(jù)子程序IRDNBYTE按照I2C總線數(shù)據(jù)傳送時序要求,接收N個字節(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時表示無器件應(yīng)答

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

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

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

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

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

;啟動I2C總線子程序

START:SETBSDA

NOP

SETBSCL ;起始條件建立時間大于4.7μs

NOP

NOP

NOP

NOP

NOP

CLRSDA

NOP ;起始條件鎖定時間大于4μs

NOP

NOP

NOP

NOP

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

NOP

RET

;停止IIC總線子程序

STOP: CLRSDA

NOP

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

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

NOP

NOP

NOP

NOP

SETBSDA ;停止總線

NOP ;保證一個終止信號和起始信號的空閑時間大于4.7μs

NOP

NOP

NOP

RET

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

MACK:CLRSDA ;將SDA置0

NOP

NOP

SETBSCL

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

NOP

NOP

NOP

NOP

CLRSCL

NOP

NOP

RET

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

MNACK:SETBSDA ;將SDA置1

NOP

NOP

SETBSCL

NOP

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

NOP

NOP

NOP

CLRSCL

NOP

NOP

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

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

CACK:SETBSDA

NOP

NOP

SETBSCL

CLRACK

NOP

NOP

MOVC,SDA

JC CEND

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

CEND:NOP

CLRSCL

NOP

RET;發(fā)送一個字節(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;讀取一個字節(jié)子程序

;讀出的值在ACC

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

RDBYTE:MOVR0,#08H

RLP: SETBSDA

NOP

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

NOP

NOP

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

MOVA,R2

CLRSCL ;將SCL拉低,時間大于4.7μs

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

MOVR2,A

NOP

NOP

NOP

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

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

;子程序名:IWRNBYTE

;功能: 向器件指定子地址寫N個數(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 ;啟動總線

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個數(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;重新啟動總線

MOVA,SLA

INC A ;準備進行讀操作

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,該如何對它進行操作呢?

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

(1)指定地址讀。

先寫入16位地址:

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

MOV SUBA,#subah ;對指定存儲單元進行寫

MOV SLA,#AT24C256

MOV NUMBYTE,#01H

LCALL IWRNBYTE ;指定子16位地址

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

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

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

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

考慮到帶I2C總線的接口芯片豐富,在51單片機的實際應(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ù)名:一字節(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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論