版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
8.1串行通信基本知識8.2MCS-51串口控制器8.3串行口的工作方式8.4波特率的制定方法8.5串行通信的接口電路8.6串口的編程與應用8.7多機通信8.8單片機與PC的串口通信第8章串行通信接口8.1.1概述
計算機與外界的信息交換稱為通信?;就ㄐ欧绞接袃煞N:
并行通信(parallelcommunication):所傳送數據的各位同時發(fā)送或接收。
串行通信(serialcommunication):所傳送數據的各位按順序一位一位地發(fā)送或接收。
圖8.1為這兩種通信方式的示意圖。8.1串行通信基本知識圖8.1兩種通信方式的示意圖
(a)并行通信;(b)串行通信在并行通信中,一個并行數據占多少二進制位,就需要多少根數據傳輸線。這種方式的特點是通信速度快,但傳輸線多,價格較貴,適合近距離傳輸;而串行通信僅需2根傳輸線即可,故在長距離傳輸數據時,成本較低。但由于它每次只能傳輸一位,因此傳輸速度較慢。
下面介紹串行通信中的一些基本概念。1.串行通信的制式
在串行通信中,數據是在兩個站之間進行傳送的,按照數據傳送方向,串行通信可分為單工(simplex)、半雙工(halfduplex)和全雙工(fullduplex)三種制式。圖8.2為三種制式的示意圖。圖8.2單工、半雙工和全雙工三種制式示意圖(a)單工;(b)半雙工;(c)全雙工在單工制式下,通信線的一端為發(fā)送器,一端為接收器,數據只能按照一個固定的方向傳送,如圖8.2(a)所示。
在半雙工制式下,系統的每個通信設備都由一個發(fā)送器和一個接收器組成,如圖8.2(b)所示。在這種制式下,數據能從A站傳送到B站,也可以從B站傳送到A站,但是不能同時在兩個方向上傳送,即只能一端發(fā)送,一端接收。其收/發(fā)開關一般是由軟件控制的電子開關。全雙工通信系統的每端都有發(fā)送器和接收器,可以同時發(fā)送和接收,即數據可以在兩個方向上同時傳送,如圖8.2(c)所示。
在實際應用中,盡管多數串行通信接口電路具有全雙工功能,但一般情況下,只工作于半雙工制式下,因為這種用法簡單、實用。圖8.2單工、半雙工和全雙工三種制式示意圖(a)單工;(b)半雙工;(c)全雙工2.波特率(baudrate)
波特率為每秒傳送二進制數的位數,單位為b/s,即位/秒。波特率用于表征數據傳輸的速度,波特率越高,數據傳輸速度越快。
3.異步串行通信
在異步串行通信中,數據是一幀一幀傳送的,每幀數據包括一位起始位、一個字節(jié)數據、一位校驗位和一位停止位。每幀數據之間可以插入若干個高電平的空閑位。
異步串行通信要求發(fā)送數據和接收數據雙方約定相同的數據格式和波特率,用啟、停位來協同發(fā)送與接收過程。接收和發(fā)送端采用獨立的移位脈沖控制數據的串行移出與移入,發(fā)送移位脈沖與接收移位脈沖是異步,因此稱為異步串行通信。
異步串行通信中,每幀數據只有一個字節(jié)數據,也不需要同步脈沖,因此應用較為靈活。但由于每幀數據需要插入啟停位,故傳輸速度較慢。
4.同步串行通信
同步串行通信是一種連續(xù)的數據傳送方式。每次傳送一幀數據,每幀數據由同步字符和若干個數據及校驗字符組成。
同步串行通信中,發(fā)送和接收雙方由同一個同步脈沖控制,數據位的串行移出與移入是同步,因此稱為同步串行通信。同步串行通信速度快,適應于大量數據傳輸場合,但需要同步脈沖信號,控制較復雜。
MCS-51有一個可編程的全雙工串行通信接口,可作為通用異步接收/發(fā)送器(UART-UniversalAsychronousReceiver/Transmitter),也可作為同步移位寄存器。其幀格式可為8位、10位、11位,并可設置多種不同的波特率。它通過引腳RXD和TXD與外界進行通信。
8.2MCS-51串口控制器
MCS-51內部有兩個物理上獨立的接收、發(fā)送緩沖器SBUF。SBUF屬于特殊功能寄存器。一個用于存放接收到的數據,另一個用于存放欲發(fā)送的數據,可同時發(fā)送和接收數據。兩個緩沖器共用一個地址99H,通過對SBUF的讀、寫指令來區(qū)別是對接收緩沖器還是對發(fā)送緩沖器進行操作。CPU在寫SBUF時,就是修改發(fā)送緩沖器;讀SBUF,就是讀接收緩沖器的內容。接收或發(fā)送數據,是通過串行口對外的兩條獨立收發(fā)信號線RXD(P3.0)、TXD(P3.1)來實現的,因此可以同時發(fā)送、接收數據。串行口的結構如圖8.3所示。圖8.3串行口結構示意圖8.2.1串口控制寄存器(SCON)
SCON的字節(jié)地址是98H,其格式及各位的含義如下:
SM0、SM1——串行口4種工作方式的選擇位。串行口的4種工作方式如表8.1所示。表8.1串行口的4種工作方式
SM2——多機通信控制位,用于方式2或方式3中。
當串行口以方式2或方式3接收時:
如果SM2=1,只有當接收到的第9位數據(RB8)為“1”時,才將接收到的前8位數據送入SBUF,并將RI置“1”,產生中斷請求;當接收到的第9位數據(RB8)為“0”時,則將接收到的前8位數據丟棄。
如果SM2=0,則不論第9位數據是“1”還是“0”,都將前8位數據送入SBUF中,并將RI置“1”,產生中斷請求。
在方式1時,如果SM2=1,則只有收到停止位時才會激活RI。
在方式0時,SM2必須為0。
REN——允許串行接收位,由軟件置“1”或清“0”。
REN=1時,允許串行口接收數據;
REN=0時,禁止串行口接收數據。
TB8——發(fā)送的第9位數據。
在方式2和方式3下,TB8是要發(fā)送的第9位數據,其值由用戶通過軟件設置,可作為奇偶校驗位使用,RT?=?1作為地址幀標志,RT=0作為數據幀的標志。
RB8—接收到的第9位數據。
在方式2和方式3下,RB8存放接收到的第9位數據,它代表接收到的數據的特征:可能是奇偶校驗位,也可能是地址/數據幀的標志位。在方式1下,如果SM2?=?0,則RB8是接收到的停止位。在方式0下,不使用RB8。
TI—發(fā)送中斷標志位。發(fā)送中TI必須保持零電平。
在方式0下,串行發(fā)送第8位數據結束時由硬件置“1”。在其他工作方式下,串行口發(fā)送停止位開始時置“1”。TI?=?1,表示一幀數據發(fā)送結束,可供軟件查詢,也可申請中斷。CPU響應中斷后,在中斷服務程序中向SBUF寫入要發(fā)送的下一幀數據,TI必須由軟件再清0。RI—接收中斷標志位。接收中RI必須保持零電平。
在方式0下,接收完第8位數據時,RI由硬件置1。在其他工作方式下,串行接收到停止位時,該位置“1”。RI?=?1,表示一幀數據接收完畢,并可申請中斷,要求CPU從接收SBUF取走數據。該位的狀態(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位數據為一幀,不設起始位和停止位,先發(fā)送或接收最低位。波特率固定為fosc/12。8.3串行口的工作方式1.方式0發(fā)送當CPU執(zhí)行一條將數據寫入發(fā)送緩沖器SBUF的指令時,產生一個正脈沖,串行口即把SBUF中的8位數據以fosc/12的固定波特率從RXD引腳串行輸出,低位在先,TXD引腳輸出同步移位脈沖,發(fā)送完8位數據后,將中斷標志位TI置“1”。時序如圖8.4所示。圖8.4方式0發(fā)送時序
2.方式0接收
方式0接收時,REN為串行口接收允許接收控制位,REN?=?0,禁止接收。
在方式0下,SCON中的TB8、RB8位未用,發(fā)送或接收完8位數據后由硬件將TI或RI中斷標志位置“1”,CPU響應中斷。TI或RI標志位須由用戶軟件清“0”,可采用如下指令:
CLRTI ;TI位清“0”
CLRRI ;RI位清“0”
在方式0下,SM2位(多機通信控制位)必須為0。8.3.2方式1
方式1用于數據的串行發(fā)送和接收。TXD腳和RXD腳分別用于發(fā)送和接收數據。
方式1收、發(fā)一幀的數據為10位,1位起始位(0),8位數據位,1位停止位(1),先發(fā)送或接收最低位。
波特率由下式確定:
1.方式1發(fā)送
方式1輸出時,數據位由TXD端輸出。當CPU執(zhí)行一條數據寫發(fā)送緩沖器SBUF的指令時,就啟動發(fā)送。圖8.5(a)TX時鐘的頻率就是發(fā)送的波特率。發(fā)送開始時,內部發(fā)送控制信號變?yōu)橛行В瑢⑵鹗嘉幌騎XD輸出。此后,每經過一個TX時鐘周期,便產生一個移位脈沖,并由TXD輸出一個數據位。8位數據位全部發(fā)送完畢后,中斷標志位TI置“1”。TI必須由用戶清0,以便下一次發(fā)送。圖8.5方式1發(fā)、收時序(a)發(fā)送時序;(b)接收時序(a)(b)2.方式1接收
方式1接收接收數據的時序如圖8.5(b)所示。當CPU采樣到RXD端從1到0的跳變時(3次采樣中至少2次有效),開始接收數據。一幀數據接收完畢以后,必須同時滿足以下兩個條件,這次接收才真正有效,然后RI自動置1。
(1)?RI=0。
(2)?SM2=0或收到的停止位=1。
若這兩個條件不滿足,則收到的數據不能裝入SBUF,該幀數據將丟失。中斷標志RI必須由用戶清0,以便下一次接收。通常情況下,串口以方式1工作時,SM2=0。8.3.3方式2
方式2為9位異步通信方式。每幀數據均為11位,1位起始位0,8位數據位(先低位),1位可程控的第9位數據和1位停止位。
方式2的波特率由下式確定:
1.方式2發(fā)送
發(fā)送前,先根據通信協議由軟件設置TB8(例如,雙機通信時的奇偶校驗位或多機通信時的地址/數據的標志位)。方式2發(fā)送數據波形如圖8.6所示。圖8.6方式2發(fā)送時序
2.方式2接收
SM0、SM1=10,且REN=1。數據由RXD端輸入,接收11位信息。當位檢測邏輯采樣到RXD引腳從1到0的負跳變,并判斷起始位有效后,便開始接收一幀信息。在接收完第9位數據后,需滿足以下兩個條件,才能將接收到的數據送入SBUF。
(1)?RI=0,意味著接收緩沖器為空。
(2)?SM2=0或接收到的第9位數據位RB8=1。圖8.7方式2接收時序8.3.4方式3
當SM0、SM1=11時,串行口工作在方式3。方式3為波特率可變的9位異步通信方式,除波特率外,方式3和方式2相同。方式3發(fā)送和接收數據的時序波形見方式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位的值有關。
若fosc=12MHz,則當SMOD=0時,波特率B=187.5kb/s;當SMOD=1時,波特率=375kb/s。8.4波特率的制定方法
(3)串行口工作在方式1或方式3時,常用定時器T1作為波特率發(fā)生器,其波特率為:其中,T1的溢出率?=?定時器T1的溢出次數/秒。實際設定波特率時,T1常設置為方式2定時方式(自動裝初值),這種方式不僅操作方便,也可避免因軟件重裝初值而帶來的定時誤差。
當T1工作于方式2定時方式時,計數脈沖來源于晶振的1/12,即每秒fosc/12次,若計數初值為x,則每計數28-x次將產生一次溢出,所以
將此式代入方式1、方式3波特率的計算公式,可得到計算初值的公式為其中:x為計數初值;B為此條件下產生的波特率。表8.2定時器T1產生的常用波特率
例:若51單片機的時鐘振蕩頻率為11.0592MHz,選用T1為方式2定時作為波特率發(fā)生器,波特率為2400b/s,求初值。
用上述公式計算T1的初值為
上述結果可直接從表8.2中查到,為F4H,與計算結果一致。晶振選為11.0592MHz,可使計算過程無余數產生,初值為整數,從而產生精確的波特率。8.5.1RS-232C接口
RS-232C是使用最早,應用最多的一種異步串行通信總線標準。它是美國電子工業(yè)協會(EIA)1962年公布,1969年最后修定而成的。其中,RS表示recommendedstandard,232是該標準的標識號,C表示一次修定。1987年修訂為EIA-232D,1991年修訂為EIA-232E,1997年修訂為EIA-232F。由于修訂的內容不多,因此人們習慣于早期的名字“RS-232C”。8.5串行通信的接口電路
RS-232C主要用來定義計算機系統的一些數據終端設備(DTE)和數據電路終端設備(DCE)之間的電氣性能。由于MCS-51系列單片機本身有一個全雙工的串行接口,因此該系列單片機用RS-232C串行接口總線非常方便。
下面介紹RS-232C的一些主要特性。
1.機械特性
RS-232C接口規(guī)定使用25針連接器,但一般應用中并不一定用到RS-232C標準的全部信號線,而常常使用9針連接器,連接器的引腳定義如圖8.8和表8.3所示。圖中所示為陽頭定義,通常的PC機主板上都采用這種器件,對應的陰頭用于連接線。它們的序號順序是相反的,使用時要小心。圖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電平直接相連,使用時必須進行電平轉換,否則將使TTL電路燒壞,實際應用時必須注意!
RS-232C串行接口總線適用于設備之間通信距離不大于15m,傳輸速率小于20kb/s的情況。
3.?RS-232C電平與TTL電平轉換器
MCS-51系列單片機串行口與PC機的RS-232C接口不能直接對接,必須進行電平轉換。常用的電平轉換芯片有MAX232、MAX202等。它們可以滿足RS-232C的電氣規(guī)范,且僅用+5?V電源,其內置電子泵電壓轉換器將?+5?V電源轉換成?-10?V~+10?V。這類芯片與TTL/CMOS電平兼容,片內有兩個發(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è)領域也大量使用串行通信作為數據交換的手段??墒枪I(yè)環(huán)境通常會有噪聲干擾傳輸線路,在用RS-232C串行通信進行傳輸時經常會受到
外界的電氣干擾而使信號發(fā)生錯誤。為了解決以上問題,RS-485串行通信方式就應運而生了。
RS-232C利用傳輸信號線與公共地之間的電壓差,而RS-485則利用信號導線之間的信號電壓差。它通過傳輸線驅動器,把邏輯電平變換成電位差,完成始端的信號傳送;通過傳輸線接收器,把電位差轉換成邏輯電平,完成終端的信息接收,如圖8.10所示。圖8.10RS-485接口示意圖RS-485比RS-232C傳輸距離長、速度快,傳輸速率最大可達10Mb/s,最大距離可達1200m。
RS-485是一點對多點的通信接口,一般采用雙絞線的結構。普通的PC一般不帶RS-485接口,因此要使用RS-232/RS-485轉換器。在計算機和單片機組成的RS-485通信系統(如圖8.11所示)中,下位機由單片機系統組成,主要完成工業(yè)現場信號的采集和控制。上位機為工業(yè)PC,負責監(jiān)視下位機的運行狀態(tài),并對其狀態(tài)信息進行集中處理,以圖文方式顯示下位機的工作狀態(tài)和工業(yè)現場被控設備的工作狀態(tài)。系統中的各節(jié)點(包括上位機)的識別是通過設置不同的站地址來實現的。圖8.11RS-485總線組成的測控系統圖8.12MAX1487引腳表8.4MAX1487引腳說明8.6.1用串行口擴展并行I/O口
在方式0下,串行口是作為同步移位寄存器使用的。它可以與“并入串出”功能(如74LS165等),或“串入并出”功能(如74LS164等)的移位寄存器配合使用。
圖8.13是74LS165和74LS164的引腳圖。8.6串口的編程與應用圖8.1374LS165、74LS164引腳圖
1.用并行輸入8位移位寄存器74LS165擴展輸入口圖8.14是利用并行輸入8位移位寄存器74LS165擴展輸入口的電路圖。從理論上講,利用這種方法可以擴展更多的輸入口,但擴展得越多,口的操作速度就越低。74LS165的串行輸出數據QH接收RXD作為單片機串行口的數據,而74LS165的移位時鐘則由單片機TXD端提供。P1.2作為74LS165的接收和移位控制端SH/。當SH/?
=?0時,允許74LS165置入并行數據;當SH/?
=?1時,允許74LS165串行移位輸出數據。圖8.14利用串行口擴展輸入口
在圖8.14中,74LS165從一個8位的撥碼盤DSW(即圖8.14所示的8個開關)獲取每一個開關的閉合信息。由于74LS165的D0~D7都接了10kΩ的上拉電阻,所以當DSW中對應的開關未閉合時為高電平“1”,閉合接地時為低電平“0”。這些信息通過SO、CLK串行傳送給89C51,并通過P1口上的LED發(fā)光二極管顯示。當然,也可以用這些信息通過接口電路去控制其他的設備。程序選用方式0,將SCON的REN置位后,就開始一個數據的接收過程。程序從8位擴展口讀入數據。
程序代碼如下:
ORG 0000H MOV SCON,#10H ;串口方式0,啟動接收
START: CLR P3.2 ;允許并行置入數據
SETB P3.2 ;允許串行移位
JNB RI,$ ;等待接收一幀數據結束
CLR RI ;接收結束,清RI中斷標志
MOV A,SBUF ;讀取串行緩沖器中的數據
MOV P1,A ;放入片內RAM中
ACALLDELAYAJMPSTARTDELAY: MOVR7,#10 DJNZR7,$ RET ;延時
END
2.用8位并行輸出串行移位寄存器74LS164擴展輸出口圖8.15是MCS51串口配合8位并行輸出串行移位寄存器74LS164擴展輸出口的LED顯示原理圖。圖8.1574LS164顯示8位LED數碼管電路原理圖
圖中串行口的數據通過RXD加到74LS164的輸入端,單片機的TXD引腳作為移位時鐘加到74LS164的CLK端。圖中的8位共陽極七段LED顯示器,由于74LS164在低電平輸出時,允許通過的電流可達20mA,因此不需要再加LED驅動電路。程序將78H~7FH中的數據(0~9)送到8位LED中顯示。
子程序如下:
MOVSCON,#00H;此句放在主程序中,方式0,RI=0,REN=0
DIR: MOVR7,#08H ;8位LED MOVR0,#7FH ;顯示緩沖區(qū)首址
DL0: MOVA,@R0;取出要顯示的數
MOVDPTR,#TAB;查表
MOVCA,@A+DPTR MOVSBUF,A ;送出顯示
DL1: JNBTI,DL1 ;輸出完否?
CLRTI ;完,清中斷標志
DECR0 ;再取下一個數
DJNZR7,DL0 RET ;返回
TAB: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H ;0~9的段碼
8.6.2單片機與單片機通信
為保證兩臺單片機通信的準確,雙方要遵循一個簡單協議。以下是一個簡單的通信協議,協議的程序框圖如圖8.16所示。圖8.16兩臺單片機通信協議的程序框圖
通信開始,主機首先向從機發(fā)送AAH,從機收到后發(fā)給主機應答B(yǎng)BH,表示同意接收。主機收到從機應答B(yǎng)BH后,發(fā)送數據塊,并發(fā)送校驗和。注意:AAH、BBH不是唯一的發(fā)送、應答標志,還可以采用其他標志。從機接收到主機發(fā)送的數據后保存,收齊一個數據塊后,再接收主機發(fā)來的校驗和,并與從機本身求得的校驗和比較:如相等,則說明接收正確,向主機發(fā)應答00H;若不等,則說明接收不正確,向主機發(fā)應答非零數據,請求主機重發(fā)。
如后面的圖8.17所示,U1為主機,U2為從機,兩機通過串口連接(注意RXD和TXD相反互接),主機按以上通信協議發(fā)送6個數據給從機,從機也按這個協議接收這6個數據,接收與發(fā)送成功后,把發(fā)送、接收的結果顯示在LCM1602上。程序清單如下。
主機程序清單(詳細解釋參考注釋):
EXTRNCODE(LCD_INITIAL) ;引用LCD1602模塊中公用子程序的聲明
EXTRNCODE(LCD_PRINT_CHAR)EXTRNCODE(LCD_PRINT_S) ORG0000H AJMPMAIN ORG0030HMAIN: ;主程序
MOV20H,#0AH ;要發(fā)送的6個數據存入20H~25H MOV21H,#1BH MOV22H,#2CH
MOV23H,#3DH MOV24H,#4EH
MOV25H,#5FH ACALLLCD_INITIAL ;初始化LCM1602 ACALLINIT_ES ;設置串口
MOVA,#81H ;在LCD第1行,第1列
MOVDPTR,#TAB1 ACALLLCD_PRINT_S ;顯示TAB1的字符串
ACALLSEND ;發(fā)送數據
ACALLLCD_DISPLAY ;將發(fā)送的數據顯示在LCD AJMP$INIT_ES: ;串口初始化子程序
MOVTMOD,#20H ;T1工作于方式2 MOVPCON,#00H MOVTL1,#0E8H ;波特率為1200 MOVTH1,#0E8H MOVSCON,#50H ;串口工作于方式1,允許接收
SETBTR1 ;啟動T1 RET
;------------------------------------------------------------------------------;子程序名:SEND
;功能:主機向從機發(fā)送數據;數據存放地址:內部RAM20H~5H
;發(fā)送協議:; ①主機發(fā)送AAH
; ②從機如收到了AAH,發(fā)BBH應答; ③主機收到BBH后發(fā)送6個數據; ④主機收到如不是BBH后,返回①; ⑤發(fā)送6個數據的累加和(結果只采用一個字節(jié))
; ⑥接收從機的答復,如是00H,發(fā)送結束; ⑦如非零,重發(fā)6個數據與累加和;---------------------------------------------------------------------SEND:MOVA,#0AAH ;發(fā)送AAH ACALLTO_SBUF ACALLFROM_SBUF ;接收從機的應答
CJNEA,#0BBH,SEND ;如不是BBH,重新發(fā)送
SEND0:MOVR0,#20H ;從20H~25H中依次發(fā)送數據
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個數據
RET
TO_SBUF:MOVSBUF,A ;發(fā)送一個字節(jié)子程序
JNBTI,$ CLRTI RETFROM_SBUF: ;接收一個字節(jié)子程序
JNBRI,$ CLRRI MOVA,SBUF
RET
;-----------------------------------------------------------------------------------------
;子程序名:LCD_DISPLAY
;功能:將數據塊20H~25H的內容送LCD顯示;原理:把要顯示的一個字節(jié)分解成高4位和低4位(用除16實現)
; 查表,將它們分別轉換成ASCII碼,依次放入30H起始的單元; 調LCD_PRINT_CHAR進行顯示;--------------------------------------------------------------------------
LCD_DISPLAY:
MOVR0,#20H MOVR1,#30H MOVR5,#6 ;循環(huán)6次值
LOOP: MOVA,@R0 ;取出數據
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
;功能:從機從主機接收數據;接收數據存放地址:內部RAM20H~25H
;接收協議:;①接收主機發(fā)送的AAH,收到了AAH,發(fā)BBH應答,否則重收;②從機接收主機發(fā)送的6個數據與累加和;③與從機本身求得的校驗和比較:如相等,向主機應答00H;;若不等,向主機應答非零數據,請求主機重發(fā);------------------------------------------------------------------------------------RECEIVE:ACALLFROM_SBUF ;接收主機AAH CJNEA,#0AAH,RECEIVE ;若不是AAH重收
MOVA,#0BBH ;若是,向主機發(fā)送BBH ACALLTO_SBUFRECEIVE0: ;接收6個數據
MOVR7,#6
MOVR0,#20H MOVB,#00H
RECEIVE1:
ACALLFROM_SBUF MOV@R0,A ;求6個數據累加和
ADDA,B MOVB,A INCR0 DJNZR7,RECEIVE1 ACALLFROM_SBUF CLRC ;將收到的累加和與計算的累加和比較
SUBBA,B ACALLTO_SBUF;累加和比較的結果送主機
JNZRECEIVE0;累加和比較結果非零,重新接收6個數據
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可以用于多機通信,通常采用主從式多機通信方式來實現。在這種方式中,采用一臺主機和多臺從機。主機發(fā)送的信息可以傳送到各個從機或指定的從機,各從機發(fā)送的信息只能被主機接收,從機與從機之間不能進行通信。圖8.18是這種主從方式多機通信的連接示意圖。圖8.18主從方式多機通信多機通信的實現是依靠主、從機之間正確地設置與判斷SM2和發(fā)送接收的第9位數據來(TB8或RB8)完成的。在方式2和方式3下,SM2只對接收有影響,當SM2?=?1時,只接收第9位等于1的幀(稱地址幀),而SM2?=?0時,將接收全部數據,不受第9位的影響。SM2和TB8(RB8)的作用總結如下:在單片機串行口以方式2或方式3接收時:
(1)若SM2=1,表示置多機通信功能位。這時有兩種情況:①接收到第9位數據RB8=1,此時數據裝入SBUF,并置RI=1,向CPU發(fā)送中斷請求;②接收到第9位數據RB8=0,此時不產生中斷,信息將被丟棄。
(2)若SM2=0,則接收到的第9位信息RB8無論是1還是0,都產生RI=1的中斷標志,接收的數據裝入SBUF。根據這個功能特點,就可以實現多機通信。8.7.1多機通信協議為保證通信正確,通信工程離不開通信協議。本例介紹一種簡單常用的通信協議,其通信過程如下:
(1)將所有從機處于只接收地址幀的狀態(tài),此時所有從機的控制位SM2被設置為1。
(2)主機發(fā)送指令數據,指令的格式為:地址、功能、數據、校驗。主機的SCON設置為:SM2?=?0、REN?=?1、TB8=?1,其中發(fā)送地址時前8位表示從機地址,第9位TB8?=?1,表示當前幀為地址幀。
(3)從機接收到地址信息后,將本機地址與地址幀中的地址進行比較,如果地址相同,則接收主機發(fā)送的其他指令數據,否則丟棄當前幀,依然處于只接收地址幀的狀態(tài)。從機對接收到的主機指令數據進行分析,根據收到的地址、功能和最后的校驗結果判斷數據接收是否正確。若校驗正確,則完成相應的功能;若錯誤,則不執(zhí)行相應的功能。這一過程中其他從機不受影響,根據功能,同時向主機發(fā)送應答數據。然后,從機又回到準備接收地址幀的狀態(tài)。
(4)主機接收從機“應答數據”,接收完成后,根據收到的地址、功能和最后的校驗結果判斷從機數據接收是否正確。若校驗正確,則完成相應的功能;若錯誤,可重新與從機進行通信聯系。當主機需要與其他從機進行數據傳輸時,可以發(fā)送指令數據通過地址幀呼叫從機,重復這一過程。一個常用的單片機點對多點數據傳輸的數據幀結構如表8.5所示。功能字節(jié)和數據字節(jié)可以根據需要自己定義。例如:在某程序中,可以定義
01H—獲取A/D轉換的數據,N?=?2,即A/D轉換的結果為2個字節(jié);
02H—命令從機啟動電機命令,N?=?3,為3號電機啟動;
03H—命令從機停止電機命令,N?=?2,為2號電機停止;等等,設計者可以根據測控的需要進行設計。8.7.2多機通信程序設計例:如圖8.19所示,一個主機通過RS-485總線(采用MAX487芯片)把2個從機(1#、2#)P1口的控制信息(由DSW撥碼盤控制)傳送給主機,并用條形LED顯示出來。本例的通信協議如表8.5所示,其功能是這樣定義的:功能01H為獲取從機P1口的狀態(tài),數據字節(jié)N?=?1。校驗采用累加和方式,只校驗和的最低字節(jié)。主機的程序流程圖如圖8.20所示。圖8.19多機485通信電路原理圖
圖8.20主機程序流程圖
主機程序及說明(見注釋語句)如下:
ORG0000H
AJMPMAIN
ORG0030HMAIN:MOVSCON,#0D8H;按8.7.1節(jié)設置SM2?=?0,允許接收,TB8?=?1
MOVPCON,#00H ;波特率不倍增
MOVTMOD,#20H ;T1為定時、方式2,產生波特率用
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é)數為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
;功能:接收從機應答數據;參數:接收從機發(fā)來的4個數據,存放在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ā)送數據或命令;參數:發(fā)送4個數據,存放在20H~23H
; 20H-從機地址; 21H-功能(返回的P1狀態(tài))
; 22H-從機需要返回的P1狀態(tài)字節(jié)數; 23H-20H~22H的校驗和(只取最低字節(jié))
;----------------------------------------------------------------SEND_DATA: MOVR0,#20H
MOVR7,#4SEND_DAT1: MOVA,@R0 ACALLTO_SBUF
INCR0 DJNZR7,SEND_DAT1 RET
;----------------------------------------------------------------;子程序名:SUM
;功能:求20H~23H的校驗和;參數:校驗和(只取最低字節(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)設置SM2?=?1, ;串口方式3,允許接收, ;TB8?=?1,SM2?=?1說明從機目前 處于接收地址幀狀態(tài)
MOVPCON,#00H ;波特率不倍增
MOVTMOD,#20H ;T1為定時、方式2,產生波特率用
MOVTL1,#0E8H ;查表8.2,波特率為1200的初值
MOVTH1,#0E8H SETBTR1 ;啟動T1定時
SETBEA ;允許總中斷
SETBES ;允許串口中斷
CLRP3.5 ;MAX487設置為接收狀態(tài)
AJMP$ ;從機等待串口中斷
;---------------------------------------------
;功能:串口中斷服務程序;原理:按8.7.1節(jié)過程(1)、(3)、(4)接收發(fā)送數據;---------------------------------------------S_INT: ACALLFROM_SBUF ;接收主機發(fā)送的地址
CJNEA,#SLAVE_NUM,S_INT_END ;判斷是否是本從機地址號,如不是退出中斷
MOV20H,#SLAVE_NUM;如是本從機地址號,存入20H
CLRSM2 ;置從機為接收數據狀態(tài)
ACALLFROM_SBUF ;接收功能字節(jié),存21H
MOV21H,AACALLFROM_SBUF ;接收需要返回的P1狀態(tài)字節(jié)數,存22HMOV22H,AACALLFROM_SBUF ;接收校驗和,存23HMOV23H,AACALLSUM ;求20H~22H的校驗和,結果存BMOVA,21H ;比較收到的功能字節(jié)是否為01H,否則 退出CJNEA,#01H,S_INT_ENDMOVA,22H ;比較返回的P1狀態(tài)字節(jié)數是否為01H, 否則退出CJNEA,#01H,S_INT_ENDMOVA,23HCJNEA,B,S_INT_END ;比較收到的校驗和是否與計算的相等, 否則退出MOVP1,#0FFH ;如滿足以上條件,將從機P1口的狀態(tài)送22HMOV22H,P1 ;MOVP1,#0FFH為根據讀取準雙向口的 要求,先送1ACALLSUM ;求20H~22H的校驗和,結果存BMOV23H,B ;校驗和存23HACALLSEND_DATA ;從機發(fā)給主機20H~23H的內容S_INT_END:
SETBSM2 ;從機恢復到接收地址幀狀態(tài)
CLRP3.5 ;從機置MAX487為接收狀態(tài)
RETI ;中斷服務程序返回指令
;以下子程序與主機的程序清單相同
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接口不能直接對接,必須進行電平轉換。常用的有MAX202、MAX232等芯片。本節(jié)將舉一個例子說明PC與51單片機雙機通信的軟件設計要點。圖8.22是單片機與PC串口通信的硬件連接原理圖。圖8.22單片機與PC的串行接口圖在PC上通常采用VB、VC等可視化語言設計界面。本節(jié)選用VB作為PC的軟件開發(fā)環(huán)境,介紹如何建立PC與單片機的串行通信。例:編寫程序,建立PC與51單片機的串行通信,通信過程為:PC先向單片機發(fā)送一組指令“AAH、03H、01H”,單片機正確接收數據后,每隔2秒向PC連續(xù)發(fā)送15個數據。
PC的界面和軟件設計步驟如下:
(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)在相應的代碼窗口,輸入如下函數:
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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 毽子里的銅錢課件
- 《心肌梗死健康宣教》課件
- 單位管理制度展示選集【職工管理】
- 單位管理制度展示大全【職員管理篇】
- 2025年家電行業(yè)策略報告:內銷走出休息區(qū)關注外銷自主品牌
- 幼兒園組織與管理課件
- 2025物品保管合同范本
- 北大中醫(yī)養(yǎng)生學課件 飲食類養(yǎng)生
- 砂場項目立項申請報告模板
- 中國國有銀行市場全面調研及行業(yè)投資潛力預測報告
- GB/T 25279-2022中空纖維簾式膜組件
- 五年級《歐洲民間故事》知識考試題庫(含答案)
- 破產管理人工作履職報告(優(yōu)選.)
- 022化妝品委托加工合同
- 樁裂縫計算(自動版)
- 高邊坡施工危險源辨識及分析
- 給排水全套資料表格模版
- 萬噸鈦白粉項目建議
- 化妝品購銷合同范本
- 7725i進樣閥說明書
- 銀監(jiān)會流動資金貸款需求量測算表
評論
0/150
提交評論