單片機原理與應用(倪云峰)全書第6章_第1頁
單片機原理與應用(倪云峰)全書第6章_第2頁
單片機原理與應用(倪云峰)全書第6章_第3頁
單片機原理與應用(倪云峰)全書第6章_第4頁
單片機原理與應用(倪云峰)全書第6章_第5頁
已閱讀5頁,還剩105頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第 6 章 基于MCS-51的典型串行總線設計6.1 概述6.2 SPI總線6.3 RS-485總線6.4 I2C總線本章小結習題 第 6 章 基于MCS-51的典型串行總線設計微型計算機、單片機系統(tǒng)大都采用總線結構。這種結構采用一組公共的信號線作為微型計算機各部件之間的通信線,這組公共信號線就稱為總線。單片機的常用總線有并行總線與串行總線兩種。串行總線可以顯著減少引腳數量,簡化系統(tǒng)結構。隨著外圍器件串行接口的發(fā)展,單片機串行接口的普遍化和高速化使得并行擴展接口技術日漸衰退,后來推出了刪去并行總線的非總線單片微機,需要外擴器件(存儲器、I/O等)時,采用串行擴展總線,甚至用軟件虛擬串行總線來實

2、現(xiàn)。6.1 概概 述述第 6 章 基于MCS-51的典型串行總線設計常用的串行總線包括RS-232、CAN、RS-485、I2C總線、SPI總線等。其中,RS-232、RS-485、CAN為外總線,它們是系統(tǒng)之間的通信用總線;I2C、SPI是內總線,主要用于系統(tǒng)內芯片之間的數據傳輸。本章主要介紹SPI、RS-485和I2C總線的原理。第 6 章 基于MCS-51的典型串行總線設計串行外圍設備接口(Serial Peripheral Interface,SPI)總線技術是 Motorola公司推出的一種同步串行外設接口,允許單片機等微控制器與各種外部設備以同步串行方式進行通信以交換信息。由于SP

3、I總線一共只需34條數據線和控制線即可實現(xiàn)與具有SPI總線功能的各種I/O器件的連接,而擴展并行總線則需要8條數據線、816條地址線、23條控制線,因此,采用SPI總線接口可以簡化整個電路的設計,節(jié)省更多常規(guī)電路中的接口器件和I/O口線,提高了系統(tǒng)的可靠性。6.2 SPI 總總 線線第 6 章 基于MCS-51的典型串行總線設計6.2.1 SPI總線的工作原理總線的工作原理Motorola公司生產的絕大多數MCU(微控制器)都配有SPI硬件接口。SPI用于CPU與各種外圍器件進行全雙工、同步串行通信。這些外圍器件可以是簡單的TTL移位寄存器、復雜的LCD顯示驅動器、A/D和D/A轉換子系統(tǒng)或其

4、他的MCU。第 6 章 基于MCS-51的典型串行總線設計SPI只需四條線就可以完成MCU與各種外圍器件的通信,這四條線是:串行時鐘線(SCK)、主機輸入/從機輸出數據線(MISO)、主機輸出/從機輸入數據線(MOSI)、低電平有效從機選擇線()。當SPI工作時,在移位寄存器中的數據逐位從輸出引腳(MOSI)輸出(高位在前),同時從輸入引腳(MISO)接收的數據逐位移到移位寄存器(高位在前)。發(fā)送一個字節(jié)后,從另一個外圍器件接收的字節(jié)數據進入移位寄存器中。主SPI的時鐘信號(SCK)用來保證傳輸的同步。SPI總線的典型系統(tǒng)結構如圖6.1所示。CS第 6 章 基于MCS-51的典型串行總線設計圖

5、6.1 SPI總線的典型系統(tǒng)框圖第 6 章 基于MCS-51的典型串行總線設計SPI總線的主要特點如下:(1) 全雙工三線同步傳送。(2) 可設置為主機或從機的工作方式。(3) 可程控串行時鐘的極性和相位。(4) 具有結束發(fā)送中斷標志和寫沖突保護標志。(5) 主機方式時,位頻率可以有四種(可編程設置),最高可達1.05 MHz;從機方式時,位頻率由外部時鐘決定,最高可達2.1 MHz。(6) 有多主機方式出錯保護,防止多個MCU同時成為串行總線的主機。(7) 可方便地與各種串行擴展器件接口。第 6 章 基于MCS-51的典型串行總線設計6.2.2 SPI總線的通信時序總線的通信時序SPI 模塊

6、和外設進行數據交換時,根據外設工作要求,其輸出串行同步時鐘的極性和相位可以進行配置。圖6.2為SPI總線工作的四種方式,其中使用最為廣泛的是SPI0和SPI3方式(實線表示)。第 6 章 基于MCS-51的典型串行總線設計圖6.2 SPI總線工作的四種方式第 6 章 基于MCS-51的典型串行總線設計時鐘極性(CPOL)對傳輸協(xié)議沒有重大影響,若CPOL=0,則串行同步時鐘的空閑狀態(tài)為低電平;若CPOL=1,則串行同步時鐘的空閑狀態(tài)為高電平。時鐘相位(CPHA)能夠配置為選擇兩種不同的傳輸協(xié)議之一進行數據傳輸。若CPHA=0,則在串行同步時鐘的第一個跳變沿(上升或下降)數據被采樣;若CPHA=

7、1,則在串行同步時鐘的第二個跳變沿(上升或下降)數據被采樣。SPI主模塊和與之通信的外設時鐘的相位和極性應該保持一致。SPI總線接口時序如圖6.3和圖6.4所示。第 6 章 基于MCS-51的典型串行總線設計圖6.3 CPHA=0時SPI總線數據傳輸時序第 6 章 基于MCS-51的典型串行總線設計圖6.4 CPHA=1時SPI總線數據傳輸時序第 6 章 基于MCS-51的典型串行總線設計6.2.3 硬件電路設計硬件電路設計MC14489是Motorola公司生產的5位7段LED譯碼驅動芯片,能直接驅動LED數據顯示器。MC14489使用一個外接電阻Rx即可控制每一段的輸出電流,有三線串行接口

