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

下載本文檔

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

文檔簡介

8.1串行通信基本知識8.2MCS-51串口控制器8.3串行口的工作方式8.4波特率的制定方法8.5串行通信的接口電路8.6串口的編程與應(yīng)用8.7多機通信8.8單片機與PC的串口通信第8章串行通信接口8.1.1概述

計算機與外界的信息交換稱為通信。基本通信方式有兩種:

并行通信(parallelcommunication):所傳送數(shù)據(jù)的各位同時發(fā)送或接收。

串行通信(serialcommunication):所傳送數(shù)據(jù)的各位按順序一位一位地發(fā)送或接收。

圖8.1為這兩種通信方式的示意圖。8.1串行通信基本知識圖8.1兩種通信方式的示意圖

(a)并行通信;(b)串行通信在并行通信中,一個并行數(shù)據(jù)占多少二進制位,就需要多少根數(shù)據(jù)傳輸線。這種方式的特點是通信速度快,但傳輸線多,價格較貴,適合近距離傳輸;而串行通信僅需2根傳輸線即可,故在長距離傳輸數(shù)據(jù)時,成本較低。但由于它每次只能傳輸一位,因此傳輸速度較慢。

下面介紹串行通信中的一些基本概念。1.串行通信的制式

在串行通信中,數(shù)據(jù)是在兩個站之間進行傳送的,按照數(shù)據(jù)傳送方向,串行通信可分為單工(simplex)、半雙工(halfduplex)和全雙工(fullduplex)三種制式。圖8.2為三種制式的示意圖。圖8.2單工、半雙工和全雙工三種制式示意圖(a)單工;(b)半雙工;(c)全雙工在單工制式下,通信線的一端為發(fā)送器,一端為接收器,數(shù)據(jù)只能按照一個固定的方向傳送,如圖8.2(a)所示。

在半雙工制式下,系統(tǒng)的每個通信設(shè)備都由一個發(fā)送器和一個接收器組成,如圖8.2(b)所示。在這種制式下,數(shù)據(jù)能從A站傳送到B站,也可以從B站傳送到A站,但是不能同時在兩個方向上傳送,即只能一端發(fā)送,一端接收。其收/發(fā)開關(guān)一般是由軟件控制的電子開關(guān)。全雙工通信系統(tǒng)的每端都有發(fā)送器和接收器,可以同時發(fā)送和接收,即數(shù)據(jù)可以在兩個方向上同時傳送,如圖8.2(c)所示。

在實際應(yīng)用中,盡管多數(shù)串行通信接口電路具有全雙工功能,但一般情況下,只工作于半雙工制式下,因為這種用法簡單、實用。圖8.2單工、半雙工和全雙工三種制式示意圖(a)單工;(b)半雙工;(c)全雙工2.波特率(baudrate)

波特率為每秒傳送二進制數(shù)的位數(shù),單位為b/s,即位/秒。波特率用于表征數(shù)據(jù)傳輸?shù)乃俣?,波特率越高,?shù)據(jù)傳輸速度越快。

3.異步串行通信

在異步串行通信中,數(shù)據(jù)是一幀一幀傳送的,每幀數(shù)據(jù)包括一位起始位、一個字節(jié)數(shù)據(jù)、一位校驗位和一位停止位。每幀數(shù)據(jù)之間可以插入若干個高電平的空閑位。

異步串行通信要求發(fā)送數(shù)據(jù)和接收數(shù)據(jù)雙方約定相同的數(shù)據(jù)格式和波特率,用啟、停位來協(xié)同發(fā)送與接收過程。接收和發(fā)送端采用獨立的移位脈沖控制數(shù)據(jù)的串行移出與移入,發(fā)送移位脈沖與接收移位脈沖是異步,因此稱為異步串行通信。

異步串行通信中,每幀數(shù)據(jù)只有一個字節(jié)數(shù)據(jù),也不需要同步脈沖,因此應(yīng)用較為靈活。但由于每幀數(shù)據(jù)需要插入啟停位,故傳輸速度較慢。

4.同步串行通信

同步串行通信是一種連續(xù)的數(shù)據(jù)傳送方式。每次傳送一幀數(shù)據(jù),每幀數(shù)據(jù)由同步字符和若干個數(shù)據(jù)及校驗字符組成。

同步串行通信中,發(fā)送和接收雙方由同一個同步脈沖控制,數(shù)據(jù)位的串行移出與移入是同步,因此稱為同步串行通信。同步串行通信速度快,適應(yīng)于大量數(shù)據(jù)傳輸場合,但需要同步脈沖信號,控制較復(fù)雜。

MCS-51有一個可編程的全雙工串行通信接口,可作為通用異步接收/發(fā)送器(UART-UniversalAsychronousReceiver/Transmitter),也可作為同步移位寄存器。其幀格式可為8位、10位、11位,并可設(shè)置多種不同的波特率。它通過引腳RXD和TXD與外界進行通信。

8.2MCS-51串口控制器

MCS-51內(nèi)部有兩個物理上獨立的接收、發(fā)送緩沖器SBUF。SBUF屬于特殊功能寄存器。一個用于存放接收到的數(shù)據(jù),另一個用于存放欲發(fā)送的數(shù)據(jù),可同時發(fā)送和接收數(shù)據(jù)。兩個緩沖器共用一個地址99H,通過對SBUF的讀、寫指令來區(qū)別是對接收緩沖器還是對發(fā)送緩沖器進行操作。CPU在寫SBUF時,就是修改發(fā)送緩沖器;讀SBUF,就是讀接收緩沖器的內(nèi)容。接收或發(fā)送數(shù)據(jù),是通過串行口對外的兩條獨立收發(fā)信號線RXD(P3.0)、TXD(P3.1)來實現(xiàn)的,因此可以同時發(fā)送、接收數(shù)據(jù)。串行口的結(jié)構(gòu)如圖8.3所示。圖8.3串行口結(jié)構(gòu)示意圖8.2.1串口控制寄存器(SCON)

