版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 隧道防排水專項施工方案改
- 服裝店買賣合同協(xié)議
- 全新員工忠誠承諾與發(fā)展保證
- 便捷辦公服務(wù)協(xié)議
- 分包協(xié)議合同中的權(quán)益保護
- 政府采購合同性質(zhì)的解讀與思考
- 活動板房建設(shè)施工招標
- 油漆工程承攬協(xié)議范本樣本
- 配電工程招投標操作規(guī)范
- 起重機招標文件細節(jié)解析
- 分配利潤合同范例
- 《中國喪葬禮儀》課件
- 華為ICT大賽(網(wǎng)絡(luò)賽道)高頻備考試題及答案
- 2024年1月福建高中學(xué)業(yè)水平合格考物理試卷真題(含答案解析)
- 昆明理工大學(xué)《自然語言處理》2023-2024學(xué)年第一學(xué)期期末試卷
- 中國高血壓防治指南(2024年修訂版)解讀課件
- 水利水電工程施工生涯發(fā)展展示
- 仲愷農(nóng)業(yè)工程學(xué)院《C程序設(shè)計》2021-2022學(xué)年期末試卷
- 2024年護士資格考試專業(yè)實務(wù)試卷及解答參考
- GB/T 44815-2024激光器和激光相關(guān)設(shè)備激光束偏振特性測量方法
- 住建局條文解讀新規(guī)JGJT46-2024《施工現(xiàn)場臨時用電安全技術(shù)標準》
評論
0/150
提交評論