8、(SPI),可直接與具有SPI接口的CPU相連,也可通過軟件模擬與沒有SPI接口的CPU配合工作。第 6 章 基于MCS-51的典型串行總線設計1. 工作原理工作原理MC14489芯片由24位輸入移位寄存器、位系統(tǒng)設置寄存器、位顯示寄存器以及位選開關、段選開關、位驅動器、段譯碼、驅動器、內部振蕩器等組成。在串行輸入使能端為低有效時串行數據輸入到內部移位寄存器,上升沿根據移位寄存器中的數據位數不同自動將8位數據裝入位系統(tǒng)設置寄存器或將24位數據裝入位顯示寄存器。ENABLEENABLE第 6 章 基于MCS-51的典型串行總線設計2. 引腳介紹引腳介紹圖6.5給出了MC14489芯片的引腳圖。引

9、腳3:VDD為電源的正極輸入,范圍為4.56 V。引腳14:VSS為地。引腳11:CLOCK為串行數據時鐘輸入端,時鐘頻率范圍為04 MHz。引腳12:DATAIN為串行數據輸入端。引腳18:DATAOUT為串行數據輸出端,用于將MC14489各級級聯(lián)使用。第 6 章 基于MCS-51的典型串行總線設計引腳8:Rx為外接電流設置電阻,阻值范圍為700 至無窮大。引腳10:為使能信號輸入端,低電平有效。引腳7、6、5、4、2、1、20、19:ah為陽極驅動電流源,若接共陰極LED數碼管,則ag驅動7段筆畫,h驅動小數點;若接發(fā)光二極管,則應采用非譯碼方式,使用a、b、c和d共可控制20只發(fā)光管,

10、同時h也可控制5只,在此方式下e、f與g不使用。引腳9、13、15、16、17:BANK1BANK5為陰極開關,可分別接至5組數碼管或者發(fā)光管的公共陰極。ENABLE第 6 章 基于MCS-51的典型串行總線設計圖6.5 MC14489芯片的引腳圖第 6 章 基于MCS-51的典型串行總線設計3. 硬件連接電路硬件連接電路圖6.6為AT89C52與MC14489的硬件連接電路。AT89C52不帶SPI串行總線接口,所以使用軟件來模擬SPI的操作,包括串行時鐘、數據輸入和數據輸出。第 6 章 基于MCS-51的典型串行總線設計圖6.6 AT89C52與MC14489接口設計電路原理圖第 6 章

11、基于MCS-51的典型串行總線設計AT89C52的P2.0、P2.1和P2.2引腳分別連到MC14489的DATAIN、CLOCK和,用來模擬SPI接口;BANK1BANK5連接到LED的陰極;ah連接到LED的陽極。第 6 章 基于MCS-51的典型串行總線設計6.2.4 軟件設計軟件設計以下為在5位LED上顯示“HELLO”的程序代碼。#include#define uchar unsigned char sbit DATA=P20; /定義P2.0為DATAINsbit CLK=P21; /定義P2.1為CLOCKsbit ENA=P22; /定義P2.2為 ENABLE第 6 章 基于

12、MCS-51的典型串行總線設計void DSPCMD(uchar CMD);/單字節(jié)命令函數,寫入MC14489內部設置寄存器void DSPDATA(uchar DSCMD,uchar DSDATA1,uchar DSDATA2);/多字節(jié)命令函數,寫入MC14489顯示寄存器void main() DSPCMD(0 xEF); /寫內部設置寄存器 DSPDATA(0 x82,0 xE5,0 x5F);/在5位LED上顯示HELLO,滿亮度顯示第 6 章 基于MCS-51的典型串行總線設計/*單字節(jié)命令函數,寫入MC14489內部設置寄存器*/void DSPCMD (uchar CMD)

13、uchar i; ENA=0; /使能MC14489 for (i=8;i=1;i-) /寫入單字節(jié)命令 第 6 章 基于MCS-51的典型串行總線設計DATA=CMD&0 x80; CMD=CMD1; CLK=0; CLK=1; ENA=1; /禁止MC14489第 6 章 基于MCS-51的典型串行總線設計/*多字節(jié)命令函數,寫入 MC14489 顯示寄存器*/ void DSPDATA (uchar DSCMD, uchar DSDATA1,uchar DSDATA2) uchar DSP, i, j; i=0; ENA=0; /使能 MC14489 while (i24) /寫

14、入 3 字節(jié)顯示數據 if (i8) DSP=DSCMD; else if (i=1;j-) 第 6 章 基于MCS-51的典型串行總線設計 DATA=DSP&0 x80; DSP=DSP1; CLK=0; CLK=1; i=i+8; ENA=1; /禁止 MC14489 第 6 章 基于MCS-51的典型串行總線設計6.2.5 小結小結本節(jié)介紹了基于單片機AT89C52與MC14489的SPI接口設計的硬件連接與軟件設計,主要側重于用單片機接口模擬SPI接口時序。在進行設計時應注意以下幾個問題:(1) 由于SPI接口有四種時序方式,所以事先必須確定所選用的時序方式,一般SPI0和SP