SCON的字節(jié)地址是98H,其格式及各位的含義如下:

SM0、SM1——串行口4種工作方式的選擇位。串行口的4種工作方式如表8.1所示。表8.1串行口的4種工作方式

SM2——多機通信控制位,用于方式2或方式3中。

當串行口以方式2或方式3接收時:

如果SM2=1,只有當接收到的第9位數(shù)據(jù)(RB8)為“1”時,才將接收到的前8位數(shù)據(jù)送入SBUF,并將RI置“1”,產(chǎn)生中斷請求;當接收到的第9位數(shù)據(jù)(RB8)為“0”時,則將接收到的前8位數(shù)據(jù)丟棄。

如果SM2=0,則不論第9位數(shù)據(jù)是“1”還是“0”,都將前8位數(shù)據(jù)送入SBUF中,并將RI置“1”,產(chǎn)生中斷請求。

在方式1時,如果SM2=1,則只有收到停止位時才會激活RI。

在方式0時,SM2必須為0。

REN——允許串行接收位,由軟件置“1”或清“0”。

REN=1時,允許串行口接收數(shù)據(jù);

REN=0時,禁止串行口接收數(shù)據(jù)。

TB8——發(fā)送的第9位數(shù)據(jù)。

在方式2和方式3下,TB8是要發(fā)送的第9位數(shù)據(jù),其值由用戶通過軟件設(shè)置,可作為奇偶校驗位使用,RT?=?1作為地址幀標志,RT=0作為數(shù)據(jù)幀的標志。

RB8—接收到的第9位數(shù)據(jù)。

在方式2和方式3下,RB8存放接收到的第9位數(shù)據(jù),它代表接收到的數(shù)據(jù)的特征:可能是奇偶校驗位,也可能是地址/數(shù)據(jù)幀的標志位。在方式1下,如果SM2?=?0,則RB8是接收到的停止位。在方式0下,不使用RB8。

TI—發(fā)送中斷標志位。發(fā)送中TI必須保持零電平。

在方式0下,串行發(fā)送第8位數(shù)據(jù)結(jié)束時由硬件置“1”。在其他工作方式下,串行口發(fā)送停止位開始時置“1”。TI?=?1,表示一幀數(shù)據(jù)發(fā)送結(jié)束,可供軟件查詢,也可申請中斷。CPU響應(yīng)中斷后,在中斷服務(wù)程序中向SBUF寫入要發(fā)送的下一幀數(shù)據(jù),TI必須由軟件再清0。RI—接收中斷標志位。接收中RI必須保持零電平。

在方式0下,接收完第8位數(shù)據(jù)時,RI由硬件置1。在其他工作方式下,串行接收到停止位時,該位置“1”。RI?=?1,表示一幀數(shù)據(jù)接收完畢,并可申請中斷,要求CPU從接收SBUF取走數(shù)據(jù)。該位的狀態(tài)也可供軟件查詢。如果再接收,則RI必須由軟件清“0”。8.2.2特殊功能寄存器(PCON)

PCON的字節(jié)地址為87H,沒有位尋址功能。其格式如下:

SMOD:波特率選擇位。當SMOD=1時,比SMOD=0時的波特率加倍,因此也稱SMOD位為波特率倍增位。8.3.1方式0

方式0為同步移位寄存器輸入/輸出方式,常用于外接移位寄存器,以擴展并行I/O口。

8位數(shù)據(jù)為一幀,不設(shè)起始位和停止位,先發(fā)送或接收最低位。波特率固定為fosc/12。8.3串行口的工作方式1.方式0發(fā)送當CPU執(zhí)行一條將數(shù)據(jù)寫入發(fā)送緩沖器SBUF的指令時,產(chǎn)生一個正脈沖,串行口即把SBUF中的8位數(shù)據(jù)以fosc/12的固定波特率從RXD引腳串行輸出,低位在先,TXD引腳輸出同步移位脈沖,發(fā)送完8位數(shù)據(jù)后,將中斷標志位TI置“1”。時序如圖8.4所示。圖8.4方式0發(fā)送時序

2.方式0接收

方式0接收時,REN為串行口接收允許接收控制位,REN?=?0,禁止接收。

在方式0下,SCON中的TB8、RB8位未用,發(fā)送或接收完8位數(shù)據(jù)后由硬件將TI或RI中斷標志位置“1”,CPU響應(yīng)中斷。TI或RI標志位須由用戶軟件清“0”,可采用如下指令:

CLRTI ;TI位清“0”

CLRRI ;RI位清“0”

在方式0下,SM2位(多機通信控制位)必須為0。8.3.2方式1

方式1用于數(shù)據(jù)的串行發(fā)送和接收。TXD腳和RXD腳分別用于發(fā)送和接收數(shù)據(jù)。

方式1收、發(fā)一幀的數(shù)據(jù)為10位,1位起始位(0),8位數(shù)據(jù)位,1位停止位(1),先發(fā)送或接收最低位。

波特率由下式確定:

1.方式1發(fā)送

方式1輸出時,數(shù)據(jù)位由TXD端輸出。當CPU執(zhí)行一條數(shù)據(jù)寫發(fā)送緩沖器SBUF的指令時,就啟動發(fā)送。圖8.5(a)TX時鐘的頻率就是發(fā)送的波特率。發(fā)送開始時,內(nèi)部發(fā)送控制信號變?yōu)橛行В瑢⑵鹗嘉幌騎XD輸出。此后,每經(jīng)過一個TX時鐘周期,便產(chǎn)生一個移位脈沖,并由TXD輸出一個數(shù)據(jù)位。8位數(shù)據(jù)位全部發(fā)送完畢后,中斷標志位TI置“1”。TI必須由用戶清0,以便下一次發(fā)送。圖8.5方式1發(fā)、收時序(a)發(fā)送時序;(b)接收時序(a)(b)2.方式1接收

