




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章基于MCS51的典型串行總線(xiàn)設(shè)計(jì)8.1概述
8.2RS485總線(xiàn)
8.3SPI總線(xiàn)8.4I2C總線(xiàn)教學(xué)提示:?jiǎn)纹瑱C(jī)應(yīng)用系統(tǒng)涉及到外部設(shè)備的接口與擴(kuò)展。早期單片機(jī)系統(tǒng)大都采用并行總線(xiàn)結(jié)構(gòu),隨著電子和計(jì)算機(jī)技術(shù)的發(fā)展,出現(xiàn)了很多新型的串行數(shù)據(jù)傳輸總線(xiàn)。相應(yīng)地,許多新型外圍器件都支持這些總線(xiàn)接口。串行總線(xiàn)接口靈活,占用單片機(jī)資源少,系統(tǒng)結(jié)構(gòu)簡(jiǎn)化,極易形成用戶(hù)的模塊化結(jié)構(gòu)?,F(xiàn)代單片機(jī)應(yīng)用系統(tǒng)廣泛采用串行總線(xiàn)接口技術(shù)。
教學(xué)要求:本章主要介紹SPI、I2C總線(xiàn)和RS485的工作原理,重點(diǎn)掌握利用MCS51單片機(jī)和相關(guān)接口芯片實(shí)現(xiàn)SPI、I2C和RS485總線(xiàn)的硬件電路設(shè)計(jì)和軟件設(shè)計(jì)方法。
微型計(jì)算機(jī)、單片機(jī)系統(tǒng)大都采用總線(xiàn)結(jié)構(gòu)。這種結(jié)構(gòu)是采用一組公共的信號(hào)線(xiàn)作為微型計(jì)算機(jī)各部件之間的通信線(xiàn),這組公共信號(hào)線(xiàn)就稱(chēng)為總線(xiàn)。單片機(jī)的常用總線(xiàn)有并行總線(xiàn)與串行總線(xiàn)。8.1概述早期的單片機(jī)著力于將CPU與外圍功能單元的集成,完善并行三總線(xiàn)結(jié)構(gòu),以滿(mǎn)足應(yīng)用系統(tǒng)的構(gòu)成與擴(kuò)展。隨著單片機(jī)技術(shù)的發(fā)展,越來(lái)越多的采用串行外設(shè)接口技術(shù)。串行外設(shè)接線(xiàn)靈活,系統(tǒng)結(jié)構(gòu)簡(jiǎn)單,極易形成用戶(hù)的模塊化結(jié)構(gòu),對(duì)于縮短產(chǎn)品開(kāi)發(fā)周期,增加硬件構(gòu)成的靈活性,具有重要的意義。
串行總線(xiàn)可以顯著減少引腳數(shù)量,簡(jiǎn)化系統(tǒng)結(jié)構(gòu)。隨著外圍器件串行接口的發(fā)展,單片機(jī)串行接口的普遍化和高速化使得并行擴(kuò)展接口技術(shù)日漸衰退,推出了刪去并行總線(xiàn)的非總線(xiàn)單片微機(jī),需要外擴(kuò)器件(存儲(chǔ)器、I/O等)時(shí),采用串行擴(kuò)展總線(xiàn),甚至用軟件虛擬串行總線(xiàn)來(lái)實(shí)現(xiàn)。
各大半導(dǎo)體公司生產(chǎn)的四線(xiàn)SPI接口、三線(xiàn)Microwire接口、二線(xiàn)I2C和一線(xiàn)1Wire等接口芯片充滿(mǎn)了電子市場(chǎng)。這些接口主要完成單片機(jī)系統(tǒng)內(nèi)部的設(shè)備連接,主要用于系統(tǒng)內(nèi)芯片之間的數(shù)據(jù)傳輸;還有一些串行總線(xiàn)技術(shù)如RS232、CAN、RS485,主要完成微機(jī)系統(tǒng)之間的連接,稱(chēng)為外部串行總線(xiàn),它們是系統(tǒng)之間的通信用總線(xiàn)。本章主要介紹SPI、I2C和RS485總線(xiàn)的原理。
通用的微處理器都集成有1路或多路硬件UART通道,可以非常方便地實(shí)現(xiàn)串行通信。在工業(yè)控制、電力通訊、智能儀表等領(lǐng)域中,也常常使用簡(jiǎn)便易用的串行通訊方式作為數(shù)據(jù)交換的手段。8.2RS485總線(xiàn)但是,在工業(yè)控制等環(huán)境中,常會(huì)有電氣噪聲干擾傳輸線(xiàn)路,使用RS232通信時(shí)經(jīng)常因外界的電氣干擾而導(dǎo)致信號(hào)傳輸錯(cuò)誤;另外,RS232通信的最大傳輸距離在不增加緩沖器的情況下只可以達(dá)到15米。為了解決上述問(wèn)題,RS485通信方式就應(yīng)運(yùn)而生了。8.2.1RS485電氣特性
電子工業(yè)協(xié)會(huì)(EIA)于1983年制訂并發(fā)布RS485標(biāo)準(zhǔn),并經(jīng)通訊工業(yè)協(xié)會(huì)(TIA)修訂后命名為T(mén)IA/EIA485A,習(xí)慣地稱(chēng)之為RS485標(biāo)準(zhǔn)。RS485標(biāo)準(zhǔn)是為彌補(bǔ)RS232通信距離短、速率低等缺點(diǎn)而產(chǎn)生的。RS485標(biāo)準(zhǔn)只規(guī)定了平衡發(fā)送器和接收器的電特性,而沒(méi)有規(guī)定接插件、傳輸電纜和應(yīng)用層通信協(xié)議。RS485標(biāo)準(zhǔn)與RS232不一樣,其數(shù)據(jù)信號(hào)采用差分傳輸方式(DifferentialDriverMode),也稱(chēng)為平衡傳輸,它使用一對(duì)雙絞線(xiàn),將其中一線(xiàn)定義為A,另一線(xiàn)定義為B,如圖8.1所示。
圖8.1RS485發(fā)送器的示意圖通常情況下,發(fā)送發(fā)送器A、B之間的正電平在+2~+6V范圍內(nèi),是一個(gè)邏輯狀態(tài);負(fù)電平在-2~-6V范圍內(nèi),是另一個(gè)邏輯狀態(tài)。另有一個(gè)信號(hào)地C。在RS485器件中,一般還有一個(gè)“使能”控制信號(hào)?!笆鼓堋毙盘?hào)用于控制發(fā)送發(fā)送器與傳輸線(xiàn)的切斷與連接。當(dāng)“使能”端起作用時(shí),發(fā)送發(fā)送器處于高阻狀態(tài),稱(chēng)為“第三態(tài)”,它是有別于邏輯“1”與“0”的第三種狀態(tài)。
對(duì)于接收發(fā)送器,也作出與發(fā)送發(fā)送器相對(duì)的規(guī)定,收、發(fā)端通過(guò)平衡雙絞線(xiàn)將AA與BB對(duì)應(yīng)相連。當(dāng)在接收端AB之間有大于+200mV的電平時(shí),輸出為正邏輯電平;小于-200mV時(shí),輸出為負(fù)邏輯電平。在接收發(fā)送器的接收平衡線(xiàn)上,電平范圍通常在200mV~6V之間,參見(jiàn)圖8.2所示。
圖8.2RS485接收器的示意圖定義邏輯1(正邏輯電平)為B>A的狀態(tài),邏輯0(負(fù)邏輯電平)為A>B的狀態(tài),A、B之間的壓差不小于200mV。TIA/EIA485串行通信標(biāo)準(zhǔn)的性能如表8.1所示。表8.1TIA/EIA485串行通信標(biāo)準(zhǔn)的性能
RS485標(biāo)準(zhǔn)的最大傳輸距離約為1219米,最大傳輸速率為10Mb/s。通常,RS485網(wǎng)絡(luò)采用平衡雙絞線(xiàn)作為傳輸媒體。平衡雙絞線(xiàn)的長(zhǎng)度與傳輸速率成反比,只有在20kb/s速率以下,才可能使用規(guī)定最長(zhǎng)的電纜長(zhǎng)度。只有在很短的距離下才能獲得最高速率傳輸。一般來(lái)說(shuō),15米長(zhǎng)雙絞線(xiàn)的最大傳輸速率僅為1Mb/s。這里需要注意的是,并不是所有的RS485收發(fā)器都能夠支持高達(dá)10Mb/s的通信速率。如果采用光電隔離方式,則通信速率一般還會(huì)受到光電隔離器件響應(yīng)速度的限制。RS485網(wǎng)絡(luò)采用直線(xiàn)拓樸結(jié)構(gòu),需要安裝2個(gè)終端匹配電阻,其阻值要求等于傳輸電纜的特性阻抗(一般取值為120Ω)。在短距離或低波特率波數(shù)據(jù)傳輸時(shí)可不需終端匹配電阻,即一般在300m、19200b/s以下不需終端匹配電阻。終端匹配電阻安裝在RS485傳輸網(wǎng)絡(luò)的兩個(gè)端點(diǎn),并聯(lián)連接在A(yíng)B引腳之間。
RS485標(biāo)準(zhǔn)通常被用作為一種相對(duì)經(jīng)濟(jì)、具有相當(dāng)高噪聲抑制、相對(duì)高的傳輸速率、傳輸距離遠(yuǎn)、寬共模范圍的通信平臺(tái)。同時(shí),RS485電路具有控制方便、成本低廉等優(yōu)點(diǎn)。在過(guò)去的20年時(shí)間里,建議性標(biāo)準(zhǔn)RS485作為一種多點(diǎn)差分?jǐn)?shù)據(jù)傳輸?shù)碾姎庖?guī)范,被應(yīng)用在許多不同的領(lǐng)域,作為數(shù)據(jù)傳輸鏈路。目前,在我國(guó)應(yīng)用的現(xiàn)場(chǎng)網(wǎng)絡(luò)中,RS485半雙工異步通信總線(xiàn)也是被各個(gè)研發(fā)機(jī)構(gòu)廣泛使用的數(shù)據(jù)通信總線(xiàn)。但是基于在RS485總線(xiàn)上任一時(shí)刻只能存在一個(gè)主機(jī)的特點(diǎn),它往往應(yīng)用在集中控制樞紐與分散控制單元之間。8.2.2RS485總線(xiàn)節(jié)點(diǎn)數(shù)和通信方式
1.節(jié)點(diǎn)數(shù)
所謂節(jié)點(diǎn)數(shù),即每個(gè)RS485接口芯片的驅(qū)動(dòng)器能驅(qū)動(dòng)多少個(gè)標(biāo)準(zhǔn)RS485負(fù)載。根據(jù)規(guī)定,標(biāo)準(zhǔn)RS485接口的輸入阻抗大于等于12kΩ,相應(yīng)的標(biāo)準(zhǔn)驅(qū)動(dòng)節(jié)點(diǎn)數(shù)為32。為適應(yīng)更多節(jié)點(diǎn)的通信場(chǎng)合,有些芯片的輸入阻抗設(shè)計(jì)成1/2負(fù)載(≥24kΩ)、1/4負(fù)載(≥48kΩ),甚至1/8負(fù)載(≥96kΩ),相應(yīng)的節(jié)點(diǎn)數(shù)可增加到64、128和256。表8.2為一些常見(jiàn)芯片的節(jié)點(diǎn)數(shù)。表8.2常見(jiàn)芯片的節(jié)點(diǎn)數(shù)
2.通信方式
RS485總線(xiàn)接口可連接成半雙工和全雙工兩種通信方式,分別如圖8.3和圖8.4所示。半雙工通信的芯片有SN75176、SN75276、SN75LBC184、MAX485、MAX1487、MAX3082、MAX1483等;全雙工通信的芯片有SN75179、SN75180、MAX488~MAX491、MAX1482等。
圖8.3RS485總線(xiàn)的半雙工通信
圖8.4RS485總線(xiàn)的全雙工通信8.2.3RS485總線(xiàn)收發(fā)器與單片機(jī)接口電路的設(shè)計(jì)
當(dāng)單片機(jī)系統(tǒng)使用RS485串行總線(xiàn)進(jìn)行多機(jī)通信時(shí),首先必須將單片機(jī)的串行口和RS485總線(xiàn)收發(fā)器相連。為了提高整個(gè)RS485串行總線(xiàn)網(wǎng)絡(luò)的可靠性,每個(gè)通信節(jié)點(diǎn)中單片機(jī)和收發(fā)器以及總線(xiàn)的接口電路都需要仔細(xì)設(shè)計(jì)。圖8.5為一個(gè)帶有總線(xiàn)保護(hù)的光電隔離的RS485通信節(jié)點(diǎn)的接口電路。
圖8.5RS485應(yīng)用典型電路在圖8.5所示的電路中,RS485的A、B引腳分別進(jìn)行上拉和下拉,以確保即使節(jié)點(diǎn)未連到總線(xiàn)上。A、B引腳上的電壓差仍能使RO輸出為高,避免因總線(xiàn)上的干擾信號(hào)引起單片機(jī)串行口的誤接收。電路中R4和R5為保護(hù)電阻,其作用是隔離本節(jié)點(diǎn)的A、B引腳和總線(xiàn),這樣即使本節(jié)點(diǎn)的A、B引腳對(duì)地?fù)舸?,也不?huì)因此拉低總線(xiàn),影響其他節(jié)點(diǎn)的通信。R2為匹配電阻,用于匹配線(xiàn)路阻抗,吸收反射信號(hào)。由于該電阻接入總線(xiàn)將引起驅(qū)動(dòng)器功耗增加,一般只有當(dāng)總線(xiàn)較長(zhǎng)或者環(huán)境中干擾較強(qiáng)時(shí)使用,否則可以不接。P1.0為芯片控制信號(hào),用來(lái)控制半雙工通信中數(shù)據(jù)的收發(fā)方向。為了防止節(jié)點(diǎn)和總線(xiàn)之間的干擾,RS485與單片機(jī)之間則采用了光電隔離驅(qū)動(dòng)方式,且單片機(jī)和RS485之間的電源也需要進(jìn)行隔離。具體的供電隔離措施應(yīng)根據(jù)環(huán)境合理選擇。例如,當(dāng)應(yīng)用環(huán)境的干擾非常強(qiáng)時(shí),可選擇兩組相互獨(dú)立的電源對(duì)單片機(jī)和總線(xiàn)收發(fā)器部分供電;如果環(huán)境干擾不是很強(qiáng)時(shí),可將單片機(jī)系統(tǒng)供電串接一個(gè)電感后給收發(fā)器供電,接地部分可以同樣處理。另外,當(dāng)多個(gè)節(jié)點(diǎn)接入RS485總線(xiàn)時(shí),這些節(jié)點(diǎn)的收發(fā)器的地線(xiàn)應(yīng)該連接在一起,以避免節(jié)點(diǎn)之間的共模電壓過(guò)大導(dǎo)致收發(fā)器工作不穩(wěn)定甚至損壞。如果工作環(huán)境非常惡劣,例如戶(hù)外應(yīng)用場(chǎng)合,應(yīng)考慮在A(yíng)、B線(xiàn)之間增加浪涌保護(hù)器件,并將器件更換為具有抗雷擊功能的器件,如SN75176。
在上述電路中,單片機(jī)復(fù)位后,P1.0為高電平,相應(yīng)的光耦不導(dǎo)通,RE/DE引腳保持為低,處于數(shù)據(jù)接收狀態(tài),不會(huì)對(duì)總線(xiàn)上其他節(jié)點(diǎn)的通信造成影響。RO端輸出的數(shù)據(jù)通過(guò)光耦輸入到單片機(jī)的RXD引腳。當(dāng)節(jié)點(diǎn)需要發(fā)送數(shù)據(jù)時(shí),首先置P1.0為低電平,相應(yīng)的光耦為高電平,此時(shí)TXD端口出現(xiàn)數(shù)據(jù)通過(guò)光耦輸入DI,驅(qū)動(dòng)總線(xiàn)發(fā)送數(shù)據(jù)。
當(dāng)串行口通信速率不是很高時(shí),上述電路中的P1.0可以直接用TXD取代,這樣發(fā)送數(shù)據(jù)時(shí),就不必先控制P1.0=0,簡(jiǎn)化了控制流程。這種控制方式下串行口的最高通信速率和光耦的導(dǎo)通延遲時(shí)間有關(guān),常見(jiàn)的光耦如TLP521、4N25和PC817等,導(dǎo)通延遲時(shí)間一般在幾微秒,能可靠地應(yīng)用于9600b/s以下的串行通信場(chǎng)合。如果需要進(jìn)行更高速率的串行通信則可選擇導(dǎo)通延遲時(shí)間更小的光耦,如6N137等。當(dāng)RS485總線(xiàn)連接的多個(gè)節(jié)點(diǎn)之間距離很近,干擾也小,例如安裝在一個(gè)機(jī)箱之內(nèi),這時(shí)可以不用光耦進(jìn)行隔離,直接將單片機(jī)的TXD接DI、RXD接DO,通信方向控制端口接RE/DE即可。也可用TXD控制RE/DE,但此時(shí)需先將TXD反相后再連接到RE/DE端。下面以基于單片機(jī)AT89C52的RS485總線(xiàn)現(xiàn)場(chǎng)監(jiān)測(cè)系統(tǒng)為例來(lái)學(xué)習(xí)RS485總線(xiàn)的工作原理。8.2.4基于單片機(jī)節(jié)點(diǎn)的RS485總線(xiàn)的工作原理
1)MAX485介紹
MAX485接口芯片是MAXIM公司的一種RS485芯片,采用單一電源+5V工作,額定電流為300μA,采用半雙工通訊方式。其引腳結(jié)構(gòu)圖如圖8.6所示。從圖中可以看出,MAX485芯片的結(jié)構(gòu)和引腳都非常簡(jiǎn)單,
圖8.6MAX485芯片管腳圖內(nèi)部含有一個(gè)驅(qū)動(dòng)器和接收器。RO和DI端分別為接收器的輸出和驅(qū)動(dòng)器的輸入端,與單片機(jī)連接時(shí)只需分別與單片機(jī)的RXD和TXD相連即可;RE和DE端分別為接收和發(fā)送的使能端,當(dāng)RE為邏輯0時(shí),器件處于接收狀態(tài);當(dāng)DE為邏輯1時(shí),器件處于發(fā)送狀態(tài),因?yàn)镸AX485工作在半雙工狀態(tài),所以只需用單片機(jī)的一個(gè)管腳控制這兩個(gè)引腳即可;A端和B端分別為接收和發(fā)送的差分信號(hào)端,當(dāng)A引腳的電平高于B時(shí),代表發(fā)送的數(shù)據(jù)為1;當(dāng)A的電平低于B端時(shí),代表發(fā)送的數(shù)據(jù)為0。在與單片機(jī)連接時(shí)接線(xiàn)非常簡(jiǎn)單,只需要一個(gè)信號(hào)控制MAX485的接收和發(fā)送即可,同時(shí)在A(yíng)和B端之間加匹配電阻,一般可選120Ω的電阻。表8.3為MAX485引腳功能說(shuō)明。表8.3MAX485引腳功能說(shuō)明
2)單片機(jī)多機(jī)串行通信系統(tǒng)控制位
單片機(jī)采用串行通信來(lái)組成多機(jī)通信。當(dāng)串行口工作在方式2或方式3接收數(shù)據(jù)時(shí),串行口控制器SCON中的SM2位可以作為多機(jī)通信控制位。當(dāng)SM2=1時(shí),單片機(jī)串行口從串行總線(xiàn)上接收一個(gè)字節(jié)數(shù)據(jù)后,只有當(dāng)緊接該字節(jié)的第9位數(shù)據(jù)RB8為1時(shí),該數(shù)據(jù)字節(jié)才會(huì)被裝入SBUF,并置RI為1,表明接收數(shù)據(jù)有效,向CPU申請(qǐng)中斷。如果接收到的第9位數(shù)據(jù)為0,則認(rèn)為該數(shù)據(jù)無(wú)效,不置位RI,CPU也不會(huì)做任何處理。當(dāng)SM2=0時(shí),單片機(jī)的串行口在接收到一個(gè)字節(jié)的數(shù)據(jù)后,不管緊隨其后的第9位數(shù)據(jù)RB8是0還是1,均將該字節(jié)裝入SBUF中,并置RI為1,表明接收數(shù)據(jù)有效,向CPU申請(qǐng)中斷。利用單片機(jī)的上述特性就可以采用RS485總線(xiàn)技術(shù)組成網(wǎng)絡(luò)實(shí)現(xiàn)主從式多機(jī)通信。
3)RS485通信網(wǎng)絡(luò)構(gòu)成和原理
在采用RS485組成的多機(jī)通信網(wǎng)絡(luò)系統(tǒng)中,假設(shè)各個(gè)單片機(jī)都是通過(guò)如圖8.5所示接口電路接入網(wǎng)絡(luò),每個(gè)單片機(jī)輸出的數(shù)據(jù)都可以被除該單片機(jī)之外的其他單片機(jī)收到。每個(gè)單片機(jī)都有一個(gè)唯一的地址,用于主機(jī)對(duì)其尋址。各從機(jī)上電后都將其串行口初始化為9位異步通信接口方式(方式2或者方式3),并置多機(jī)通信位SM2為1,同時(shí)允許接收串行數(shù)據(jù)和允許串行口中斷。
通信是由主機(jī)發(fā)起。當(dāng)主機(jī)需要和某個(gè)從機(jī)通信時(shí),首先發(fā)出尋址命令,當(dāng)從機(jī)響應(yīng)命令并給出回復(fù)后才能進(jìn)行正式的通信(見(jiàn)圖8.7),具體通信過(guò)程描述如下。圖8.7MAX485實(shí)現(xiàn)的半雙工485總線(xiàn)現(xiàn)場(chǎng)監(jiān)測(cè)系統(tǒng)
(1)主機(jī)首先發(fā)出尋址命令,通知從機(jī)準(zhǔn)備進(jìn)行通信時(shí),主機(jī)設(shè)置串行口的第9位數(shù)據(jù)TB8為1,發(fā)送的字節(jié)為被尋址的從機(jī)地址。由于各從機(jī)收到RB8為1,且SM2也為1,故所有從機(jī)在接收到這幀信息后,都會(huì)置中斷標(biāo)志RI為1,CPU響應(yīng)中斷接收該地址字節(jié)。
(2)各從機(jī)判斷接收的地址字節(jié)是否與本機(jī)地址一致。若和本機(jī)地址相符,則將本機(jī)的SM2置0,做好接收數(shù)據(jù)的準(zhǔn)備,如果需要,可按通信協(xié)議回答主機(jī)“從機(jī)已做好通信準(zhǔn)備”;若地址不符合,則從機(jī)保持SM2為1,繼續(xù)等待地址字節(jié),不與主機(jī)進(jìn)行通信。
(3)主機(jī)發(fā)送完地址幀后或當(dāng)主機(jī)收到一個(gè)從機(jī)(只能是一個(gè))的回答后,就可以根據(jù)通信協(xié)議向從機(jī)發(fā)送命令、數(shù)據(jù)。主機(jī)發(fā)送完畢后,如果需要采集從機(jī)的數(shù)據(jù),從機(jī)可根據(jù)通信協(xié)議再向主機(jī)回送數(shù)據(jù)、狀態(tài)和應(yīng)答信息等。在通信過(guò)程中,主機(jī)發(fā)送的數(shù)據(jù)幀中第9位數(shù)據(jù)TB8為0,各從機(jī)收到的RB8也都為0。由于只有一個(gè)被尋址的從機(jī)SM2為0(其他從機(jī)的SM2都為1),所以只有剛才被尋址的的從機(jī)才會(huì)收到主機(jī)后續(xù)的命令和數(shù)據(jù),并置標(biāo)志RI為1,通知CPU對(duì)接收到的數(shù)據(jù)進(jìn)行處理。其他的從機(jī)由于SM2保持為1,所接收的數(shù)據(jù)幀無(wú)效,對(duì)主機(jī)的通信命令或數(shù)據(jù)不會(huì)做任何反應(yīng)。這樣便實(shí)現(xiàn)主機(jī)和從機(jī)之間的一對(duì)一通信。當(dāng)一次通信結(jié)束以后,從機(jī)的SM2再次設(shè)置為1,主機(jī)可以發(fā)送新的尋址幀,開(kāi)始新的一次通信。由于是半雙工通信,所以主機(jī)發(fā)送與接收需要分開(kāi)獨(dú)立運(yùn)行,從機(jī)也是如此。A腳既是接收器的非反向輸入端也是驅(qū)動(dòng)器的非反向輸出端,B腳既是接收器的反向輸入端也是驅(qū)動(dòng)器的反向輸出端,DE和RE引腳電平共同控制發(fā)送和接收的切換。這在后面的硬件、軟件設(shè)計(jì)中均有體現(xiàn)。
4)基于RS485的單片機(jī)主從多機(jī)通信系統(tǒng)
圖8.8所示的是基于RS485總線(xiàn)的多機(jī)通信,由1個(gè)主機(jī)和8個(gè)從機(jī)通過(guò)RS485總線(xiàn)連接在一起。主從機(jī)之間為半雙工通信,由主機(jī)負(fù)責(zé)發(fā)起和管理通信過(guò)程。主機(jī)和從機(jī)都使用P3.4的反相信號(hào)控制MAX485的收發(fā)。通信協(xié)議為:主機(jī)輪流和各從機(jī)通信,主機(jī)首先發(fā)送一個(gè)字節(jié)的地址碼來(lái)尋址從機(jī),然后緊接著發(fā)送16字節(jié)的控制數(shù)據(jù)包。通信系統(tǒng)的幀結(jié)構(gòu)如表8.4所示。
圖8.8RS485總線(xiàn)通信電路圖表8.4通信系統(tǒng)的幀結(jié)構(gòu)其中,校驗(yàn)和為發(fā)送機(jī)地址字段和控制數(shù)據(jù)字段按字節(jié)計(jì)算的累加和,不計(jì)進(jìn)位。主機(jī)的控制數(shù)據(jù)包發(fā)送完成后,被尋址的從機(jī)再向主機(jī)發(fā)送16字節(jié)的采集數(shù)據(jù)包,其結(jié)構(gòu)和控制數(shù)據(jù)包一致。至此,一次通信過(guò)程結(jié)束。不考慮數(shù)據(jù)的具體內(nèi)容及數(shù)據(jù)組織的過(guò)程,使用C51編寫(xiě)程序?qū)崿F(xiàn)上述通信協(xié)議。設(shè)主機(jī)地址為0x0F,從機(jī)地址為0xF0~0xF7,所有單片機(jī)的晶振頻率均設(shè)為11.0592MHz,串行口設(shè)置為9600b/s,8位數(shù)據(jù)位,1停止位,無(wú)校驗(yàn),收發(fā)均為中斷方式。主機(jī)和從機(jī)的程序流程圖如圖8.9和圖8.10所示。根據(jù)通信協(xié)議,在主機(jī)和從機(jī)的程序中都涉及由多個(gè)字節(jié)構(gòu)成的數(shù)據(jù)包的收發(fā)。而且為了提高程序的處理效率,收發(fā)都采用中斷方式進(jìn)行,因此在主程序和中斷服務(wù)程序之間就需要有一種同步的機(jī)制來(lái)協(xié)調(diào)數(shù)據(jù)收發(fā)的過(guò)程。
圖8.9主機(jī)程序流程圖
圖8.10從機(jī)程序流程圖以主機(jī)程序代碼為例,按協(xié)議的要求,主機(jī)首先要發(fā)送地址幀,使被尋址的從機(jī)從等待地址幀的狀態(tài)轉(zhuǎn)換到接收數(shù)據(jù)的狀態(tài)。緊接著主機(jī)需要發(fā)送16字節(jié)的控制數(shù)據(jù)包給被尋址從機(jī),這16個(gè)字節(jié)的發(fā)送都是通過(guò)串行口中斷服務(wù)程序完成的??刂茢?shù)據(jù)包發(fā)完后,主機(jī)要馬上轉(zhuǎn)入接收狀態(tài),接收該從機(jī)發(fā)回的16字節(jié)的數(shù)據(jù)采集信息包,這些數(shù)據(jù)的接收也要在串行口中斷服務(wù)程序中完成。根據(jù)對(duì)通信過(guò)程的分析,從流程圖可以看出,主機(jī)中的主程序只負(fù)責(zé)尋址字節(jié)的發(fā)送,控制數(shù)據(jù)包什么時(shí)候發(fā)送完畢是由串行口中斷服務(wù)程序判斷的,沒(méi)有發(fā)送完控制數(shù)據(jù)包,就不能接收從機(jī)的數(shù)據(jù)采集信息包。為了達(dá)到此目的,主機(jī)程序中設(shè)置了一個(gè)全局變量SendOK,用于主程序和串行口之間針對(duì)是否發(fā)送完控制數(shù)據(jù)包的同步。主程序在發(fā)送尋址幀前,置SendOK=0,表示控制數(shù)據(jù)包沒(méi)發(fā)完,然后主程序循環(huán)判斷SendOK是否為1,不為1表示數(shù)據(jù)沒(méi)發(fā)完,主程序一直等待;串行口中斷服務(wù)程序則在發(fā)生發(fā)送中斷時(shí)執(zhí)行,每次發(fā)送一個(gè)字節(jié)。如果在某次執(zhí)行時(shí)發(fā)現(xiàn)已經(jīng)完成控制數(shù)據(jù)包16字節(jié)的發(fā)送,則置SendOK=1,表示已發(fā)完。接收過(guò)程也使用了同樣的機(jī)制在主程序和串行口中斷服務(wù)程序之間進(jìn)行同步。下面是采用上述協(xié)議的主機(jī)和從機(jī)的代碼。****************************************
Host.c
****************************************
#include<reg51.h>
//用宏定義設(shè)置系統(tǒng)常數(shù),以方便統(tǒng)一修改
#defineHSTADDR0x0f
#defineSLVADDR0xf0
#defineSLVCNT8
#defineBUFSIZE16
#defineOSC
#defineBAUDRATE9600
//定義接收、發(fā)送緩沖區(qū)以及它們的操作指針、操作完成狀態(tài)位。它們是全局變量,本文件
//所有函數(shù)都可以訪(fǎng)問(wèn)。一般程序中用于控制各函數(shù)協(xié)同工作的同步標(biāo)識(shí)等都使用全局變量
unsingnedcharSendBuf[BUFSIZE],Recvbuf[BUFSIZE];
unsingnedcharSPtr,RPtr;
bitSendOK,RecvOK;
voidComISR(void)interrupt4//單片機(jī)串行口中斷服務(wù)程序
{
if(TI)//如果數(shù)據(jù)發(fā)送中斷
{
TI=0;//首先清發(fā)送中斷標(biāo)志位
if(!SendOK)//如果數(shù)據(jù)幀沒(méi)發(fā)送中斷
{
TB=0;//發(fā)送的是數(shù)據(jù)幀,因此將TB8置0
SBUF=SendBuf[SPtr++];//取一個(gè)字節(jié)發(fā)送
if(SPtr>=BUFSIZE)//如果讀指針已指向緩沖區(qū)尾,說(shuō)明數(shù)據(jù)發(fā)送完
SendOK=1;//置發(fā)送完標(biāo)志為1
}
elseSendOK=0;//執(zhí)行到此,說(shuō)明本次中斷是最后一個(gè)發(fā)送字節(jié)引
//發(fā)的,直接將數(shù)據(jù)發(fā)送完標(biāo)志清0即可
}
if(RI)//如果數(shù)據(jù)接收中斷
{
RI=0;//首先清接收中斷標(biāo)志位
RecvBuf[RPtr++]=SBUF;//讀接收的數(shù)據(jù)放入接收數(shù)據(jù)緩沖區(qū)
if(RPtr>=16)//如讀指針數(shù)據(jù)已指向緩沖區(qū)尾,說(shuō)明數(shù)據(jù)收完
RecvOK=1;//置接收完標(biāo)志為1
}
}
voidmian(void)
{
unsignedcharSlaveAddr,SlaveCount,i,CheckSum;
TMOD=0x20;
//T1模式2,波特率發(fā)生器
TL1=256-(OSC/12/16/BAUDRATE);
TH1=256-(OSC/12/16/BAUDRATE);
TR1=1;
SCON=0xd8;
//串口方式3,REN=1,TB8=1,發(fā)地址模式
PCON|=0x80;
//SMOD=1
ES=1;
EA=1;//允許串行口中斷并開(kāi)總中斷
SlaveAddr=SLVADDR;//設(shè)置首先被尋址的從機(jī)地址
SlaveCount=0;
while(1)
{
//假設(shè)發(fā)送數(shù)據(jù)報(bào)已準(zhǔn)備好,下面設(shè)置發(fā)送機(jī)地址,并計(jì)算校驗(yàn)和,填入數(shù)據(jù)包中
SendBuf[0]=HSTADDR;
for(i=1;i<(BUFSIZE-1);i++)SendBuf[i]=0x41+i-1;
CheckSum=0;
for(i=1;i<(BUFSIZE-1);i++)CheckSum+=SendBuf[i];
SendBuf[BUFSIZE-1]=CheckSum;//構(gòu)造一個(gè)模擬的數(shù)據(jù)包用于程序調(diào)試
SendOK=0;//置發(fā)送完標(biāo)志為無(wú)效
SPtr=0;//置發(fā)送緩沖區(qū)讀指針為0,指向第一個(gè)數(shù)據(jù)
TB8=1;//因?yàn)橹鳈C(jī)要首先發(fā)送地址幀,因此置TB8=1
P34=0;//驅(qū)動(dòng)主機(jī)的MAX485處于發(fā)送狀態(tài)
SBUF=(SlaveAddr+SlaveCount);//發(fā)送當(dāng)前被訪(fǎng)問(wèn)的從機(jī)地址
while(!SendOK);//地址幀發(fā)完后,主機(jī)將在單片機(jī)串行口中斷調(diào)
//度下發(fā)完整個(gè)數(shù)據(jù)包,主程序等待發(fā)完標(biāo)志
RecvOK=0;//準(zhǔn)備接受從機(jī)數(shù)據(jù)報(bào),先置接收完標(biāo)志為0
RPcvOK=0;//置接收緩沖區(qū)寫(xiě)指令為0,指向第一個(gè)位置
SM2=0;`//僅采集從機(jī)數(shù)據(jù),因此置多機(jī)通信為0
P34=1;//將主機(jī)RS485驅(qū)動(dòng)為接收方式
while(!RecvOK);//數(shù)據(jù)的接收在中斷服務(wù)程序中完成,主程序只需
//要等待其置接收完標(biāo)志為有效即可
/*…*///此處省略“處理接收到的數(shù)據(jù)”的過(guò)程
SlaveCount++;//計(jì)算下一個(gè)從機(jī)地址,循環(huán)訪(fǎng)問(wèn)8個(gè)從機(jī)
if(SlaveCount==SLVCNT)SlaveCount=0;
}
}****************************************
Slave.c
****************************************
#include<reg51.h>
//用宏定義設(shè)置系統(tǒng)常數(shù),以方便統(tǒng)一修改
#defineHSTADDR0x0f
#defineSLVADDR0xf0
#defineSLVCNT8
#defineBUFSIZE16
#defineOSC
#defineBAUDRATE9600
//定義接收、發(fā)送緩沖區(qū)以及它們的操作指針、操作完成狀態(tài)位。它們是全局變量,本文件
//所有函數(shù)都可以訪(fǎng)問(wèn)。一般程序中用于控制各函數(shù)協(xié)同工作的同步標(biāo)識(shí)等都使用全局變量
unsingnedcharSendBuf[BUFSIZE],Recvbuf[BUFSIZE];
unsingnedcharSPtr,RPtr;
unsingnedcharRecvAddr;
bitSendOK,RecvOK;
voidComISR(void)interrupt4//單片機(jī)串行口中斷服務(wù)程序
{
if(TI)//如果數(shù)據(jù)發(fā)送中斷
{
TI=0;//首先清發(fā)送中斷標(biāo)志位
if(!SendOK)//如果數(shù)據(jù)幀沒(méi)發(fā)送中斷
{
SBUF=SendBuf[SPtr++];//從緩沖區(qū)取一個(gè)字節(jié)發(fā)送
if(SPtr>=BUFSIZE)
SendOK=1;//如果數(shù)據(jù)已發(fā)生完,置發(fā)送完標(biāo)志為1
}
}
if(RI)//如果數(shù)據(jù)接收中斷
{
RI=0;//首先清接收中斷標(biāo)志位
if(RB8)//判斷當(dāng)前是否處于接收地址狀態(tài)
{
RecvAddr=SBUF;//如果是,則該中斷是由主機(jī)發(fā)送地址幀引起
if(RecvAddr==SLVADDR)//判斷主機(jī)是否尋址本機(jī)
SM2=0;//是尋址本機(jī),置多機(jī)通信位無(wú)效,準(zhǔn)備收數(shù)據(jù)
}
}
else//如果RB8無(wú)效,則中斷是由主機(jī)發(fā)數(shù)據(jù)引起
{
RecBuf[RPtr++]=SBUF;//收串口數(shù)據(jù),存入接收緩沖區(qū)
if(RPtr>=BUFSIZE)//如果接收緩沖區(qū)已滿(mǎn),置接收完標(biāo)志為1
RecvOK=1;
}
}
voidmian(void)
{
unsignedchari,CheckSum;
TMOD=0x20;//T1模式2,波特率發(fā)生器
SCON=0xF0;//串口方式3,SM2=1,REN=1,準(zhǔn)備收地址
PCON|=0x80;
TL1=256-(OSC/12/16/BAUDRATE);
TH1=256-(OSC/12/16/BAUDRATE);
TR1=1;
ES=1;
EA=1;//允許串行口中斷并開(kāi)總中斷
while(1)
{
SM2=1;//從機(jī)首先置多機(jī)通信控制位有效
P34=1;//驅(qū)動(dòng)MAX485處于接收狀態(tài),準(zhǔn)備收地址
RecvOK=0;//接收完?duì)顟B(tài)無(wú)效
RPtr=0;//清空接收緩沖區(qū)
while(!RecvOK);//等待主機(jī)完成發(fā)送地址+數(shù)據(jù)的過(guò)程
/*…*///此處省略“處理接收到的數(shù)據(jù)”的過(guò)程
/*…*///此處省略“準(zhǔn)備待發(fā)送數(shù)據(jù)”的過(guò)程
TB8=0;//從機(jī)接收完主機(jī)數(shù)據(jù)后開(kāi)始發(fā)送數(shù)據(jù)
P34=0;//驅(qū)動(dòng)MAX485處于發(fā)送狀態(tài)
SendBuf[0]=SLVADDR;//模擬發(fā)送主機(jī)的數(shù)據(jù)采集/控制包供調(diào)試
for(i=1;i<15;i++)SendBuf[i]=0x61+i-1;
CheckSum=0;
for(i=0;i<15;i++)CheckSum+=SendBuf[i];
SendBuf[15]=CheckSum;
//裝配數(shù)據(jù)并計(jì)算校驗(yàn)和
SendOK=0;
//發(fā)送完標(biāo)志無(wú)效
SPtr=0;//發(fā)送指針指向第一個(gè)字節(jié)
TI=1;//置TI=1,跳轉(zhuǎn)到中斷服務(wù)程序
while(!SendOK);//數(shù)據(jù)報(bào)由中斷服務(wù)程序調(diào)度發(fā)送
//等發(fā)送完標(biāo)志有效后,再等待下一次被尋址
}
}
串行外設(shè)接口(SerialPeripheralInterface,SPI)是Motorola公司提出的一種全雙工同步串行外設(shè)接口,允許單片機(jī)等微控制器與各種外部設(shè)備以同步串行方式進(jìn)行信息交換。由于SPI總線(xiàn)一共只需3~4條數(shù)據(jù)線(xiàn)和控制線(xiàn)即可實(shí)現(xiàn)與具有SPI總線(xiàn)功能的各種I/O器件進(jìn)行連接,8.3SPI總線(xiàn)而擴(kuò)展并行總線(xiàn)則需要8條數(shù)據(jù)線(xiàn)、8~16條地址線(xiàn)、2~3條控制線(xiàn),因此采用SPI總線(xiàn)接口可以簡(jiǎn)化整個(gè)電路的設(shè)計(jì),節(jié)省更多常規(guī)電路中的接口器件和I/O口線(xiàn),并提高了系統(tǒng)的可靠性。8.3.1SPI總線(xiàn)的工作原理
Motorola公司生產(chǎn)的絕大多數(shù)微控制器(MCU)都配有SPI硬件接口。SPI用于CPU與各種外圍設(shè)備器件進(jìn)行全雙工同步串行通信。這些外圍器件可以是簡(jiǎn)單的TTL移位寄存器、復(fù)雜的LCD顯示驅(qū)動(dòng)器、A/D、D/A轉(zhuǎn)換子系統(tǒng)或其他的MCU。SPI只需4條線(xiàn)就可以完成MCU與各種外圍器件的通信,這4條線(xiàn)是:串行時(shí)鐘線(xiàn)(SCK)、主機(jī)輸入/從機(jī)輸出數(shù)據(jù)線(xiàn)(MISO)、主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線(xiàn)(MOSI)、低電平有效從機(jī)選擇線(xiàn)(CS)。在大多數(shù)場(chǎng)合,使用1個(gè)MCU作為主控制器,以控制與一個(gè)或多個(gè)外圍器件進(jìn)行數(shù)據(jù)的傳輸與交換。SPI總線(xiàn)系統(tǒng)的典型結(jié)構(gòu)如圖8.11所示,該系統(tǒng)由一個(gè)主機(jī)、n個(gè)外圍設(shè)備和一個(gè)作為從機(jī)的控制器組成。線(xiàn)路連接的特點(diǎn):主控制器與外圍設(shè)備的同名端相連,串行時(shí)鐘SCLK用于同步SPI總線(xiàn)的MOSI和MISO傳輸信號(hào),每個(gè)外圍設(shè)備或從控制器都有片選信號(hào),主控制器通過(guò)譯碼器來(lái)分時(shí)選通外圍設(shè)備。系統(tǒng)中存在多個(gè)控制器時(shí),應(yīng)明確其主從地位,在某一時(shí)刻只能有一個(gè)控制器為主機(jī),其他均為從機(jī)。SPI工作時(shí),主機(jī)的移位寄存器中的數(shù)據(jù)逐位從輸出引腳(MOSI)輸出(高位在前),同時(shí)從輸入引腳(MISO)接收的數(shù)據(jù)逐位移到移位寄存器(高位在前)。完成一個(gè)字節(jié)發(fā)送后,通過(guò)片選信號(hào),可以從另一個(gè)外圍設(shè)備接收的字節(jié)數(shù)據(jù)進(jìn)入移位寄存器中。
圖8.11SPI總線(xiàn)系統(tǒng)的典型結(jié)構(gòu)框圖
SPI總線(xiàn)的主要特點(diǎn):
①全雙工三線(xiàn)同步傳送;
②可設(shè)置為主機(jī)或從機(jī)工作方式;
③可控制串行時(shí)鐘的相位和極性;
④具有結(jié)束發(fā)送中斷標(biāo)志和寫(xiě)沖突保護(hù)標(biāo)志;
⑤主機(jī)方式時(shí),通信速率可以由編程設(shè)置為4種,最高可達(dá)1.05Mb/s;從機(jī)方式時(shí),通信速率由串行通信時(shí)鐘(SCLK)決定,最高可達(dá)2.1Mb/s;
⑥有多主機(jī)方式出錯(cuò)保護(hù),防止多個(gè)MCU同時(shí)成為串行總線(xiàn)的主機(jī);⑦可方便地與各種串行擴(kuò)展器件接口;
⑧對(duì)于沒(méi)有SPI接口的微處理器,可以用通用的I/O口,用軟件模擬實(shí)現(xiàn)SPI接口。8.3.2SPI總線(xiàn)的通信時(shí)序
SPI串行數(shù)據(jù)通信接口可以配置為四種不同的工作模式(SPI0,SPI1,SPI2,SPI3),如表8.5所示。表中CPHA用來(lái)表示同步時(shí)鐘信號(hào)的相位,CPOL表示同步時(shí)鐘信號(hào)的極性。圖8.12為SPI總線(xiàn)工作的4種模式下SCLK波形示意圖,其中使用的最為廣泛的是SPI0和SPI3方式(實(shí)線(xiàn)表示)。表8.5SPI串行通信接口工作模式
圖8.12SPI總線(xiàn)工作的4種模式時(shí)鐘極性(CPOL)對(duì)傳輸協(xié)議沒(méi)有重大的影響。如果CPOL=0,串行同步時(shí)鐘的空閑狀態(tài)為低電平;如果CPOL=1,串行同步時(shí)鐘的空閑狀態(tài)為高電平。時(shí)鐘相位(CPHA)能夠配置用于選擇兩種不同的傳輸協(xié)議之一進(jìn)行數(shù)據(jù)傳輸。如果CPHA=0,在串行同步時(shí)鐘的第一個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣;如果CPHA=1,在串行同步時(shí)鐘的第二個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣。SPI主模塊和與之通信的外設(shè)時(shí)鐘相位和極性應(yīng)該一致。SPI總線(xiàn)4種模式的接口時(shí)序如圖8.13、圖8.14、圖8.15和圖8.16所示。
圖8.13SPI總線(xiàn)數(shù)據(jù)傳輸時(shí)序圖(SPI0)
圖8.14SPI總線(xiàn)數(shù)據(jù)傳輸時(shí)序圖(SPI1)
圖8.15SPI總線(xiàn)數(shù)據(jù)傳輸時(shí)序圖(SPI2)
圖8.16SPI總線(xiàn)數(shù)據(jù)傳輸時(shí)序圖(SPI3)對(duì)于沒(méi)有SPI接口的單片機(jī)來(lái)說(shuō),可使用軟件來(lái)模擬SPI的操作,包括串行時(shí)鐘、數(shù)據(jù)輸入和輸出,用I/O口線(xiàn)模擬SPI串口通信的方法。8.3.3硬件電路設(shè)計(jì)
MC14489是Motorola公司生產(chǎn)的5位7段LED譯碼驅(qū)動(dòng)芯片,能直接驅(qū)動(dòng)LED數(shù)據(jù)顯示器。使用一個(gè)外接電阻RX即可控制每一段的輸出電流,有三線(xiàn)串行接口(SPI),可直接與具有SPI接口的CPU相連,也可通過(guò)軟件模擬與沒(méi)有SPI接口的CPU配合工作。
1.工作原理
MC14489芯片由24位輸入移位寄存器、位系統(tǒng)設(shè)置寄存器、位顯示寄存器、位選開(kāi)關(guān)、段選開(kāi)關(guān)、位驅(qū)動(dòng)器、段譯碼、驅(qū)動(dòng)器、內(nèi)部振蕩器等組成。在串行輸入使能腳ENABLE為低有效時(shí),串行數(shù)據(jù)輸入到內(nèi)部移位寄存器,ENABLE上升沿把移位寄存器中的數(shù)據(jù)根據(jù)數(shù)據(jù)位數(shù)不同自動(dòng)將8位數(shù)據(jù)裝入系統(tǒng)設(shè)置寄存器或?qū)?4位數(shù)據(jù)裝入顯示寄存器。
2.管腳介紹
圖8.17給出了MC14489芯片的管腳圖。
管腳3:VDD為電源的正極輸入,范圍為4.5~6V。
管腳14:VSS為地。
管腳11:CLOCK為串行數(shù)據(jù)時(shí)鐘輸入端,時(shí)鐘頻率范圍為0~4MHz。
管腳12:DATAIN為串行數(shù)據(jù)輸入端。
管腳18:DATAOUT為串行數(shù)據(jù)輸出端,用于將MC14489各級(jí)級(jí)聯(lián)使用。
管腳8:RX為接外部電流設(shè)置電阻,阻值范圍為700歐姆至無(wú)窮大。管腳10:ENABLE為使能信號(hào)輸入端,低電平有效。
管腳7、6、5、4、2、1、20、19:a~h為陽(yáng)極驅(qū)動(dòng)電流源,若接共陰極LED數(shù)碼管,a~g驅(qū)動(dòng)7段筆劃,h驅(qū)動(dòng)小數(shù)點(diǎn);若接發(fā)光二極管,則應(yīng)采用非譯碼方式,使用a、b、c和d共可控制20只發(fā)光管,同時(shí)h也可控制5只。在此方式下e、f與g不使用。
管腳9、13、15、16、17:BANK1~BANK5為陰極開(kāi)關(guān),可分別接至5組數(shù)碼管或者發(fā)光管的公共陰極。
圖8.17MC14489芯片管腳圖
3.MC14489的主要特性
(1)具有SPI標(biāo)準(zhǔn)的三線(xiàn)串行接口,可直接與具有SPI接口的CPU相連,也可采用軟件模擬SPI接口,最大串行時(shí)鐘頻率可達(dá)4MHz。
(2)有一個(gè)8位的內(nèi)部系統(tǒng)設(shè)置寄存器,用于設(shè)置芯片的工作模式。
(3)有一個(gè)24位顯示寄存器,該寄存器用于存放包括小數(shù)點(diǎn)段在內(nèi)的顯示代碼。
(4)除可通過(guò)一個(gè)公共的外接電阻RX來(lái)確定每一段的最大峰值電流外,還可由輸入的顯示代碼決定全部顯示段為滿(mǎn)亮顯示或半亮度顯示。
(5)通過(guò)系統(tǒng)設(shè)置寄存器的第零位可設(shè)置全部顯示段為全亮或全暗,上電復(fù)位后芯片自動(dòng)處于全暗的低功耗方式。
(6)芯片內(nèi)具有BCD七段譯碼電路,可顯示0~9和A~F十六進(jìn)制數(shù),還可顯示15種其他字符。
(7)多片MC14489可級(jí)聯(lián)使用以增加顯示位數(shù)。
(8)工作電壓范圍:4.5~6V。
4.MC14489的工作時(shí)序
當(dāng)ENABLE腳處于低電平時(shí),CLOCK腳上的一個(gè)時(shí)鐘上升沿就從DATAIN腳串行輸入一位數(shù)據(jù)到內(nèi)部系統(tǒng)設(shè)置寄存器或內(nèi)部顯示寄存器。MC14489采用了所謂“位抓取”技術(shù),在向內(nèi)部系統(tǒng)設(shè)置寄存器和顯示寄存器送數(shù)時(shí)不需要引導(dǎo)碼和地址碼,而是根據(jù)一次串行輸入數(shù)據(jù)的字節(jié)數(shù)由內(nèi)部自動(dòng)確定送往哪一個(gè)寄存器。若輸入是單字節(jié)數(shù)據(jù),將被送往系統(tǒng)設(shè)置寄存器,若輸入的是多字節(jié)數(shù)據(jù),則將被送往顯示寄存器。串行輸入數(shù)據(jù)在MC14489內(nèi)部系統(tǒng)設(shè)置寄存器中各位的作用如圖8.18所示,顯示寄存器中各位的作用如圖8.19所示。
圖8.18MC14489內(nèi)部設(shè)置寄存器中各位的作用
圖8.19MC14489顯示寄存器各位的作用圖8.20為AT89C52與MC14489的硬件連接電路。AT89C52不帶SPI串行總線(xiàn)接口,所以使用軟件來(lái)模擬SPI的操作,包括串行時(shí)鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出。
圖8.20AT89C52與MC14489接口設(shè)計(jì)電路原理圖
AT89C52的P1.0、P1.1和P1.2管腳分別連到MC14489的DATAIN、CLOCK和ENABLE,用來(lái)模擬SPI接口。BANK1~BANK5連接到LED的陰極,a~h連接到LED的陽(yáng)極。8.3.4軟件程序設(shè)計(jì)
以下為在5位LED上顯示“12345”的程序代碼。#include<reg52.h>
#defineucharunsignedchar
sbitDATA=P10;//定義P1.0為DATAIN
sbitCLK=P11;//定義P1.1為CLOCK
sbitENA=P12;//定義P1.2為ENABLE
voidDSPCMD(ucharCMD);//單字節(jié)命令函數(shù),寫(xiě)入MC14489內(nèi)部設(shè)置寄存器
voidDSPDATA(ucharDSCMD,ucharDSDATA1,ucharDSDATA2);
//多字節(jié)命令函數(shù),寫(xiě)入MC14489顯示寄存器
voidmain()
{
DSPCMD(0xEF);//寫(xiě)內(nèi)部設(shè)置寄存器
DSPDATA(0x81,0x23,0x45);//在5位LED上顯示12345,滿(mǎn)亮度顯示
}
/*單字節(jié)命令函數(shù),寫(xiě)入MC14489內(nèi)部設(shè)置寄存器*/
voidDSPCMD(ucharCMD)
{uchari;
ENA=0;//使能MC14489
for(i=8;i>=1;i--)//寫(xiě)入單字節(jié)命令
{
DATA=CMD&0x80;
CMD=CMD<<1;
CLK=0;
CLK=1;
ENA=1;
}
}//禁止MC14489
/*多字節(jié)命令函數(shù),寫(xiě)入MC14489顯示寄存器*/
voidDSPDATA(ucharDSCMD,ucharDSDATA1,ucharDSDATA2)
{ucharDSP,i,j;
i=0;
ENA=0;//使能MC14489
while(i<24)//寫(xiě)入三字節(jié)顯示數(shù)據(jù)
{
if(i<8){DSP=DSCMD;}
elseif(i<16){DSP=DSDATA1;}
else{DSP=DSDATA2;}
for(j=8;j>=1;j--)
{
DATA=DSP&0x80;
DSP=DSP<<1;
CLK=0;
CLK=1;
}
i=i+8;
}
ENA=1;
}//禁止MC14489
目前比較流行的集中串行擴(kuò)展總線(xiàn)中,I2C(InterICBUS)總線(xiàn)以其嚴(yán)格的規(guī)范和眾多的帶I2C接口的外圍芯片而獲得廣泛應(yīng)用。I2C總線(xiàn)是Philips推出的芯片間的串行傳輸總線(xiàn),它以?xún)筛B線(xiàn)實(shí)現(xiàn)了完善的全雙工同步數(shù)據(jù)傳送,可以極方便地構(gòu)成多機(jī)系統(tǒng)和外圍器件擴(kuò)展系統(tǒng)。I2C總線(xiàn)采用了器件地址的硬件設(shè)置方法,通過(guò)軟件尋址完全避免了器件的片選線(xiàn)尋址方法,從而使硬件系統(tǒng)具有最簡(jiǎn)單而靈活的擴(kuò)展方法。8.4I2C總線(xiàn)8.4.1I2C總線(xiàn)的工作原理
I2C總線(xiàn)應(yīng)用系統(tǒng)的典型結(jié)構(gòu)如圖8.21所示。I2C總線(xiàn)的串行數(shù)據(jù)線(xiàn)SDA和串行時(shí)鐘線(xiàn)SCL必須經(jīng)過(guò)上拉電阻R接到正電源上。當(dāng)總線(xiàn)空閑時(shí),SDA和SCL必須保持高電平。為了使總線(xiàn)上所有電路的輸出能完成“線(xiàn)與”的功能,連接到總線(xiàn)上的器件的輸出極必須為“開(kāi)漏”或“開(kāi)集”的形式,所以總線(xiàn)上需要加上拉電阻。
I2C總線(xiàn)是多主機(jī)總線(xiàn),可以有兩個(gè)或更多的能夠控制的設(shè)備與總線(xiàn)連接。I2C總線(xiàn)器件采用硬件設(shè)置地址的方法,器件無(wú)片選線(xiàn),減少了總線(xiàn)的數(shù)量。I2C總線(xiàn)的兩根信號(hào)線(xiàn)是數(shù)據(jù)線(xiàn)(SDA)和時(shí)鐘線(xiàn)(SCL)。所有進(jìn)入I2C總線(xiàn)系統(tǒng)的設(shè)備都帶有I2C總線(xiàn)接口,符合I2C總線(xiàn)電氣規(guī)范特性,將外部設(shè)備的數(shù)據(jù)線(xiàn)(SDA)和時(shí)鐘線(xiàn)(SCL)與I2C總線(xiàn)的SDA、SCL相連即可。各個(gè)外部的設(shè)備的供電可以不同,但是這些設(shè)備需要共地。
圖8.21I2C總線(xiàn)應(yīng)用系統(tǒng)的典型結(jié)構(gòu)
I2C總線(xiàn)的串行數(shù)據(jù)傳送與一般UART的串行數(shù)據(jù)傳送相比,無(wú)論從接口電氣特性、傳送狀態(tài)管理以及程序編制特點(diǎn)都有很大的不同,了解這些特點(diǎn)十分重要。
1)I2C基本特征
(1)二線(xiàn)傳輸。I2C總線(xiàn)上所有的節(jié)點(diǎn),如主器件(單片機(jī)、微處理器)、外圍器件、接口模塊等都連在同名端SCL(時(shí)鐘線(xiàn))和SDA(數(shù)據(jù)線(xiàn))上。
(2)系統(tǒng)中有多個(gè)主器件時(shí),這些器件可以作為總線(xiàn)的主控制器(無(wú)中心主機(jī))。I2C總線(xiàn)工作時(shí)任何一個(gè)主器件都有可能成為主控制器。多機(jī)競(jìng)爭(zhēng)時(shí)的時(shí)鐘同步與總線(xiàn)仲裁都由硬件與軟件模塊自動(dòng)完成。
(3)I2C總線(xiàn)傳輸時(shí),采用狀態(tài)碼管理方法。對(duì)于總線(xiàn)傳輸時(shí)的任何一種狀態(tài),在狀態(tài)寄存器中都會(huì)出現(xiàn)相應(yīng)的狀態(tài)碼,并會(huì)自動(dòng)進(jìn)入相應(yīng)的狀態(tài)處理程序進(jìn)行自動(dòng)處理。
(4)系統(tǒng)中的所有外圍器件和模塊采用器件地址和引腳地址的編址方法。系統(tǒng)中主控制器對(duì)任意節(jié)點(diǎn)的尋址采用純軟件的尋址方式,避免了片選的連線(xiàn)方法。系統(tǒng)中若有地址編碼沖突,可通過(guò)改變地址的引腳電平來(lái)解決。
(5)所有帶有I2C接口的外圍器件都具有應(yīng)答功能。片內(nèi)有多個(gè)單元地址時(shí),數(shù)據(jù)讀寫(xiě)都有自動(dòng)加1功能。這樣,在I2C總線(xiàn)對(duì)某一器件讀寫(xiě)多個(gè)字節(jié)時(shí)很容易實(shí)現(xiàn)自動(dòng)操作,即準(zhǔn)備好讀寫(xiě)入口條件后,只需啟動(dòng)I2C總線(xiàn)就可以完成N個(gè)字節(jié)的讀寫(xiě)操作。
(6)I2C總線(xiàn)的電氣接口由開(kāi)漏晶體管組成,開(kāi)路輸出沒(méi)有連到電源的鉗位二極管,而連到I2C總線(xiàn)的每個(gè)器件上,其自身電源可以獨(dú)立,但須共地??偩€(xiàn)上各個(gè)結(jié)點(diǎn)可以在系統(tǒng)帶電情況下接入或撤出。
I2C總線(xiàn)的時(shí)鐘線(xiàn)SCL和數(shù)據(jù)線(xiàn)SDA都是雙向數(shù)據(jù)線(xiàn)??偩€(xiàn)備用時(shí)二者都必須保持高電平狀態(tài),只有關(guān)閉I2C總線(xiàn)時(shí)才能使SCL鉗位在低電平。在標(biāo)準(zhǔn)I2C模式下數(shù)據(jù)傳送速率可達(dá)100kb/s,高速模式下可達(dá)400kb/s??偩€(xiàn)驅(qū)動(dòng)能力受總線(xiàn)電容限制,不加驅(qū)動(dòng)擴(kuò)展時(shí)驅(qū)動(dòng)能力為400pF。
2)I2C總線(xiàn)信號(hào)定義
I2C總線(xiàn)通過(guò)兩線(xiàn),即串行數(shù)據(jù)(SDA)和串行時(shí)鐘(SCL)線(xiàn),在連接到總線(xiàn)的器件間傳遞信息。每個(gè)器件都有一個(gè)唯一的地址識(shí)別(無(wú)論是微控制器、LCD驅(qū)動(dòng)器、存儲(chǔ)器或鍵盤(pán)接口)而且都可以作為一個(gè)發(fā)送器或接收器(由器件的功能決定)。很明顯,LCD驅(qū)動(dòng)器只是一個(gè)接收器,而存儲(chǔ)器既可以接收又可以發(fā)送數(shù)據(jù)。除了發(fā)送器和接收器外,器件在執(zhí)行數(shù)據(jù)傳輸時(shí)也可以被看做是主機(jī)或從機(jī)(見(jiàn)表8.6)。主機(jī)是初始化總線(xiàn)的數(shù)據(jù)傳輸并產(chǎn)生允許傳輸?shù)臅r(shí)鐘信號(hào)的器件。此時(shí),任何被尋址的器件都被認(rèn)為是從機(jī)。表8.6常見(jiàn)術(shù)語(yǔ)的描述術(shù)語(yǔ)描述發(fā)送器發(fā)送數(shù)據(jù)到總線(xiàn)的器件接收器從總線(xiàn)接收數(shù)據(jù)的器件主機(jī)初始化發(fā)送,產(chǎn)生時(shí)鐘信號(hào)和終止發(fā)送的器件從機(jī)被主機(jī)尋址的器件多主機(jī)同時(shí)有多于一個(gè)主機(jī)嘗試控制總線(xiàn),但不破壞報(bào)文仲裁是一個(gè)在有多個(gè)主機(jī)同時(shí)嘗試控制總線(xiàn),但只允許其中一個(gè)控制總線(xiàn)并使報(bào)文不被破壞的過(guò)程同步兩個(gè)或多個(gè)器件同步時(shí)鐘信號(hào)的過(guò)程SDA線(xiàn)上的數(shù)據(jù)必須在時(shí)鐘的高電平周期保持穩(wěn)定。數(shù)據(jù)線(xiàn)的高或低電平狀態(tài)只有在SCL線(xiàn)的時(shí)鐘信號(hào)是低電平時(shí)才能改變(見(jiàn)圖8.22)。
圖8.22I2C的位傳輸在I2C總線(xiàn)中唯一出現(xiàn)的是被定義為起始條件S和停止條件P如圖8.23所示的情況。起始條件(S):當(dāng)SCL線(xiàn)是高電平時(shí),SDA線(xiàn)從高電平向低電平切換;停止條件(P):當(dāng)SCL線(xiàn)是高電平時(shí),SDA線(xiàn)由低電平向高電平切換。
圖8.23I2C起始和停止條件起始條件和停止條件一般由主機(jī)產(chǎn)生總線(xiàn)在起始條件后被認(rèn)為處于忙的狀態(tài),在停止條件的某段時(shí)間后總線(xiàn)被認(rèn)為再次處于空閑狀態(tài)。
如果產(chǎn)生重復(fù)起始條件(Sr)而不產(chǎn)生停止條件,總線(xiàn)會(huì)一直處于忙的狀態(tài)。此時(shí)的起始條件(S)和重復(fù)起始條件(Sr)在功能上是一樣的(見(jiàn)圖8.23)。
如果連接到總線(xiàn)的器件合并了必要的接口硬件,那么用它們檢測(cè)起始和停止條件十分簡(jiǎn)便。但是沒(méi)有這種接口的微控制器在每個(gè)時(shí)鐘周期至少要采樣SDA線(xiàn)兩次來(lái)判別有沒(méi)有發(fā)生電平切換。8.4.2I2C總線(xiàn)的通信時(shí)序
I2C總線(xiàn)的工作時(shí)序如圖8.24所示。發(fā)送到SDA線(xiàn)上的每個(gè)字節(jié)必須為8位。每次傳輸可以發(fā)送的字節(jié)數(shù)量不受限制。每個(gè)字節(jié)后必須跟一個(gè)響應(yīng)位。首先傳輸?shù)氖菙?shù)據(jù)的最高位(見(jiàn)圖8.24),從機(jī)要完成一些其他功能后(例如一個(gè)內(nèi)部中斷服務(wù)程序)才能接收或發(fā)送下一個(gè)完整的數(shù)據(jù)字節(jié)可以使時(shí)鐘線(xiàn)SCL保持低電平迫使主機(jī)進(jìn)入等待狀態(tài)。當(dāng)從機(jī)準(zhǔn)備好接收下一個(gè)數(shù)據(jù)字節(jié)并釋放時(shí)鐘線(xiàn)SCL后數(shù)據(jù)傳輸繼續(xù)。
圖8.24I2C總線(xiàn)工作時(shí)序圖利用SDA線(xiàn)進(jìn)行數(shù)據(jù)傳送時(shí),發(fā)送器每發(fā)送完一個(gè)數(shù)據(jù)字節(jié)后,都要求接收器發(fā)回一個(gè)應(yīng)答信號(hào)(ACK)。發(fā)送器要接收應(yīng)答信號(hào)仍由主控制器的時(shí)鐘SCL控制傳送。因此主控發(fā)送器必須在接收器發(fā)送應(yīng)答信號(hào)前釋放SDA線(xiàn),使其保持高電平,以便主控制器對(duì)SDA線(xiàn)上應(yīng)答信號(hào)進(jìn)行檢測(cè)。若被控制器由于某種原因無(wú)法繼續(xù)接收SDA線(xiàn)上數(shù)據(jù)時(shí),必須向SDA線(xiàn)輸出一個(gè)非應(yīng)答信號(hào)(NACK),使SDA線(xiàn)保持高電平。主控制器如果收到非應(yīng)答信號(hào)(NACK),就要產(chǎn)生一個(gè)停止信號(hào)來(lái)終止SDA線(xiàn)上的數(shù)據(jù)傳送。
應(yīng)答信號(hào)在第9個(gè)時(shí)鐘位置上出現(xiàn),接收器在SDA線(xiàn)上輸出低電平為應(yīng)對(duì)信號(hào)(ACK),輸出高電平為非應(yīng)答信號(hào)(NACK)。I2C總線(xiàn)時(shí)鐘信號(hào)以及應(yīng)答和非應(yīng)答信號(hào)間的關(guān)系如圖8.25所示。當(dāng)主控制器作為接收器送來(lái)的最后一個(gè)數(shù)據(jù)時(shí),也必須給被控制器發(fā)送一個(gè)非應(yīng)答信號(hào)(NACK)。被控制器收到主控制器發(fā)來(lái)的非應(yīng)答信號(hào)(NACK)后釋放SDA線(xiàn),以便主控制器發(fā)送停止信號(hào)來(lái)結(jié)束數(shù)據(jù)的傳送。I2C總線(xiàn)上的應(yīng)答信號(hào)是比較重要的,它決定了數(shù)據(jù)傳送是否成功,在編程時(shí)應(yīng)該著重考慮。
圖8.25I2C總線(xiàn)響應(yīng)在I2C總線(xiàn)上可以連接多個(gè)外圍器件,所有的外圍器件都有規(guī)范的器件地址。在進(jìn)行數(shù)據(jù)傳送之前,I2C總線(xiàn)會(huì)首先發(fā)送一個(gè)字節(jié)進(jìn)行尋址。這個(gè)字節(jié)是緊跟在起始條件之后發(fā)送的,表示要通信的從器件地址。其格式定義如表8.7所示。表8.7通信從器件地址含義地址信息是7bit,占用了地址字節(jié)的高7位,可以對(duì)127個(gè)器件進(jìn)行尋址。該字節(jié)的第0bit用于表示數(shù)據(jù)的傳送方向:當(dāng)該位是高電平時(shí),表示由從器件向主器件發(fā)送數(shù)據(jù),即主器件對(duì)從器件進(jìn)行讀操作;當(dāng)該位為低電平時(shí),表示由主器件向從器件發(fā)送數(shù)據(jù),即主器件對(duì)從器件進(jìn)行寫(xiě)操作。
起始條件后,總線(xiàn)中各個(gè)器件將自己的地址與主器件送到總線(xiàn)上的器件地址進(jìn)行對(duì)比,如果發(fā)生匹配,該器件認(rèn)為被主器件尋址。一般來(lái)說(shuō),從器件的地址由一部分固定地址和一部分可變地址組成,而可變地址確定了在I2C總線(xiàn)上可容納的此類(lèi)器件的最多數(shù)目。8.4.3硬件電路設(shè)計(jì)
由于標(biāo)準(zhǔn)的MCS51單片機(jī)不具備I2C總線(xiàn)接口,MCS51單片機(jī)在擴(kuò)展具有I2C總線(xiàn)的芯片時(shí)可利用單片機(jī)的I/O接口與之相連,在程序中利用位操作指令和移位指令模仿I2C總線(xiàn)的操作時(shí)序編寫(xiě)相應(yīng)的程序。圖8.26是MCS51單片機(jī)實(shí)現(xiàn)I2C總線(xiàn)的硬件原理圖。
圖8.26單片機(jī)實(shí)現(xiàn)I2C總線(xiàn)硬件原理圖本例的硬件電路設(shè)計(jì)比較簡(jiǎn)單,僅僅利用89C52的兩個(gè)通道I/O口P1.2和P1.3模擬SDA和SCL。注意,因?yàn)镮2C總線(xiàn)的電器特性,SDA和SCL均要接上拉電阻。8.4.4軟件程序設(shè)計(jì)
單片機(jī)模擬I2C總線(xiàn)向從器件發(fā)送數(shù)據(jù)和由從器件接收數(shù)據(jù)的程序流程圖分別如圖8.27和圖8.28所示。
圖8.27向從器件發(fā)送數(shù)據(jù)
圖8.28從器件接收數(shù)據(jù)
程序如下:
#include<reg52.h>//引用標(biāo)準(zhǔn)庫(kù)的頭文件
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitSDA=P1^2;//串行數(shù)據(jù)
sbitSCL=P1^3;//串行時(shí)鐘
ucharidataslave_dev_adr;//從器件地址
ucharidatasendbuf[8];//數(shù)據(jù)發(fā)送緩沖區(qū)
ucharidatarecivebuf[8];//數(shù)據(jù)接收緩沖區(qū)
bitbdataNack;//器件壞或錯(cuò)誤標(biāo)志位
bitbdataNackFlag;//非應(yīng)答標(biāo)志位
voiddelay5us();//延時(shí)約5μs,對(duì)于12M時(shí)鐘
voidstart(void);//起始條件子函數(shù)
voidstop(void);//停止條件子函數(shù)
voidack(void);//發(fā)送應(yīng)答子函數(shù)
voidn_ack(void);//發(fā)送非應(yīng)答子函數(shù)
voidcheckack(void);//應(yīng)答位檢查子函數(shù)
voidsendbyte(ucharidata*ch);//發(fā)送一個(gè)字節(jié)數(shù)據(jù)子函數(shù)
voidrecbyte(ucharidata*ch);//接收一字節(jié)子程序
voidsendnbyte(ucharidata*sla,ucharn);//發(fā)送n字節(jié)數(shù)據(jù)子程序
voidrecnbyte(ucharidata*sla,ucharn);//接收n字節(jié)數(shù)據(jù)子程序
/*主函數(shù),模擬實(shí)現(xiàn)I2C總線(xiàn)的數(shù)據(jù)收發(fā)*/
voidmain(void)
{
uchari,numbyte;
numbyte=8;/*需發(fā)送的8字節(jié)數(shù)據(jù)*/
for(i=0;i<numbyte;i++)
sendbuf[i]=i+0x11;
slave_dev_adr=0x58;//從器件地址
sendnbyte(&slave_dev_adr,numbyte);//向從器件發(fā)送存放在sendbuf[8]中的8字節(jié)數(shù)據(jù)
for(i=0;i<10000;i++)
delay5us();
recnbyte(&slave_dev_adr,numbyte);//由從器件接收8字節(jié)數(shù)據(jù),存放在rbuf中
}
/*延時(shí)約5μs,對(duì)于12M時(shí)鐘*/
voiddelay5us()
{
uinti;
for(i=0;i<5;i++)
_nop_();
}
/*起始條件子函數(shù)*/
voidstar
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國(guó)傳統(tǒng)管理智慧以孝治企
- 2025年黨員領(lǐng)導(dǎo)干部廉潔自律知識(shí)考試題庫(kù)及答案(共250題)
- 出口退稅服務(wù)合同范本
- 《國(guó)際市場(chǎng)營(yíng)銷(xiāo)》課件-第2章 國(guó)際市場(chǎng)營(yíng)銷(xiāo)環(huán)境
- 《國(guó)際市場(chǎng)推廣》課件-項(xiàng)目八 海外社交媒體認(rèn)知
- 杭州市舞蹈工作室租賃合同
- 二零二五年度藝術(shù)品保管與藝術(shù)品展覽展示合同
- 電子信息系統(tǒng)測(cè)試規(guī)范與流程說(shuō)明書(shū)
- 商業(yè)零售店面的經(jīng)營(yíng)策略手冊(cè)
- 智能家居領(lǐng)域智能安防系統(tǒng)設(shè)計(jì)與實(shí)施策略方案
- 金屬冶煉安全事故案例與分析
- 《柯高峰行政監(jiān)察學(xué)》課件
- 2024城市道路路面維修養(yǎng)護(hù)技術(shù)規(guī)程
- 老年糖尿病夜間低血糖的預(yù)防及護(hù)理
- 梅毒病人產(chǎn)后護(hù)理查房
- 小班-語(yǔ)言社會(huì)-幸福的“叮咚”-課件(基礎(chǔ)版)公開(kāi)課教案教學(xué)設(shè)計(jì)課件案例試卷
- 專(zhuān)業(yè)培訓(xùn)金蝶k3wise供應(yīng)鏈系統(tǒng)培訓(xùn)
- 辦公耗材采購(gòu) 投標(biāo)方案(技術(shù)方案)
- 《干部履歷表》填寫(xiě)樣式
- 汽車(chē)電氣設(shè)備檢測(cè)與維修中職全套教學(xué)課件
- 卡支付敏感信息管理實(shí)施細(xì)則
評(píng)論
0/150
提交評(píng)論