15、I3方式較為常用。(2) 如何用C程序實現(xiàn)時序中的起始條件、停止條件等。第 6 章 基于MCS-51的典型串行總線設計RS-232是串行數據接口標準,最初由電子工業(yè)協(xié)會(EIA)在1962年制定并發(fā)布,命名為EIA-232-E,用于保證不同廠家產品之間的兼容。為了改進RS-232通信距離短、速率低的缺點,RS-422定義了一種平衡通信接口,將傳輸速率提高到10 Mb/s,傳輸距離延長到1219.2米(4000英尺)(速率低于100 kb/s時),并允許在一條平衡總線上最多連接10個接收器。6.3 RS-485總線總線 第 6 章 基于MCS-51的典型串行總線設計為擴展應用范圍,EIA又于19

16、83年在RS-422基礎上制定了RS-485標準,增加了多點、雙向通信能力,即允許多個發(fā)送器連接到同一條總線上,同時增加了發(fā)送器的驅動能力和沖突保護特性,擴展了總線共模范圍。后來EIA將RS-485標準重新命名為TIA/EIA-485-A標準。由于EIA提出的建議標準都是以“RS”作為前綴的,所以在通信工業(yè)領域,仍然習慣將上述標準以RS作前綴表示。 第 6 章 基于MCS-51的典型串行總線設計RS-485具有以下特點:(1) RS-485的電氣特性:邏輯“1”以兩線間的電壓差為+(26) V表示;邏輯“0”以兩線間的電壓差為-(26) V表示。接口信號電平比RS-232-C有所降低,不易損壞

17、接口電路的芯片,且該電平與TTL電平兼容,可方便地與TTL電路連接。RS-485的最高數據傳輸速率為10 Mb/s。(2) RS-485接口采用平衡驅動器和差分接收器的組合,抗共模干擾能力增強,即抗噪聲干擾性好。RS-485接口的最大傳輸距離標準值為1219.2米(4000英尺),實際上可達3000米。其總線接口上允許連接多達128個收發(fā)器,即具有多站能力,這樣用戶可以利用RS-485接口的特點方便地建立設備網絡。注意,RS-232-C接口在總線上只允許連接1個收發(fā)器,即單站能力。第 6 章 基于MCS-51的典型串行總線設計6.3.1 RS-485總線的工作原理總線的工作原理下面以基于單片機

18、AT89C52的RS-485總線現(xiàn)場監(jiān)測系統(tǒng)為例來說明RS-485總線的工作原理。圖6.7 MAX481芯片引腳圖MAX481接口芯片是MAXIM公司推出的一種RS-485芯片。該芯片采用單一電源+5V工作,額定電流為300A,采用半雙工通信方式,完成將TTL電平轉換為RS-485電平的功能。其引腳結構圖如圖6.7所示。 第 6 章 基于MCS-51的典型串行總線設計從圖中可以看出,MAX481芯片的結構和引腳都非常簡單,內部含有一個驅動器和接收器。圖6.7中,RO和DI端分別為接收器的輸出端和驅動器的輸入端,與單片機連接時只需分別與單片機的RXD和TXD相連即可;和DE端分別為接收和發(fā)送的使

19、能端,當為邏輯0時,器件處于接收狀態(tài),當DE為邏輯1時,器件處于發(fā)送狀態(tài),因為MAX481工作在半雙工狀態(tài),所以只需用單片機的一個引腳控制這兩個引腳即可;A端和B端分別為接收和發(fā)送的差分信號端,當A端的電平高于B時,代表發(fā)送的數據為1,當A端的電平低于B端時,代表發(fā)送的數據為0。在與單片機連接時接線非常簡單,僅需要一個信號控制MAX481的接收和發(fā)送即可,同時將A和B端之間加匹配電阻,一般可選120的電阻。表6.1為MAX481引腳功能說明。RERE第 6 章 基于MCS-51的典型串行總線設計圖6.7 MAX481芯片引腳圖第 6 章 基于MCS-51的典型串行總線設計表表6.1 MAX48

20、1引腳功能說明引腳功能說明引腳 名稱 說 明 1 RO 接收器輸出端 2 RE 接收器輸出使能端:引腳為“0”允許輸出,為“1”禁止輸出 3 DE 驅動器工作使能端:引腳為“0”禁止工作,為“1”允許工作 4 DI 驅動器輸入端 5 GND 接地端 6 A 接收器非反向輸入端和驅動器非反向輸出端 7 B 接收器反向輸入端和驅動器反向輸出端 8 VCC 電源引腳端,電壓范圍為 4.755.25 V 第 6 章 基于MCS-51的典型串行總線設計用MAX481實現(xiàn)的半雙工485總線現(xiàn)場監(jiān)測系統(tǒng)結構如圖6.8所示。第 6 章 基于MCS-51的典型串行總線設計圖6.8 MAX481實現(xiàn)的半雙工485

21、總線現(xiàn)場監(jiān)測系統(tǒng)第 6 章 基于MCS-51的典型串行總線設計PC機作為主控機,通過232/485轉接設備接入485總線,它使用查詢方式與各個從機通信;帶有485接口的單片機系統(tǒng)作為從機,響應主機的查詢命令,將采集到的數據回傳給主機,從機之間的數據交換只能通過主機進行轉發(fā)。由于是半雙工通信,所以主機發(fā)送與接收需要分開獨立運行,從機也是如此。A既是接收器的非反向輸入端,也是驅動器的非反向輸出端;B既是接收器的反向輸入端,也是驅動器的反向輸出端;DE和引腳電平共同控制發(fā)送和接收的切換,這在后面的硬件、軟件設計中均有體現(xiàn)。RE第 6 章 基于MCS-51的典型串行總線設計6.3.2 RS-485總線