方式1接收接收數(shù)據(jù)的時序如圖8.5(b)所示。當CPU采樣到RXD端從1到0的跳變時(3次采樣中至少2次有效),開始接收數(shù)據(jù)。一幀數(shù)據(jù)接收完畢以后,必須同時滿足以下兩個條件,這次接收才真正有效,然后RI自動置1。

(1)?RI=0。

(2)?SM2=0或收到的停止位=1。

若這兩個條件不滿足,則收到的數(shù)據(jù)不能裝入SBUF,該幀數(shù)據(jù)將丟失。中斷標志RI必須由用戶清0,以便下一次接收。通常情況下,串口以方式1工作時,SM2=0。8.3.3方式2

方式2為9位異步通信方式。每幀數(shù)據(jù)均為11位,1位起始位0,8位數(shù)據(jù)位(先低位),1位可程控的第9位數(shù)據(jù)和1位停止位。

方式2的波特率由下式確定:

1.方式2發(fā)送

發(fā)送前,先根據(jù)通信協(xié)議由軟件設(shè)置TB8(例如,雙機通信時的奇偶校驗位或多機通信時的地址/數(shù)據(jù)的標志位)。方式2發(fā)送數(shù)據(jù)波形如圖8.6所示。圖8.6方式2發(fā)送時序

2.方式2接收

SM0、SM1=10,且REN=1。數(shù)據(jù)由RXD端輸入,接收11位信息。當位檢測邏輯采樣到RXD引腳從1到0的負跳變,并判斷起始位有效后,便開始接收一幀信息。在接收完第9位數(shù)據(jù)后,需滿足以下兩個條件,才能將接收到的數(shù)據(jù)送入SBUF。

(1)?RI=0,意味著接收緩沖器為空。

(2)?SM2=0或接收到的第9位數(shù)據(jù)位RB8=1。圖8.7方式2接收時序8.3.4方式3

當SM0、SM1=11時,串行口工作在方式3。方式3為波特率可變的9位異步通信方式,除波特率外,方式3和方式2相同。方式3發(fā)送和接收數(shù)據(jù)的時序波形見方式2的圖(圖8.6和圖8.7)。

方式3的波特率由下式確定:方式0和方式2的波特率是固定的;方式1和方式3的波特率可由定時器T1的溢出率來確定。

(1)方式0時,波特率固定為時鐘頻率fosc的1/12,且不受SMOD位的值的影響。若fosc=12MHz,則波特率為fosc/12,即1Mb/s。

(2)方式2時,波特率與SMOD位的值有關(guān)。

若fosc=12MHz,則當SMOD=0時,波特率B=187.5kb/s;當SMOD=1時,波特率=375kb/s。8.4波特率的制定方法

(3)串行口工作在方式1或方式3時,常用定時器T1作為波特率發(fā)生器,其波特率為:其中,T1的溢出率?=?定時器T1的溢出次數(shù)/秒。實際設(shè)定波特率時,T1常設(shè)置為方式2定時方式(自動裝初值),這種方式不僅操作方便,也可避免因軟件重裝初值而帶來的定時誤差。

當T1工作于方式2定時方式時,計數(shù)脈沖來源于晶振的1/12,即每秒fosc/12次,若計數(shù)初值為x,則每計數(shù)28-x次將產(chǎn)生一次溢出,所以

將此式代入方式1、方式3波特率的計算公式,可得到計算初值的公式為其中:x為計數(shù)初值;B為此條件下產(chǎn)生的波特率。表8.2定時器T1產(chǎn)生的常用波特率

例:若51單片機的時鐘振蕩頻率為11.0592MHz,選用T1為方式2定時作為波特率發(fā)生器,波特率為2400b/s,求初值。

用上述公式計算T1的初值為

上述結(jié)果可直接從表8.2中查到,為F4H,與計算結(jié)果一致。晶振選為11.0592MHz,可使計算過程無余數(shù)產(chǎn)生,初值為整數(shù),從而產(chǎn)生精確的波特率。8.5.1RS-232C接口

RS-232C是使用最早,應(yīng)用最多的一種異步串行通信總線標準。它是美國電子工業(yè)協(xié)會(EIA)1962年公布,1969年最后修定而成的。其中,RS表示recommendedstandard,232是該標準的標識號,C表示一次修定。1987年修訂為EIA-232D,1991年修訂為EIA-232E,1997年修訂為EIA-232F。由于修訂的內(nèi)容不多,因此人們習(xí)慣于早期的名字“RS-232C”。8.5串行通信的接口電路

RS-232C主要用來定義計算機系統(tǒng)的一些數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)電路終端設(shè)備(DCE)之間的電氣性能。由于MCS-51系列單片機本身有一個全雙工的串行接口,因此該系列單片機用RS-232C串行接口總線非常方便。

下面介紹RS-232C的一些主要特性。

1.機械特性

RS-232C接口規(guī)定使用25針連接器,但一般應(yīng)用中并不一定用到RS-232C標準的全部信號線,而常常使用9針連接器,連接器的引腳定義如圖8.8和表8.3所示。圖中所示為陽頭定義,通常的PC機主板上都采用這種器件,對應(yīng)的陰頭用于連接線。它們的序號順序是相反的,使用時要小心。圖8.89針RS-232C連接器(a)陽頭;(b)陰頭表8.39針RS-232C接口器引腳定義

2.電氣特性

RS-232C規(guī)定了自己的電氣標準,由于它是在TTL電路之前研制的,因此它的電平不同于TTL,而是采用負邏輯電平,即邏輯“0”:+?3~?+?15V;邏輯“1”:-3~-15?V。因此,RS-232C不能和TTL電平直接相連,使用時必須進行電平轉(zhuǎn)換,否則將使TTL電路燒壞,實際應(yīng)用時必須注意!

RS-232C串行接口總線適用于設(shè)備之間通信距離不大于15m,傳輸速率小于20kb/s的情況。

