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

下載本文檔

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

文檔簡(jiǎn)介

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

計(jì)算機(jī)與外界的信息交換稱為通信?;就ㄐ欧绞接袃煞N:

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

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

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

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

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

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

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

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

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

3.異步串行通信

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

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

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

4.同步串行通信

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

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

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

8.2MCS-51串口控制器

MCS-51內(nèi)部有兩個(gè)物理上獨(dú)立的接收、發(fā)送緩沖器SBUF。SBUF屬于特殊功能寄存器。一個(gè)用于存放接收到的數(shù)據(jù),另一個(gè)用于存放欲發(fā)送的數(shù)據(jù),可同時(shí)發(fā)送和接收數(shù)據(jù)。兩個(gè)緩沖器共用一個(gè)地址99H,通過(guò)對(duì)SBUF的讀、寫(xiě)指令來(lái)區(qū)別是對(duì)接收緩沖器還是對(duì)發(fā)送緩沖器進(jìn)行操作。CPU在寫(xiě)SBUF時(shí),就是修改發(fā)送緩沖器;讀SBUF,就是讀接收緩沖器的內(nèi)容。接收或發(fā)送數(shù)據(jù),是通過(guò)串行口對(duì)外的兩條獨(dú)立收發(fā)信號(hào)線RXD(P3.0)、TXD(P3.1)來(lái)實(shí)現(xiàn)的,因此可以同時(shí)發(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——多機(jī)通信控制位,用于方式2或方式3中。

當(dāng)串行口以方式2或方式3接收時(shí):

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

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

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

在方式0時(shí),SM2必須為0。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.方式0接收

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

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

CLRTI ;TI位清“0”

CLRRI ;RI位清“0”

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

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

(1)?RI=0。

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

若這兩個(gè)條件不滿足,則收到的數(shù)據(jù)不能裝入SBUF,該幀數(shù)據(jù)將丟失。中斷標(biāo)志RI必須由用戶清0,以便下一次接收。通常情況下,串口以方式1工作時(shí),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(例如,雙機(jī)通信時(shí)的奇偶校驗(yàn)位或多機(jī)通信時(shí)的地址/數(shù)據(jù)的標(biāo)志位)。方式2發(fā)送數(shù)據(jù)波形如圖8.6所示。圖8.6方式2發(fā)送時(shí)序

2.方式2接收

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

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

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

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

方式3的波特率由下式確定:方式0和方式2的波特率是固定的;方式1和方式3的波特率可由定時(shí)器T1的溢出率來(lái)確定。

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

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

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

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

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

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

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

用上述公式計(jì)算T1的初值為

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

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

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

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

1.機(jī)械特性

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

2.電氣特性

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

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

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

MCS-51系列單片機(jī)串行口與PC機(jī)的RS-232C接口不能直接對(duì)接,必須進(jìn)行電平轉(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)有兩個(gè)發(fā)送器和兩個(gè)接收器,使用比較方便。圖8.9為MAX202、MAX232的引腳及典型工作電路圖,使用MAX202芯片,電容C1~C4選用0.1μF;使用MAX232芯片,電容C1~C4選用1μF。若電容小,則電壓升不起來(lái),通信時(shí)干擾大,容易錯(cuò)碼;若電容大,則降低了通信速率。C5是旁路電容,常用0.1μF。圖8.9MAX202/MAX232引腳及典型工作電路圖8.5.2RS-485接口

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

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

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

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

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

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

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

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

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

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

程序代碼如下:

ORG 0000H MOV SCON,#10H ;串口方式0,啟動(dòng)接收

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

SETB P3.2 ;允許串行移位

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

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

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

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

ACALLDELAYAJMPSTARTDELAY: MOVR7,#10 DJNZR7,$ RET ;延時(shí)

END

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

圖中串行口的數(shù)據(jù)通過(guò)RXD加到74LS164的輸入端,單片機(jī)的TXD引腳作為移位時(shí)鐘加到74LS164的CLK端。圖中的8位共陽(yáng)極七段LED顯示器,由于74LS164在低電平輸出時(shí),允許通過(guò)的電流可達(dá)20mA,因此不需要再加LED驅(qū)動(dòng)電路。程序?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 ;完,清中斷標(biāo)志

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

DJNZR7,DL0 RET ;返回

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

8.6.2單片機(jī)與單片機(jī)通信

為保證兩臺(tái)單片機(jī)通信的準(zhǔn)確,雙方要遵循一個(gè)簡(jiǎn)單協(xié)議。以下是一個(gè)簡(jiǎn)單的通信協(xié)議,協(xié)議的程序框圖如圖8.16所示。圖8.16兩臺(tái)單片機(jī)通信協(xié)議的程序框圖

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

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

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

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

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

MOV20H,#0AH ;要發(fā)送的6個(gè)數(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 ;啟動(dòng)T1 RET

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

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

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

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

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

ACALLTO_SBUF ACALLFROM_SBUF ;接收從機(jī)的回答

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

RET

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

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

JNBRI,$ CLRRI MOVA,SBUF

RET

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

;子程序名:LCD_DISPLAY

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

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

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開(kāi)始的單元

INCR1 MOVA,B MOVCA,@A+DPTR

MOV@R1,A

INCR1 INCR0 DJNZR5,LOOP MOV3CH,#00H ;顯示字符串最后一個(gè)為00H標(biāo)志

MOVR1,#30H MOVR5,#12 ;在LCD第2行第3列開(kāi)始顯示

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

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

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

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

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

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

MOVR7,#6

MOVR0,#20H MOVB,#00H

RECEIVE1:

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

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

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

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

RET

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

INIT_ES:

TO_SBUF:

FROM_SBUF:

LCD_DISPLAY:

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

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

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

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

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

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

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

(4)主機(jī)接收從機(jī)“應(yīng)答數(shù)據(jù)”,接收完成后,根據(jù)收到的地址、功能和最后的校驗(yàn)結(jié)果判斷從機(jī)數(shù)據(jù)接收是否正確。若校驗(yàn)正確,則完成相應(yīng)的功能;若錯(cuò)誤,可重新與從機(jī)進(jìn)行通信聯(lián)系。當(dāng)主機(jī)需要與其他從機(jī)進(jìn)行數(shù)據(jù)傳輸時(shí),可以發(fā)送指令數(shù)據(jù)通過(guò)地址幀呼叫從機(jī),重復(fù)這一過(guò)程。一個(gè)常用的單片機(jī)點(diǎn)對(duì)多點(diǎn)數(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個(gè)字節(jié);

02H—命令從機(jī)啟動(dòng)電機(jī)命令,N?=?3,為3號(hào)電機(jī)啟動(dòng);

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

圖8.20主機(jī)程序流程圖

主機(jī)程序及說(shuō)明(見(jiàn)注釋語(yǔ)句)如下:

ORG0000H

AJMPMAIN

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

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

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

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

MOVTH1,#0E8H

SETBTR1 ;啟動(dòng)T1定時(shí)

MAIN1:ACALLMASTER1 ;主機(jī)與#1從機(jī)通信

ACALLMASTER2 ;主機(jī)與#2從機(jī)通信

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

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

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

MOV23H,#03H;20H~22H的校驗(yàn)和

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

ACALLRECEIVE ;接收1#從機(jī)的回答

ACALLSUM ;求校驗(yàn)和

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

CJNEA,#01H,MASTER3

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

CJNEA,#01H,MASTER3

MOVA,23H ;如校驗(yàn)和不等,退出

CJNEA,B,MASTER3

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

RET

MASTER2: MOV20H,#02H ;按8.7.1節(jié)過(guò)程(2)向2#從機(jī)發(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#從機(jī)P1口的狀態(tài)送主機(jī)的P2口顯示

MASTER3: RET

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

;子程序名:RECEIVE

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

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

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

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

MOVR0,#20HRECEIVE1:ACALLFROM_SBUF

MOV@R0,A INCR0 DJNZR7,RECEIVE1

RET

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

;子程序名:SEND_DATA

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

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

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

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

MOVR7,#4SEND_DAT1: MOVA,@R0 ACALLTO_SBUF

INCR0 DJNZR7,SEND_DAT1 RET

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

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

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

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

INCR0 DJNZR7,SUM1 RET

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

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

MOVSBUF,A

JNBTI,$ CLRTI

RET

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

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

JNBRI,$

CLRRI

MOVA,SBUF

RET

END圖8.21從機(jī)程序流程圖從機(jī)采用串口中斷接收方式。程序清單及說(shuō)明(見(jiàn)注釋語(yǔ)句)如下:

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

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

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

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

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

MOVTH1,#0E8H SETBTR1 ;啟動(dòng)T1定時(shí)

SETBEA ;允許總中斷

SETBES ;允許串口中斷

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

AJMP$ ;從機(jī)等待串口中斷

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

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

CJNEA,#SLAVE_NUM,S_INT_END ;判斷是否是本從機(jī)地址號(hào),如不是退出中斷

MOV20H,#SLAVE_NUM;如是本從機(jī)地址號(hào),存入20H

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

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

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

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

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

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

;以下子程序與主機(jī)的程序清單相同

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

SUM:...;求20H~22H校驗(yàn)和子程序

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

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

END8.8單片機(jī)與PC的串口通信

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

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

(1)啟動(dòng)VB,建立“標(biāo)準(zhǔn)EXE”工程,如圖8.23所示。

圖8.23啟動(dòng)VB,建立“標(biāo)準(zhǔn)EXE”工程

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

(3)在彈出的“部件”對(duì)話框的“控件”標(biāo)簽中找到“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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論