22、的通信協(xié)議總線的通信協(xié)議對于任何涉及到通信或者數據交換的系統(tǒng),通信協(xié)議的設計都是軟件設計的前提和關鍵。通信協(xié)議設計最重要的就是幀結構的設計。485總線現(xiàn)場監(jiān)測系統(tǒng)中數據幀的結構定義如表6.2所示。數據幀的內容包括起始字節(jié)、地址字節(jié)、類型字節(jié)、數據長度字節(jié)、數據字節(jié)、校驗字節(jié)和結束字節(jié)。第 6 章 基于MCS-51的典型串行總線設計表表6.2 485總線現(xiàn)場監(jiān)測系統(tǒng)中數據幀的結構總線現(xiàn)場監(jiān)測系統(tǒng)中數據幀的結構起始字節(jié) 地址字節(jié) 類型字節(jié) 數據長度字節(jié) 數據字節(jié) 校驗字節(jié) 結束字節(jié) 1 字節(jié) 1 字節(jié) 1 字節(jié) 1 字節(jié) N 字節(jié) 1 字節(jié) 1 字節(jié) 第 6 章 基于MCS-51的典型串行總線設計

23、起始字節(jié)定義為“$”字符,其數值為0 x24;結束字節(jié)定義為“”字符,其數值為0 x2A。地址字節(jié)實際上存放的是從機對應的設備號碼,此設備號在一開始由撥動開關組予以設置。在工作時,每個設備都按規(guī)定已設定,一般不作改動,若需改動則重新設置開關即可。注意:地址碼應避免重復。第 6 章 基于MCS-51的典型串行總線設計本系統(tǒng)的數據幀主要有4種,這由類型字節(jié)決定,它們分別為主機詢問從機是否在位的“ACTIVE”幀、主機發(fā)送讀設備請求的“GETDATA”幀、從機應答在位的“READY”幀和從機發(fā)送設備狀態(tài)信息的“SENDDATA”幀?!癝ENDDATA”幀實際上是真正的數據幀,該幀中的數據字節(jié)存放的是

24、設備狀態(tài)信息。其他3種是單純的指令幀,數據字節(jié)為0字節(jié)。這3種指令幀長度最短,僅為6個字節(jié)。所以,通信過程中幀長小于6個字節(jié)的幀都認為是錯誤幀。幀結構中類型字節(jié)的定義如表6.3所示。第 6 章 基于MCS-51的典型串行總線設計表表6.3 幀結構中類型字節(jié)的定義幀結構中類型字節(jié)的定義幀 類 型 字 節(jié) 說 明 ACTIVE 0 x11 主機詢問從機是否在位 GETDATA 0 x22 主機發(fā)送讀設備請求 READY 0 x33 從機應答在位 SENDDATA 0 x44 從機發(fā)送設備狀態(tài)信息 第 6 章 基于MCS-51的典型串行總線設計下面采用簡單的校驗和方法來進行幀的校驗,即先將所有的字節(jié)

25、相加,然后將結果截短到所需的位長,例如,4個字節(jié)102、8、78和200的校驗和為132(經過截短為1字節(jié)后)。發(fā)端將待發(fā)送的數據進行校驗和計算,將校驗和值放在數據最后一起發(fā)送,在接收端對接收的數據進行校驗和計算,然后與收到的校驗和字節(jié)比較來進行誤碼判斷。設定要進行校驗和計算的字節(jié)包括地址字節(jié)、類型字節(jié)、數據長度字節(jié)和數據字節(jié),但不包括起始字節(jié)和結束字節(jié)。第 6 章 基于MCS-51的典型串行總線設計除了幀結構的定義以外,整個系統(tǒng)的通信還需要遵守下列規(guī)則:(1) 主控機(PC機)主導整個通信過程。由主控機定時輪詢各個節(jié)點處的從機,并要求這些從機提交其對應設備的狀態(tài)信息。(2) 主控機在發(fā)送完“

26、ACTIVE”指令幀后進入接收狀態(tài),同時開啟超時控制。如果接收到錯誤信息,則繼續(xù)等待;如果在規(guī)定時間里未能接收到從機的返回指令幀“READY”,則認為從機不在位,取消這次查詢。第 6 章 基于MCS-51的典型串行總線設計(3) 主控機接收到從機返回指令幀“READY”后,發(fā)送“GETDATA”指令幀,進入接收狀態(tài),同時開啟超時控制。如果接收到錯誤信息,則繼續(xù)等待;如果在規(guī)定時間內未能接收到從機的返回信息,則超時計數加1,并且主控機重新發(fā)送“GETDATA”指令幀;如果超時3次,則返回錯誤信息,取消這次查詢。(4) 從機復位后,將等待主控機發(fā)送指令幀,并根據具體的指令內容作出應答。如果接收到的

27、指令幀錯誤,則直接丟棄該幀,不作任何處理。第 6 章 基于MCS-51的典型串行總線設計6.3.3 硬件電路設計硬件電路設計在圖6.8所示的485總線現(xiàn)場監(jiān)測系統(tǒng)中,PC機為主控機,它僅具有標準的RS-232接口,因此需有232/485轉接設備方可接入485總線網絡,從而與網絡上的從設備進行通信。圖6.9中,MC1488是驅動器,MC1489為接收器,它們的作用是實現(xiàn)TTL電平和RS-232通信電平的轉化;PC147為光電隔離器件;U7為DC-DC功能模塊,其作用是將電源隔離,降低直流電源的干擾;U1為485驅動收發(fā)芯片MAX481,它實現(xiàn)232/485電平轉接功能,其DE和引腳直接相連接,由

28、于該芯片為半雙工芯片,所以要么驅動有效,要么接收有效,二者不能同時有效。第 6 章 基于MCS-51的典型串行總線設計圖6.9 232/485轉接卡原理圖第 6 章 基于MCS-51的典型串行總線設計485總線現(xiàn)場監(jiān)測系統(tǒng)中的單片機選用Atmel公司的AT89C52。系統(tǒng)的主要功能包括兩部分:數據采集和485總線接口,這兩個部分可以獨立設計。本節(jié)主要介紹與485的接口設計部分。圖6.10和圖6.11給出了AT89C52的485接口的硬件設計電路。第 6 章 基于MCS-51的典型串行總線設計圖6.10 單片機系統(tǒng)的485接口原理圖(1)第 6 章 基于MCS-51的典型串行總線設計圖6.11