3.?RS-232C電平與TTL電平轉(zhuǎn)換器

MCS-51系列單片機串行口與PC機的RS-232C接口不能直接對接,必須進行電平轉(zhuǎn)換。常用的電平轉(zhuǎn)換芯片有MAX232、MAX202等。它們可以滿足RS-232C的電氣規(guī)范,且僅用+5?V電源,其內(nèi)置電子泵電壓轉(zhuǎn)換器將?+5?V電源轉(zhuǎn)換成?-10?V~+10?V。這類芯片與TTL/CMOS電平兼容,片內(nèi)有兩個發(fā)送器和兩個接收器,使用比較方便。圖8.9為MAX202、MAX232的引腳及典型工作電路圖,使用MAX202芯片,電容C1~C4選用0.1μF;使用MAX232芯片,電容C1~C4選用1μF。若電容小,則電壓升不起來,通信時干擾大,容易錯碼;若電容大,則降低了通信速率。C5是旁路電容,常用0.1μF。圖8.9MAX202/MAX232引腳及典型工作電路圖8.5.2RS-485接口

由于串行通信簡單易用,因此在工業(yè)領(lǐng)域也大量使用串行通信作為數(shù)據(jù)交換的手段。可是工業(yè)環(huán)境通常會有噪聲干擾傳輸線路,在用RS-232C串行通信進行傳輸時經(jīng)常會受到

外界的電氣干擾而使信號發(fā)生錯誤。為了解決以上問題,RS-485串行通信方式就應(yīng)運而生了。

RS-232C利用傳輸信號線與公共地之間的電壓差,而RS-485則利用信號導(dǎo)線之間的信號電壓差。它通過傳輸線驅(qū)動器,把邏輯電平變換成電位差,完成始端的信號傳送;通過傳輸線接收器,把電位差轉(zhuǎn)換成邏輯電平,完成終端的信息接收,如圖8.10所示。圖8.10RS-485接口示意圖RS-485比RS-232C傳輸距離長、速度快,傳輸速率最大可達10Mb/s,最大距離可達1200m。

RS-485是一點對多點的通信接口,一般采用雙絞線的結(jié)構(gòu)。普通的PC一般不帶RS-485接口,因此要使用RS-232/RS-485轉(zhuǎn)換器。在計算機和單片機組成的RS-485通信系統(tǒng)(如圖8.11所示)中,下位機由單片機系統(tǒng)組成,主要完成工業(yè)現(xiàn)場信號的采集和控制。上位機為工業(yè)PC,負責(zé)監(jiān)視下位機的運行狀態(tài),并對其狀態(tài)信息進行集中處理,以圖文方式顯示下位機的工作狀態(tài)和工業(yè)現(xiàn)場被控設(shè)備的工作狀態(tài)。系統(tǒng)中的各節(jié)點(包括上位機)的識別是通過設(shè)置不同的站地址來實現(xiàn)的。圖8.11RS-485總線組成的測控系統(tǒng)圖8.12MAX1487引腳表8.4MAX1487引腳說明8.6.1用串行口擴展并行I/O口

在方式0下,串行口是作為同步移位寄存器使用的。它可以與“并入串出”功能(如74LS165等),或“串入并出”功能(如74LS164等)的移位寄存器配合使用。

圖8.13是74LS165和74LS164的引腳圖。8.6串口的編程與應(yīng)用圖8.1374LS165、74LS164引腳圖

1.用并行輸入8位移位寄存器74LS165擴展輸入口圖8.14是利用并行輸入8位移位寄存器74LS165擴展輸入口的電路圖。從理論上講,利用這種方法可以擴展更多的輸入口,但擴展得越多,口的操作速度就越低。74LS165的串行輸出數(shù)據(jù)QH接收RXD作為單片機串行口的數(shù)據(jù),而74LS165的移位時鐘則由單片機TXD端提供。P1.2作為74LS165的接收和移位控制端SH/。當SH/?

=?0時,允許74LS165置入并行數(shù)據(jù);當SH/?

=?1時,允許74LS165串行移位輸出數(shù)據(jù)。圖8.14利用串行口擴展輸入口

在圖8.14中,74LS165從一個8位的撥碼盤DSW(即圖8.14所示的8個開關(guān))獲取每一個開關(guān)的閉合信息。由于74LS165的D0~D7都接了10kΩ的上拉電阻,所以當DSW中對應(yīng)的開關(guān)未閉合時為高電平“1”,閉合接地時為低電平“0”。這些信息通過SO、CLK串行傳送給89C51,并通過P1口上的LED發(fā)光二極管顯示。當然,也可以用這些信息通過接口電路去控制其他的設(shè)備。程序選用方式0,將SCON的REN置位后,就開始一個數(shù)據(jù)的接收過程。程序從8位擴展口讀入數(shù)據(jù)。

程序代碼如下:

ORG 0000H MOV SCON,#10H ;串口方式0,啟動接收

START: CLR P3.2 ;允許并行置入數(shù)據(jù)

SETB P3.2 ;允許串行移位

JNB RI,$ ;等待接收一幀數(shù)據(jù)結(jié)束

CLR RI ;接收結(jié)束,清RI中斷標志

MOV A,SBUF ;讀取串行緩沖器中的數(shù)據(jù)

MOV P1,A ;放入片內(nèi)RAM中

ACALLDELAYAJMPSTARTDELAY: MOVR7,#10 DJNZR7,$ RET ;延時

END

2.用8位并行輸出串行移位寄存器74LS164擴展輸出口圖8.15是MCS51串口配合8位并行輸出串行移位寄存器74LS164擴展輸出口的LED顯示原理圖。圖8.1574LS164顯示8位LED數(shù)碼管電路原理圖