29、單片機系統(tǒng)的485接口原理圖(2)第 6 章 基于MCS-51的典型串行總線設計圖6.11中,單片機的串口引腳RXD和TXD分別連接MAX481的RO和DI引腳,以進行串行數據交換;控制引腳P1.6和P1.7分別連接MAX481的DE和引腳,以控制驅動器和接收器使能。注意:這4個引腳均應接上拉電阻。S1為一個DIP6開關,和單片機AT89C52的P1.0P1.5引腳分別相連,用于設置本機的地址碼。由于MAX481實現(xiàn)的總線上最多帶32個負載,所以6位引腳足夠使用。應當注意,在讀取P1口獲取地址碼之前,需要先將其寄存器置1。MAX481的A和B引腳為485總線網絡的差分信號輸入/輸出端,二者之間

30、應串接一個120 的電阻。 RE第 6 章 基于MCS-51的典型串行總線設計6.3.4 軟件設計軟件設計基于單片機AT89C52的485總線現(xiàn)場監(jiān)測系統(tǒng)的整個系統(tǒng)軟件分為主控機(PC機)端和單片機端兩部分。主控機端軟件包括通信接口軟件、用戶界面、數據處理、后臺數據庫等。本節(jié)主要介紹通信接口軟件。主控機端通信接口部分的軟件流程圖如圖6.12所示。第 6 章 基于MCS-51的典型串行總線設計圖6.12 主控機端485通信接口部分的軟件流程圖第 6 章 基于MCS-51的典型串行總線設計單片機端軟件包括數據采集和基于485的通信程序。這兩個部分可以完全獨立。數據采集部分可設計為一個函數,在主程序

31、中調用即可。單片機系統(tǒng)的通信軟件流程圖如圖6.13所示??梢钥闯觯麄€程序的流程和協(xié)議設計密切相關。對于從機而言,其工作與主機狀態(tài)密切相關,是完全被動的,即根據主機的指令執(zhí)行相應的操作。從機何時采集設備的狀態(tài)信息也取決于主機,當從機收到主機發(fā)送的讀設備狀態(tài)信息指令幀“GETDATA”時,才開始采集信息并發(fā)送“SENDDATA”上報主機。值得注意的是,若節(jié)點設備狀態(tài)發(fā)生變化,則它并不會主動通知主機,主機也無法及時獲知并做出處理,因此需根據具體應用設置主機使其定時輪詢各從機。第 6 章 基于MCS-51的典型串行總線設計圖6.13 單片機端485總線通信軟件流程圖第 6 章 基于MCS-51的典型

32、串行總線設計本實例的程序代碼與說明如下:#include /引用標準庫的頭文件#include #include #define uchar unsigned char #define uint unsigned int #define ACTIVE 0 x11#define GETDATA 0 x22#define READY 0 x33#define SENDDATA 0 x44第 6 章 基于MCS-51的典型串行總線設計#define RECFRMMAXLEN 16 /接收幀的最大長度,超過此值則認為幀超長錯誤#define STATUSMAXLEN 10/設備狀態(tài)信息的最大長度 #d

33、efine DATA0 0 x10/為簡化起見,假設采集了10位固定的數據#define DATA1 0 x20#define DATA2 0 x30#define DATA3 0 x40#define DATA4 0 x50第 6 章 基于MCS-51的典型串行總線設計#define DATA5 0 x60#define DATA6 0 x70#define DATA7 0 x80#define DATA8 0 x90#define DATA9 0 xA0uchar DevNo;/設備號xdata uchar StatusBufSTATUSMAXLEN;第 6 章 基于MCS-51的典型串行

34、總線設計sbit DE = P16;/驅動器使能,1有效sbit RE = P17;/接收器使能,0有效void init();/系統(tǒng)初始化void Get_Stat();/簡化的數據采集函數bit Recv_Data(uchar *type);/接收數據幀函數void Send(uchar m);/發(fā)送單字節(jié)數據void Send_Data(uchar type,uchar len,uchar *buf);/發(fā)送數據幀函數第 6 章 基于MCS-51的典型串行總線設計void Clr_StatusBuf(); /清除設備狀態(tài)信息緩沖區(qū)函數 void main(void) uchar type

35、; /* 初始化 */ init(); while (1) 第 6 章 基于MCS-51的典型串行總線設計 if (Recv_Data(&type)=0) /接收幀錯誤或者地址不符合,丟棄 continue; switch (type) case ACTIVE: /主機詢問從機是否在位 Send_Data(READY,0,StatusBuf); /發(fā)送 READY 指令 break; case GETDATA: /主機讀設備請求 Clr_StatusBuf(); Get_Stat(); /數據采集函數 Send_Data(SENDDATA,strlen(StatusBuf),Statu

36、sBuf); break; 第 6 章 基于MCS-51的典型串行總線設計 default: break; /指令類型錯誤,丟棄當前幀 /* 初始化 */ void init(void) P1 = 0 xff; 第 6 章 基于MCS-51的典型串行總線設計 DevNo = (P1&0 x00111111); /讀取本機設備號 TMOD = 0 x20; SCON = 0 x50; TH1 = 0 xfd; TL1 = 0 xfd; TR1 = 1; PCON = 0 x00; /SMOD=0 EA = 0; /* 接收數據幀函數,實際上接收的是主機的指令 */ bit Recv_Da

37、ta(uchar *type) 第 6 章 基于MCS-51的典型串行總線設計 uchar tmp,rCount,i; uchar r_bufRECFRMMAXLEN; /保存接收到的幀 uchar Flag_RecvOver; /一幀接收結束標志 uchar Flag_StartRec; /一幀接收開始標志 uchar CheckSum; /校驗和 uchar DataLen; /數據字節(jié)長度變量 /* 禁止發(fā)送,允許接收 */ DE = 0; RE = 0; /* 接收一幀數據 */ rCount = 0; Flag_StartRec = 0; Flag_RecvOver = 0; 第 6

38、 章 基于MCS-51的典型串行總線設計 while (!Flag_RecvOver) RI = 0; while (!RI); tmp = SBUF; RI=0; /* 判斷是否收到字符$,其數值為 0 x24 */ if (!Flag_StartRec) & (tmp = 0 x24) Flag_StartRec = 1; 第 6 章 基于MCS-51的典型串行總線設計 if (Flag_StartRec) r_bufrCount = tmp; rCount +; /* 判斷是否收到字符*, 其數值為 0 x2A, 根據接收的指令設置相應標志位 */ if (tmp = 0 x2A

39、) Flag_RecvOver = 1; if (rCount = RECFRMMAXLEN) /幀超長錯誤,返回 0 return 0; 第 6 章 基于MCS-51的典型串行總線設計 /* 計算校驗和字節(jié) */ CheckSum = 0; DataLen = r_buf3; for (i=0;i+;i3+DataLen) CheckSum = CheckSum + r_bufi+1; /* 判斷幀是否錯誤 */ if (rCount6) /幀過短,錯誤,返回 0,最短的指令幀為 6 個字節(jié) return 0; if (r_buf1!=DevNo) /地址不符合,錯誤,返回 0 第 6 章

40、基于MCS-51的典型串行總線設計 return 0; if (r_bufrCount-2!=CheckSum) /校驗錯誤,返回 0 return 0; *type = r_buf2; /獲取指令類型 return 1; /成功,返回 1 /* 發(fā)送數據幀函數 */ void Send_Data(uchar type,uchar len,uchar *buf) 第 6 章 基于MCS-51的典型串行總線設計 uchar i,tmp; uchar CheckSum = 0; /* 允許發(fā)送,禁止接收 */ DE = 1; RE = 1; /* 發(fā)送幀起始字節(jié) */ tmp = 0 x24; S

41、end(tmp); Send(DevNo); /發(fā)送地址字節(jié),即設備號 CheckSum = CheckSum + DevNo; 第 6 章 基于MCS-51的典型串行總線設計 Send(type); /發(fā)送類型字節(jié) CheckSum = CheckSum + type; Send(len); /發(fā)送數據長度字節(jié) CheckSum = CheckSum + len; /* 發(fā)送數據 */ for (i=0;ilen;i+) Send(*buf); CheckSum = CheckSum + *buf; buf+; Send(CheckSum); /發(fā)送校驗和字節(jié) /* 發(fā)送幀結束字節(jié) */ t

42、mp = 0 x2A; Send(tmp); 第 6 章 基于MCS-51的典型串行總線設計/* 采集數據函數經過簡化處理,取固定的 10 個字節(jié)數據 */ void Get_Stat(void) StatusBuf0=DATA0; StatusBuf1=DATA1; StatusBuf2=DATA2; StatusBuf3=DATA3; StatusBuf4=DATA4; StatusBuf5=DATA5; StatusBuf6=DATA6; StatusBuf7=DATA7; StatusBuf8=DATA8; StatusBuf9=DATA9; 第 6 章 基于MCS-51的典型串行總線

43、設計/* 發(fā)送單字節(jié)數據 */ void Send(uchar m) TI = 0; SBUF = m; while(!TI); TI = 0; /* 清除設備狀態(tài)信息緩沖區(qū)函數*/ void Clr_StatusBuf(void) uchar i; for (i=0;iSTATUSMAXLEN;i+) StatusBufi = 0; 第 6 章 基于MCS-51的典型串行總線設計6.3.5 小結小結本節(jié)以基于單片機AT89C52的485總線現(xiàn)場監(jiān)測系統(tǒng)為例,詳細介紹了RS-485接口的硬件軟件設計。在本例的設計過程中,應注意下列事項:(1) 采用MAX481芯片來實現(xiàn)485接口,決定了該例所

44、實現(xiàn)的485總線網絡是半雙工通信網絡。若需要實現(xiàn)全雙工,則可選擇MAX490、MAX491等其他支持全雙工的485總線驅動芯片。第 6 章 基于MCS-51的典型串行總線設計(2) 485總線網絡的傳輸物理介質為雙絞線。(3) PC機無485接口,若要接入485總線網絡,須對其進行232/485接口電路轉換。(4) 由于需要通過485總線實現(xiàn)數據通信,因此和通信相關的協(xié)議設計亦為軟件設計的重要內容。第 6 章 基于MCS-51的典型串行總線設計I2C總線(Inter IC Bus)是Philips公司推出的芯片間串行傳輸總線,與SPI、Microwire/Plus接口不同,它以兩根連線即可實現(xiàn)

45、全雙工同步數據傳送,可方便地構成多機通信系統(tǒng)或者外設擴展系統(tǒng)。I2C總線采用了器件地址的硬件設計方法,通過軟件尋址完全避免了器件的片選尋址,從而使硬件擴展系統(tǒng)等變得簡單、靈活、方便。按照I2C總線規(guī)范,總線傳輸中所有狀態(tài)都生成相對應的狀態(tài)碼,系統(tǒng)中的主機能夠依照這些狀態(tài)碼自動地進行總線管理,啟動I2C總線就能自動完成規(guī)定的數據傳送操作。6.4 I2C 總總 線線第 6 章 基于MCS-51的典型串行總線設計6.4.1 I2C總線的工作原理總線的工作原理在基于I2C總線特點的單片機系統(tǒng)中,其內部資源具有I2C總線輸入/輸出接口的電氣結構、可設置的相關特殊功能寄存器(SFR)以及所提供的標準程序模