圖中串行口的數(shù)據(jù)通過RXD加到74LS164的輸入端,單片機的TXD引腳作為移位時鐘加到74LS164的CLK端。圖中的8位共陽極七段LED顯示器,由于74LS164在低電平輸出時,允許通過的電流可達20mA,因此不需要再加LED驅(qū)動電路。程序?qū)?8H~7FH中的數(shù)據(jù)(0~9)送到8位LED中顯示。

子程序如下:

MOVSCON,#00H;此句放在主程序中,方式0,RI=0,REN=0

DIR: MOVR7,#08H ;8位LED MOVR0,#7FH ;顯示緩沖區(qū)首址

DL0: MOVA,@R0;取出要顯示的數(shù)

MOVDPTR,#TAB;查表

MOVCA,@A+DPTR MOVSBUF,A ;送出顯示

DL1: JNBTI,DL1 ;輸出完否?

CLRTI ;完,清中斷標志

DECR0 ;再取下一個數(shù)

DJNZR7,DL0 RET ;返回

TAB: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H ;0~9的段碼

8.6.2單片機與單片機通信

為保證兩臺單片機通信的準確,雙方要遵循一個簡單協(xié)議。以下是一個簡單的通信協(xié)議,協(xié)議的程序框圖如圖8.16所示。圖8.16兩臺單片機通信協(xié)議的程序框圖

通信開始,主機首先向從機發(fā)送AAH,從機收到后發(fā)給主機應(yīng)答B(yǎng)BH,表示同意接收。主機收到從機應(yīng)答B(yǎng)BH后,發(fā)送數(shù)據(jù)塊,并發(fā)送校驗和。注意:AAH、BBH不是唯一的發(fā)送、應(yīng)答標志,還可以采用其他標志。從機接收到主機發(fā)送的數(shù)據(jù)后保存,收齊一個數(shù)據(jù)塊后,再接收主機發(fā)來的校驗和,并與從機本身求得的校驗和比較:如相等,則說明接收正確,向主機發(fā)應(yīng)答00H;若不等,則說明接收不正確,向主機發(fā)應(yīng)答非零數(shù)據(jù),請求主機重發(fā)。

如后面的圖8.17所示,U1為主機,U2為從機,兩機通過串口連接(注意RXD和TXD相反互接),主機按以上通信協(xié)議發(fā)送6個數(shù)據(jù)給從機,從機也按這個協(xié)議接收這6個數(shù)據(jù),接收與發(fā)送成功后,把發(fā)送、接收的結(jié)果顯示在LCM1602上。程序清單如下。

主機程序清單(詳細解釋參考注釋):

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

EXTRNCODE(LCD_PRINT_CHAR)EXTRNCODE(LCD_PRINT_S) ORG0000H AJMPMAIN ORG0030HMAIN: ;主程序

MOV20H,#0AH ;要發(fā)送的6個數(shù)據(jù)存入20H~25H MOV21H,#1BH MOV22H,#2CH

MOV23H,#3DH MOV24H,#4EH

MOV25H,#5FH ACALLLCD_INITIAL ;初始化LCM1602 ACALLINIT_ES ;設(shè)置串口

MOVA,#81H ;在LCD第1行,第1列

MOVDPTR,#TAB1 ACALLLCD_PRINT_S ;顯示TAB1的字符串

ACALLSEND ;發(fā)送數(shù)據(jù)

ACALLLCD_DISPLAY ;將發(fā)送的數(shù)據(jù)顯示在LCD AJMP$INIT_ES: ;串口初始化子程序

MOVTMOD,#20H ;T1工作于方式2 MOVPCON,#00H MOVTL1,#0E8H ;波特率為1200 MOVTH1,#0E8H MOVSCON,#50H ;串口工作于方式1,允許接收

SETBTR1 ;啟動T1 RET

;------------------------------------------------------------------------------;子程序名:SEND

;功能:主機向從機發(fā)送數(shù)據(jù);數(shù)據(jù)存放地址:內(nèi)部RAM20H~5H

;發(fā)送協(xié)議:; ①主機發(fā)送AAH

; ②從機如收到了AAH,發(fā)BBH應(yīng)答; ③主機收到BBH后發(fā)送6個數(shù)據(jù); ④主機收到如不是BBH后,返回①; ⑤發(fā)送6個數(shù)據(jù)的累加和(結(jié)果只采用一個字節(jié))

; ⑥接收從機的答復(fù),如是00H,發(fā)送結(jié)束; ⑦如非零,重發(fā)6個數(shù)據(jù)與累加和;---------------------------------------------------------------------SEND:MOVA,#0AAH ;發(fā)送AAH ACALLTO_SBUF ACALLFROM_SBUF ;接收從機的應(yīng)答

CJNEA,#0BBH,SEND ;如不是BBH,重新發(fā)送

SEND0:MOVR0,#20H ;從20H~25H中依次發(fā)送數(shù)據(jù)

MOVR7,#6 MOVB,#00HSEND1:MOVA,@R0

ACALLTO_SBUF ADDA,B ;求累加和

MOVB,A INCR0 DJNZR7,SEND1 MOVA,B ;將累加和發(fā)送給從機

ACALLTO_SBUF ACALLFROM_SBUF ;接收從機的回答

JNZSEND0 ;非零重發(fā)6個數(shù)據(jù)

RET

TO_SBUF:MOVSBUF,A ;發(fā)送一個字節(jié)子程序

JNBTI,$ CLRTI RETFROM_SBUF: ;接收一個字節(jié)子程序

JNBRI,$ CLRRI MOVA,SBUF

RET

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

;子程序名:LCD_DISPLAY

;功能:將數(shù)據(jù)塊20H~25H的內(nèi)容送LCD顯示;原理:把要顯示的一個字節(jié)分解成高4位和低4位(用除16實現(xiàn))

; 查表,將它們分別轉(zhuǎn)換成ASCII碼,依次放入30H起始的單元; 調(diào)LCD_PRINT_CHAR進行顯示;--------------------------------------------------------------------------

LCD_DISPLAY:

MOVR0,#20H MOVR1,#30H MOVR5,#6 ;循環(huán)6次值

LOOP: MOVA,@R0 ;取出數(shù)據(jù)

MOVB,#16 ;分解成高、低4位

DIVAB MOVDPTR,#TAB ;查表,形成ASCII碼

MOVCA,@A+DPTR MOV@R1,A ;放入30H開始的單元

INCR1 MOVA,B MOVCA,@A+DPTR

MOV@R1,A

INCR1 INCR0 DJNZR5,LOOP MOV3CH,#00H ;顯示字符串最后一個為00H標志

MOVR1,#30H MOVR5,#12 ;在LCD第2行第3列開始顯示

MOVA,#0C2H ACALLLCD_PRINT_CHAR RETTAB:DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H

;0~9的ASCII碼

DB41H,42H,43H,44H,45H,46H; ;A~F的ASCII碼

TAB1:DB"THESENDDATA",00H ;LCD第1行要顯示的字符串

END

從機程序清單如下(詳細解釋參考注釋):

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

EXTRNCODE(LCD_PRINT_CHAR)EXTRNCODE(LCD_PRINT_S) ORG0000H AJMPMAIN ORG0030HMAIN: ACALLLCD_INITIAL

ACALLINIT_ES MOVDPTR,#TAB1

MOVA,#80H

ACALLLCD_PRINT_S ACALLRECEIVE ACALLLCD_DISPLAY MOVR7,#0 DJNZR7,$ AJMP$

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

;子程序名:RECEIVE

;功能:從機從主機接收數(shù)據(jù);接收數(shù)據(jù)存放地址:內(nèi)部RAM20H~25H

;接收協(xié)議:;①接收主機發(fā)送的AAH,收到了AAH,發(fā)BBH應(yīng)答,否則重收;②從機接收主機發(fā)送的6個數(shù)據(jù)與累加和;③與從機本身求得的校驗和比較:如相等,向主機應(yīng)答00H;;若不等,向主機應(yīng)答非零數(shù)據(jù),請求主機重發(fā);------------------------------------------------------------------------------------RECEIVE:ACALLFROM_SBUF ;接收主機AAH CJNEA,#0AAH,RECEIVE ;若不是AAH重收

MOVA,#0BBH ;若是,向主機發(fā)送BBH ACALLTO_SBUFRECEIVE0: ;接收6個數(shù)據(jù)

MOVR7,#6

MOVR0,#20H MOVB,#00H

RECEIVE1:

ACALLFROM_SBUF MOV@R0,A ;求6個數(shù)據(jù)累加和

ADDA,B MOVB,A INCR0 DJNZR7,RECEIVE1 ACALLFROM_SBUF CLRC ;將收到的累加和與計算的累加和比較

SUBBA,B ACALLTO_SBUF;累加和比較的結(jié)果送主機

JNZRECEIVE0;累加和比較結(jié)果非零,重新接收6個數(shù)據(jù)

RET

;以下的子程序、ASCII碼表與主程序清單相同

INIT_ES:

TO_SBUF:

FROM_SBUF:

LCD_DISPLAY:

TAB:TAB1: DB"THERECEIVEDATA",00H ;LCD第1行要顯示的字符串

END圖8.17兩臺單片機通信仿真效果圖8.7多機通信MCS-51串行口的方式2和方式3可以用于多機通信,通常采用主從式多機通信方式來實現(xiàn)。在這種方式中,采用一臺主機和多臺從機。主機發(fā)送的信息可以傳送到各個從機或指定的從機,各從機發(fā)送的信息只能被主機接收,從機與從機之間不能進行通信。圖8.18是這種主從方式多機通信的連接示意圖。圖8.18主從方式多機通信多機通信的實現(xiàn)是依靠主、從機之間正確地設(shè)置與判斷SM2和發(fā)送接收的第9位數(shù)據(jù)來(TB8或RB8)完成的。在方式2和方式3下,SM2只對接收有影響,當SM2?=?1時,只接收第9位等于1的幀(稱地址幀),而SM2?=?0時,將接收全部數(shù)據(jù),不受第9位的影響。SM2和TB8(RB8)的作用總結(jié)如下:在單片機串行口以方式2或方式3接收時:

(1)若SM2=1,表示置多機通信功能位。這時有兩種情況:①接收到第9位數(shù)據(jù)RB8=1,此時數(shù)據(jù)裝入SBUF,并置RI=1,向CPU發(fā)送中斷請求;②接收到第9位數(shù)據(jù)RB8=0,此時不產(chǎn)生中斷,信息將被丟棄。

(2)若SM2=0,則接收到的第9位信息RB8無論是1還是0,都產(chǎn)生RI=1的中斷標志,接收的數(shù)據(jù)裝入SBUF。根據(jù)這個功能特點,就可以實現(xiàn)多機通信。8.7.1多機通信協(xié)議為保證通信正確,通信工程離不開通信協(xié)議。本例介紹一種簡單常用的通信協(xié)議,其通信過程如下:

(1)將所有從機處于只接收地址幀的狀態(tài),此時所有從機的控制位SM2被設(shè)置為1。

(2)主機發(fā)送指令數(shù)據(jù),指令的格式為:地址、功能、數(shù)據(jù)、校驗。主機的SCON設(shè)置為:SM2?=?0、REN?=?1、TB8=?1,其中發(fā)送地址時前8位表示從機地址,第9位TB8?=?1,表示當前幀為地址幀。

(3)從機接收到地址信息后,將本機地址與地址幀中的地址進行比較,如果地址相同,則接收主機發(fā)送的其他指令數(shù)據(jù),否則丟棄當前幀,依然處于只接收地址幀的狀態(tài)。從機對接收到的主機指令數(shù)據(jù)進行分析,根據(jù)收到的地址、功能和最后的校驗結(jié)果判斷數(shù)據(jù)接收是否正確。若校驗正確,則完成相應(yīng)的功能;若錯誤,則不執(zhí)行相應(yīng)的功能。這一過程中其他從機不受影響,根據(jù)功能,同時向主機發(fā)送應(yīng)答數(shù)據(jù)。然后,從機又回到準備接收地址幀的狀態(tài)。