46、塊,為用戶采用I2C總線進行系統(tǒng)設計和應用軟件的編程帶來了極大的方便。第 6 章 基于MCS-51的典型串行總線設計I2C 總線的串行數據傳送與一般UART的串行數據傳送無論是從接口電氣特性、傳送狀態(tài)管理還是從程序的編制上都有很大的差異,其主要特點如下:(1) 二線傳輸。I2C總線上所有的節(jié)點,如主器件(單片機、微處理器)、外圍器件、接口模塊等都連在同名端SCL(時鐘線)和SDA(數據線)上。(2) 系統(tǒng)中有多個主器件時,這些器件可以作為總線的主控制器(無中心主機)。I2C總線工作時任何一個主器件都有可能成為主控制器,多機競爭時的時鐘同步與總線仲裁都由硬件與軟件模塊自動完成。第 6 章 基于M

47、CS-51的典型串行總線設計(3) I2C總線傳輸時,采用狀態(tài)碼管理方法。對于總線傳輸時的任何一種狀態(tài),在狀態(tài)寄存器中都會出現(xiàn)相應的狀態(tài)碼,并會自動進入相應的狀態(tài)處理程序進行自動處理。(4) 系統(tǒng)中的所有外圍器件及模塊均采用器件地址和引腳地址的編址方法。系統(tǒng)中主控制器對任意節(jié)點的尋址采用純軟件的尋址方式,避免了片選的連線方法。系統(tǒng)中若有地址編碼沖突,則可通過改變地址的引腳電平來解決。第 6 章 基于MCS-51的典型串行總線設計(5) 所有帶有I2C接口的外圍器件都具有應答功能。片內有多個單元地址時,數據讀/寫都具有自動加1功能。這樣,在I2C總線對某一器件讀/寫多個字節(jié)時很容易實現(xiàn)自動操作,

48、即準備好讀/寫入口條件后,只需啟動I2C總線就可以完成N個字節(jié)的讀/寫操作。(6) I2C總線電氣接口由漏極開路的晶體管組成,開路輸出端未連到電源的鉗位二極管,而是連到I2C 總線的每個器件上,其自身電源可以獨立,但必須共地??偩€上各個節(jié)點可以在系統(tǒng)帶電的情況下直接接入或撤出。第 6 章 基于MCS-51的典型串行總線設計I2C總線的時鐘線SCL和數據線SDA都是雙向數據線??偩€備用時二者都必須保持高電平狀態(tài),僅在關閉I2C總線時才能使SCL鉗位在低電平。在標準I2C模式下數據傳送速率可達100 kb/s,高速模式下可達400 kb/s??偩€驅動能力受總線電容限制,不加驅動擴展時驅動能力為40

49、0 pF。第 6 章 基于MCS-51的典型串行總線設計6.4.2 I2C總線的通信時序總線的通信時序I2C總線的工作時序如圖6.14所示。第 6 章 基于MCS-51的典型串行總線設計圖6.14 I2C總線的工作時序圖第 6 章 基于MCS-51的典型串行總線設計I2C總線時序工作的基本條件如下:(1) 起??刂?。當SCL為高電平,SDA電平由高變低時,數據開始傳送。所有的操作均必須在開始之后進行。當SCL為高電平,SDA電平由低變?yōu)楦邥r,數據傳送結束。在結束條件下,所有操作都不能進行。如果產生重復起始條件而不產生停止條件,則總線會一直處于忙狀態(tài)。(2) 數據的有效轉換。當時鐘線SCL為高電

50、平時,數據線SDA必須保持穩(wěn)定。若數據線SDA改變,則必須在時鐘線SCL為低時方可進行。第 6 章 基于MCS-51的典型串行總線設計(3) 總線空閑。當數據總線SDA和時鐘總線SCL都為高電平時,為空閑狀態(tài)。(4) 發(fā)送到SDA線上的每個字節(jié)必須為8位,每次傳輸可以發(fā)送的字節(jié)數量不受限制,每個字節(jié)后必須跟一個響應位,首先傳輸的是數據的最高位MSB。若從機需要完成某些其他功能后(例如一個內部中斷服務程序)才能接收或發(fā)送下一個完整的數據字節(jié),則此時可以使時鐘線SCL保持低電平從而迫使主機進入等待狀態(tài),在從機準備好接收下一個數據字節(jié)并釋放時鐘線SCL后使數據傳輸繼續(xù)。第 6 章 基于MCS-51的

51、典型串行總線設計(5) 響應。數據傳輸必須帶響應,相關的響應時鐘脈沖由主機產生,在響應時鐘脈沖期間發(fā)送器釋放SDA線(高),在響應的時鐘脈沖期間,接收器必須將SDA線拉低使它在這個時鐘脈沖的高電平期間保持穩(wěn)定的低電平。注意:必須考慮建立和保持時間。第 6 章 基于MCS-51的典型串行總線設計(6) 仲裁。主機只能在總線空閑時啟動傳輸,兩個或多個主機可能在起始條件的最小持續(xù)時間內產生一個規(guī)定的起始條件。當SCL線是高電平時仲裁在SDA線發(fā)生,這樣在其他主機發(fā)送低電平時發(fā)送高電平的主機將斷開它的數據輸出級,因為總線上的電平與其自身的電平不同。仲裁可以持續(xù)多位,它的第一個階段是比較地址位。如果每個

52、主機都嘗試尋址相同的器件,則仲裁會繼續(xù)比較數據位(如果是主機-發(fā)送器),或者比較響應位(如果是主機-接收器)。因為I2C總線的地址和數據信息由贏得仲裁的主機決定,在仲裁過程中不會丟失信息。丟失仲裁的主機可以產生時鐘脈沖直到丟失仲裁的該字節(jié)末尾。第 6 章 基于MCS-51的典型串行總線設計在進行數據傳送之前,I2C總線會首先發(fā)送一個字節(jié)進行尋址。這個字節(jié)一般緊跟在起始條件之后發(fā)送,表示需要通信的從器件地址。其格式定義如下:D7D1 D0 從地址 讀/寫 第 6 章 基于MCS-51的典型串行總線設計地址信息是7bit,占用了地址字節(jié)的高7位,可以對127個器件進行尋址。該字節(jié)的第0bit用于表

53、示數據的傳送方向:當該位是高電平時,表示由從器件向主器件發(fā)送數據,即主器件對從器件進行讀操作;當該位為低電平時,表示由主器件向從器件發(fā)送數據,即主器件對從器件進行寫操作。起始條件后,總線中各個器件將自己的地址與主器件送到總線上的器件地址進行比較,如果發(fā)生匹配,則該器件認為被主器件尋址。一般來說,從器件的地址由一部分固定地址和一部分可變地址組成,而可變地址確定了在I2C總線上可容納的此類器件的最多數目。 第 6 章 基于MCS-51的典型串行總線設計6.4.3 硬件電路設計硬件電路設計由于標準的MCS-51單片機不具備I2C總線接口,MCS-51單片機在擴展具有I2C總線的芯片時可利用單片機的I

54、/O接口與之相連,在程序中利用位操作指令及移位指令模仿I2C總線的操作時序并編寫相應的程序。圖6.15為89C52單片機實現(xiàn)I2C總線的硬件原理圖。 第 6 章 基于MCS-51的典型串行總線設計圖6.15 單片機實現(xiàn)I2C總線的硬件原理圖 第 6 章 基于MCS-51的典型串行總線設計6.4.4 軟件設計軟件設計單片機模擬I2C總線向從器件發(fā)送數據和由從器件接收數據的程序流程圖分別如圖6.16(a)、(b)所示。第 6 章 基于MCS-51的典型串行總線設計圖6.16 程序流程圖第 6 章 基于MCS-51的典型串行總線設計程序如下:#include /引用標準庫的頭文件#include #

55、define uchar unsigned char #define uint unsigned int sbit SDA = P12; /串行數據sbit SCL = P13; /串行時鐘uchar idata slave_dev_adr; /從器件地址uchar idata sendbuf8; /數據發(fā)送緩沖區(qū)uchar idata receivebuf8; /數據接收緩沖區(qū)第 6 章 基于MCS-51的典型串行總線設計bit bdata Nack; /器件壞或錯誤標志位bit bdata NackFlag; /非應答標志位void delay5us(); /延時約5微秒,對于12 MHz

56、時鐘 void start(void); /起始條件子函數 void stop(void); /停止條件子函數 void ack(void); /發(fā)送應答子函數 void n_ack(void); /發(fā)送非應答子函數 void checkack(void);/應答位檢查子函數 第 6 章 基于MCS-51的典型串行總線設計void sendbyte(uchar idata *ch);/發(fā)送一字節(jié)數據子函數 void recbyte(uchar idata *ch); /接收一字節(jié)子程序 void sendnbyte(uchar idata *sla, uchar n); /發(fā)送n字節(jié)數據子程序

57、 void recnbyte(uchar idata *sla, uchar n); /接收n字節(jié)數據子程序 /* 主函數,模擬實現(xiàn)I2C總線的數據收發(fā) */void main(void)uchar i,numbyte;numbyte = 8; /* 需發(fā)送的8字節(jié)數據 */for (i=0;inumbyte;i+)sendbufi = i+0 x11;第 6 章 基于MCS-51的典型串行總線設計slave_dev_adr = 0 x58; /從器件地址 sendnbyte(&slave_dev_adr,numbyte);/向從器件發(fā)送存放在 sendbuf8中的 8 字 節(jié)數據 f

58、or (i=0;i10000;i+) delay5us(); recnbyte(&slave_dev_adr,numbyte);/由從器件接收 8 字節(jié)數據,存放在 rbuf 中 /* 延時約 5 微秒,對于 12 MHz 時鐘 */ void delay5us() uint i; for (i=0;i5;i+) _nop_(); 第 6 章 基于MCS-51的典型串行總線設計/* 起始條件子函數 */ void start(void) SDA = 1; /啟動 I2C 總線 SCL = 1; delay5us(); SDA = 0; delay5us(); SCL = 0; /* 停

59、止條件子函數 */ void stop(void) SDA = 0; /停止 I2C 總線數據傳送 第 6 章 基于MCS-51的典型串行總線設計 SCL = 1; delay5us(); SDA = 1; delay5us(); SCL = 0; /* 發(fā)送應答子函數 */ void ack(void) SDA = 0; /發(fā)送應答位 SCL = 1; delay5us(); SDA = 1; SCL = 0; 第 6 章 基于MCS-51的典型串行總線設計/* 發(fā)送非應答子函數 */ void n_ack(void) SDA = 1; /發(fā)送非應答位 SCL = 1; delay5us(); SDA = 0; SCL = 0; /* 應答位檢查子函數 */ void checkack(void) 第 6 章 基于MCS-51的典型串行總線設計 SDA = 1; /應答位檢查(將 P1.0 設置成輸入,必須先向端口寫 1) SCL = 1; NackFlag = 0; if (SDA = 1) /若 SDA=1,則表明非應答,置位非應答標志 F0 NackFlag

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論