(4)主機接收從機“應(yīng)答數(shù)據(jù)”,接收完成后,根據(jù)收到的地址、功能和最后的校驗結(jié)果判斷從機數(shù)據(jù)接收是否正確。若校驗正確,則完成相應(yīng)的功能;若錯誤,可重新與從機進行通信聯(lián)系。當主機需要與其他從機進行數(shù)據(jù)傳輸時,可以發(fā)送指令數(shù)據(jù)通過地址幀呼叫從機,重復(fù)這一過程。一個常用的單片機點對多點數(shù)據(jù)傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)如表8.5所示。功能字節(jié)和數(shù)據(jù)字節(jié)可以根據(jù)需要自己定義。例如:在某程序中,可以定義

01H—獲取A/D轉(zhuǎn)換的數(shù)據(jù),N?=?2,即A/D轉(zhuǎn)換的結(jié)果為2個字節(jié);

02H—命令從機啟動電機命令,N?=?3,為3號電機啟動;

03H—命令從機停止電機命令,N?=?2,為2號電機停止;等等,設(shè)計者可以根據(jù)測控的需要進行設(shè)計。8.7.2多機通信程序設(shè)計例:如圖8.19所示,一個主機通過RS-485總線(采用MAX487芯片)把2個從機(1#、2#)P1口的控制信息(由DSW撥碼盤控制)傳送給主機,并用條形LED顯示出來。本例的通信協(xié)議如表8.5所示,其功能是這樣定義的:功能01H為獲取從機P1口的狀態(tài),數(shù)據(jù)字節(jié)N?=?1。校驗采用累加和方式,只校驗和的最低字節(jié)。主機的程序流程圖如圖8.20所示。圖8.19多機485通信電路原理圖

圖8.20主機程序流程圖

主機程序及說明(見注釋語句)如下:

ORG0000H

AJMPMAIN

ORG0030HMAIN:MOVSCON,#0D8H;按8.7.1節(jié)設(shè)置SM2?=?0,允許接收,TB8?=?1

MOVPCON,#00H ;波特率不倍增

MOVTMOD,#20H ;T1為定時、方式2,產(chǎn)生波特率用

MOVTL1,#0E8H ;波特率為1200的初值

MOVTH1,#0E8H

SETBTR1 ;啟動T1定時

MAIN1:ACALLMASTER1 ;主機與#1從機通信

ACALLMASTER2 ;主機與#2從機通信

AJMPMAIN1 ;主程序循環(huán)MASTER1:MOV20H,#01H ;按8.7.1節(jié)過程(2)向1#從機發(fā)送指令;01H為 從機地址號

MOV21H,#01H;01H為功能號,獲取的P1口狀態(tài)

MOV22H,#01H;從機需要返回的P1口狀態(tài)字節(jié)數(shù)為1個字節(jié)

MOV23H,#03H;20H~22H的校驗和

ACALLSEND_DATA;將20H~23H發(fā)送給1#從機

ACALLRECEIVE ;接收1#從機的回答

ACALLSUM ;求校驗和

MOVA,20H ;如地址不是1,退出

CJNEA,#01H,MASTER3

MOVA,21H ;如功能不是1,退出

CJNEA,#01H,MASTER3

MOVA,23H ;如校驗和不等,退出

CJNEA,B,MASTER3

MOVP1,22H ;將1#從機P1口的狀態(tài)送主機的P1口顯示

RET

MASTER2: MOV20H,#02H ;按8.7.1節(jié)過程(2)向2#從機發(fā)送指令;注釋與MASTER1同

MOV21H,#01H MOV22H,#01H MOV23H,#04H ACALLSEND_DATA ACALLRECEIVE ACALLSUM MOVA,20H CJNEA,#01H,MASTER3 MOVA,21H CJNEA,#01H,MASTER3 MOVA,23H CJNEA,B,MASTER3 MOVP2,22H ;將2#從機P1口的狀態(tài)送主機的P2口顯示

MASTER3: RET

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

;子程序名:RECEIVE

;功能:接收從機應(yīng)答數(shù)據(jù);參數(shù):接收從機發(fā)來的4個數(shù)據(jù),存放在20H~23H

; 20H-從機地址; 21H-功能(返回的P1狀態(tài))

; 22H-從機P1口的狀態(tài)值; 23H-20H~22H的校驗和(只取最低字節(jié))

;--------------------------------------------------------------------------RECEIVE:MOVR7,#4

MOVR0,#20HRECEIVE1:ACALLFROM_SBUF

MOV@R0,A INCR0 DJNZR7,RECEIVE1

RET

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

;子程序名:SEND_DATA

;功能:發(fā)送數(shù)據(jù)或命令;參數(shù):發(fā)送4個數(shù)據(jù),存放在20H~23H

; 20H-從機地址; 21H-功能(返回的P1狀態(tài))

; 22H-從機需要返回的P1狀態(tài)字節(jié)數(shù); 23H-20H~22H的校驗和(只取最低字節(jié))

;----------------------------------------------------------------SEND_DATA: MOVR0,#20H

MOVR7,#4SEND_DAT1: MOVA,@R0 ACALLTO_SBUF

INCR0 DJNZR7,SEND_DAT1 RET

;----------------------------------------------------------------;子程序名:SUM

;功能:求20H~23H的校驗和;參數(shù):校驗和(只取最低字節(jié))存放在B

;---------------------------------------------SUM: MOVR7,#3 MOVR0,#20H

MOVB,#0 CLRCSUM1: MOVA,@R0 ADDCA,B MOVB,A

INCR0 DJNZR7,SUM1 RET

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

TO_SBUF:SETBP3.5 ;置MAX485為發(fā)送狀態(tài)

MOVSBUF,A

JNBTI,$ CLRTI

RET

;接收一個字節(jié)子程序

FROM_SBUF:CLRP3.5 ;置MAX485為接收狀態(tài)

JNBRI,$

CLRRI

MOVA,SBUF

RET

END圖8.21從機程序流程圖從機采用串口中斷接收方式。程序清單及說明(見注釋語句)如下:

SLAVE_NUMEQU01H ;定義的#1從機地址(2#從機為02H) ORG0000H AJMPMAIN ORG0023H ;串口中斷入口地址

AJMPS_INT ORG0030HMAIN:MOVSCON,#0F0H ;按8.7.1節(jié)過程(1)設(shè)置SM2?=?1, ;串口方式3,允許接收, ;TB8?=?1,SM2?=?1說明從機目前 處于接收地址幀狀態(tài)

MOVPCON,#00H ;波特率不倍增

MOVTMOD,#20H ;T1為定時、方式2,產(chǎn)生波特率用

MOVTL1,#0E8H ;查表8.2,波特率為1200的初值

MOVTH1,#0E8H SETBTR1 ;啟動T1定時

SETBEA ;允許總中斷

SETBES ;允許串口中斷

CLRP3.5 ;MAX487設(shè)置為接收狀態(tài)

AJMP$ ;從機等待串口中斷

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

;功能:串口中斷服務(wù)程序;原理:按8.7.1節(jié)過程(1)、(3)、(4)接收發(fā)送數(shù)據(jù);---------------------------------------------S_INT: ACALLFROM_SBUF ;接收主機發(fā)送的地址

CJNEA,#SLAVE_NUM,S_INT_END ;判斷是否是本從機地址號,如不是退出中斷

MOV20H,#SLAVE_NUM;如是本從機地址號,存入20H

CLRSM2 ;置從機為接收數(shù)據(jù)狀態(tài)

ACALLFROM_SBUF ;接收功能字節(jié),存21H

MOV21H,AACALLFROM_SBUF ;接收需要返回的P1狀態(tài)字節(jié)數(shù),存22HMOV22H,AACALLFROM_SBUF ;接收校驗和,存23HMOV23H,AACALLSUM ;求20H~22H的校驗和,結(jié)果存BMOVA,21H ;比較收到的功能字節(jié)是否為01H,否則 退出CJNEA,#01H,S_INT_ENDMOVA,22H ;比較返回的P1狀態(tài)字節(jié)數(shù)是否為01H, 否則退出CJNEA,#01H,S_INT_ENDMOVA,23HCJNEA,B,S_INT_END ;比較收到的校驗和是否與計算的相等, 否則退出MOVP1,#0FFH ;如滿足以上條件,將從機P1口的狀態(tài)送22HMOV22H,P1 ;MOVP1,#0FFH為根據(jù)讀取準雙向口的 要求,先送1ACALLSUM ;求20H~22H的校驗和,結(jié)果存BMOV23H,B ;校驗和存23HACALLSEND_DATA ;從機發(fā)給主機20H~23H的內(nèi)容S_INT_END:

SETBSM2 ;從機恢復(fù)到接收地址幀狀態(tài)

CLRP3.5 ;從機置MAX487為接收狀態(tài)

RETI ;中斷服務(wù)程序返回指令

;以下子程序與主機的程序清單相同

SEND_DATA:... ;發(fā)送20H~23H的子程序

SUM:...;求20H~22H校驗和子程序

TO_SBUF:... ;發(fā)送一個字節(jié)子程序

FROM_SBUF:... ;接收一個字節(jié)子程序

END8.8單片機與PC的串口通信

PC的串口一般為RS-232C,它采用負邏輯電平:(-15~-3)V為邏輯1;(+3~+15)V為邏輯0,(-3~+3)V為過渡區(qū),不作定義。因此,MCS-51系列單片機串行口與PC的RS-232C接口不能直接對接,必須進行電平轉(zhuǎn)換。常用的有MAX202、MAX232等芯片。本節(jié)將舉一個例子說明PC與51單片機雙機通信的軟件設(shè)計要點。圖8.22是單片機與PC串口通信的硬件連接原理圖。圖8.22單片機與PC的串行接口圖在PC上通常采用VB、VC等可視化語言設(shè)計界面。本節(jié)選用VB作為PC的軟件開發(fā)環(huán)境,介紹如何建立PC與單片機的串行通信。例:編寫程序,建立PC與51單片機的串行通信,通信過程為:PC先向單片機發(fā)送一組指令“AAH、03H、01H”,單片機正確接收數(shù)據(jù)后,每隔2秒向PC連續(xù)發(fā)送15個數(shù)據(jù)。

PC的界面和軟件設(shè)計步驟如下:

(1)啟動VB,建立“標準EXE”工程,如圖8.23所示。

圖8.23啟動VB,建立“標準EXE”工程

(2)準備添加串口部件。單擊“工程”菜單,選擇“部件”,如圖8.24所示。圖8.24準備添加串口部件

(3)在彈出的“部件”對話框的“控件”標簽中找到“MicrosoftCommControl6.0”,并選中,然后單擊“確定”,如圖8.25所示。串口部件

圖8.25添加串口部件(4)按圖8.26所示,在窗口中添加其余部件和文字。圖8.26在窗口中添加其余部件和文字(5)在相應(yīng)的代碼窗口,輸入如下函數(shù):

DimInBte()AsByteDimOutByte(0)AsBytePrivateSubComPortOpen()WithMSComm1.CommPort=3.Settings="9600,n,8,1".InBufferSize=100.OutBufferSize=1.InputMode=1.InputLen=100.SThreshold=1.InBufferCount=0'清除接收緩沖區(qū)

.RThreshold=15EndWithEndSubPrivateSubCommand1_Click()Dimj,n

n=0IfMSComm1.PortOpen=FalseThenMSComm1.PortOpen=True

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論