單片機原理及接口技術(shù)-基于C51 Proteus仿真(第二版)課件 第10、11章 80C51單片機串口;80C51單片機系統(tǒng)的串行擴展技術(shù)_第1頁
單片機原理及接口技術(shù)-基于C51 Proteus仿真(第二版)課件 第10、11章 80C51單片機串口;80C51單片機系統(tǒng)的串行擴展技術(shù)_第2頁
單片機原理及接口技術(shù)-基于C51 Proteus仿真(第二版)課件 第10、11章 80C51單片機串口;80C51單片機系統(tǒng)的串行擴展技術(shù)_第3頁
單片機原理及接口技術(shù)-基于C51 Proteus仿真(第二版)課件 第10、11章 80C51單片機串口;80C51單片機系統(tǒng)的串行擴展技術(shù)_第4頁
單片機原理及接口技術(shù)-基于C51 Proteus仿真(第二版)課件 第10、11章 80C51單片機串口;80C51單片機系統(tǒng)的串行擴展技術(shù)_第5頁
已閱讀5頁,還剩289頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第10章80C51單片機串口設(shè)計

110.1串口通信基礎(chǔ)10.1.1串行通訊的基本方式10.1.2串行通訊的波特率10.1.3串行數(shù)據(jù)傳送方向10.1.4串行通信接口種類10.2單片機串口的結(jié)構(gòu)10.2.180C51串行口結(jié)構(gòu)10.2.2串行口相關(guān)的特殊功能寄存器10.3串口工作方式10.4串口波特率設(shè)計10.5多機通信10.6串口應(yīng)用設(shè)計10.6.1串口方式0的應(yīng)用設(shè)計10.6.2串口方式1的應(yīng)用設(shè)計10.6.3串口方式2和3的多機通信應(yīng)用設(shè)計10.6.4單片機與PC機異步串行通信設(shè)計10.6.5單片機與異步串口RS-232C的接口電路設(shè)計10.6.6單片機與異步串口RS-422A接口電路設(shè)計10.6.7單片機與異步串口RS-485接口電路設(shè)計第10章80C51單片機串口設(shè)計本章主要講述80C51單片機串行口的結(jié)構(gòu)、工作原理以及應(yīng)用。主要介紹串行通信基礎(chǔ)知識、單片機串口結(jié)構(gòu)、串口工作方式、串口波特率設(shè)計、多機通信以及串口應(yīng)用設(shè)計。10.1串口通信基礎(chǔ)數(shù)據(jù)通信的基本方式有并行通信和串行通信兩種。1.并行通信

單位信息(通常是一個字節(jié))的各位數(shù)據(jù)同時傳送的通信方式稱為并行通信。并行通信連線多,速度快,適合近距離通信。42.串行通信單位信息的各位數(shù)據(jù)被分時一位一位依次順序傳送的通信方式稱為串行通信。串行通信連線少,速度慢,適合遠距離通信。串行通信是將二進制數(shù)據(jù)按位傳送,它所需要的傳輸線少,適用于分布式控制系統(tǒng)以及遠程通信。10.1.1串行通訊的基本方式按照串行數(shù)據(jù)的同步方式,串行通信分為異步通信和同步通信兩類。異步通信是一種利用字符的再同步技術(shù)的通信方式,同步通信是按照軟件識別同步字符來實現(xiàn)數(shù)據(jù)的發(fā)送與接收。1.異步通信異步通信(Universalasychronousreceiver-transmitter)指接收器和發(fā)送器有各自的時鐘,非同步,傳送的數(shù)據(jù)是一個字符代碼或一個字節(jié)數(shù)據(jù),數(shù)據(jù)以幀的形式一幀一幀傳送。6以字符為傳送單位,從起始位0、數(shù)據(jù)位(由低到高,5~8位)、奇偶校驗位和停止位1逐位傳送,第9位D8可作奇偶校驗位,也可是地址/數(shù)據(jù)幀標志。字符位數(shù)間隔不固定,用空閑位1填充。異步通信的一幀數(shù)據(jù)格式如圖10-1所示。7

圖10-1異步通信的一幀數(shù)據(jù)格式2.同步通信

在同步通信中,每一數(shù)據(jù)塊開頭時發(fā)送一個或兩個同步字符,使發(fā)與收雙方取得同步,然后再順序發(fā)送數(shù)據(jù)。數(shù)據(jù)塊的各個字符間取消了起始位和停止位,通信速度得以提高。同步通信數(shù)據(jù)幀格式如圖10-2所示。8圖10-2同步通信數(shù)據(jù)幀格式同步字符可采用統(tǒng)一標準格式,在單同步字符幀結(jié)構(gòu)中,同步字符采用ACSII碼中規(guī)定的SYN(即16H)代碼;在雙同步字符幀結(jié)構(gòu)中,同步字符一般采用國際通用標準代碼EB90H,也可由收發(fā)雙方在傳送之前約定好。10.1.2串行通訊的波特率在串行通信中,對數(shù)據(jù)傳送速度有一定要求。波特率表示每秒傳送的位數(shù),單位是b/s、bps(bitpersecond)或波特(記作Baud)。1波特=1bit/s(1位/秒)例如,數(shù)據(jù)傳送速率為每秒鐘120個字符,若每個字符(一幀)為10位,則傳送波持率為:120字符/s×10bit/字符=1200b/s波特率是串行通信的重要指標,用于表征數(shù)據(jù)傳輸?shù)乃俣?。波特率越高,表明?shù)據(jù)傳輸速度越快,波特率和字符的實際傳輸

10速率不同。字符的實際傳輸速率是指每秒鐘內(nèi)所傳字符幀的幀數(shù),和字符幀格式有關(guān)。在實際應(yīng)用中,一定要注意串行通信系統(tǒng)中字符幀的格式。字符幀的每一位傳輸時間(Td)定義為波特率的倒數(shù),例如,波特率為1200bps的通信系統(tǒng),其每一位數(shù)據(jù)的傳輸時間Td=1/1200=0.833(ms)。波特率和信道的頻帶有關(guān),波特率越高,所需要的信道頻帶就越寬。因此,波特率也是衡量通信系統(tǒng)帶寬的重要指標。波特率不同于發(fā)送時鐘和接收時鐘,常常是時鐘頻率的1/16或1/64。11在串行通信發(fā)送和接收端波特率設(shè)置時,必須采用相同的波特率,才能保證串行通信的正確性。異步通信的傳送速率一般在50~115200b/s之間。國際上規(guī)定了標準波特率系列,這些標準波特率系列為110、300、600、1200、1800、2400、4800、9600、19200、38400、57600和115200bit/s等。1210.1.3串行數(shù)據(jù)傳送方向串口通信按照通信方向分,有單工方式、半雙工方式和全雙工方式。串行通信傳輸方式如圖10-3所示。1.單工方式單工方式僅有一對傳輸線,允許數(shù)據(jù)單方向傳送。2.半雙工方式半雙工方式有一對傳輸線,允許數(shù)據(jù)分時向兩個方向中的任一方向傳送數(shù)據(jù),但不能同時進行。3.全雙工方式全雙工方式用兩對傳輸線連接發(fā)送器和接收器,數(shù)據(jù)發(fā)送和接收能同時進行。

圖10-3串行通信傳輸方式10.1.4串行通信接口種類根據(jù)串行通信格式及約定(如同步方式、通信速率、數(shù)據(jù)塊格式等)不同,形成了許多串行通信接口標準,常見標準有:UART(通用異步串行通信接口)、USB(通用串行總線接口)、I2C(集成電路間的串行總線)、SPI(同步串行外設(shè)總線)、485總線、CAN總線接口等。1510.2單片機串口的結(jié)構(gòu)80C51單片機具有一個可編程的全雙工串口,可以同時發(fā)送、接收數(shù)據(jù),發(fā)送、接收數(shù)據(jù)可通過查詢或中斷方式處理,使用十分靈活。通過編程設(shè)定串行口相關(guān)的特殊功能寄存器,可作為同步移位寄存器或者作為UART,其數(shù)據(jù)幀有8位、10位或11位3種格式,可設(shè)置波特率,使用方便靈活。10.2.180C51串行口結(jié)構(gòu)80C51單片機通過串行數(shù)據(jù)接收端引腳RXD(P3.0)和串行數(shù)據(jù)發(fā)送端TXD(P3.1)與外界進行通信,其內(nèi)部結(jié)構(gòu)如圖10-4所示,80C51單片機串行口主要由發(fā)送數(shù)據(jù)緩沖器、發(fā)送控制器、16輸出控制門、接收數(shù)據(jù)緩沖器、接收控制器、輸入移位寄存器等組成。發(fā)送緩沖器SBUF和接收緩沖器SBUF共用一個特殊功能寄存器地址(99H)。發(fā)送時,通過寫入SBUF,數(shù)據(jù)以一定波特率從TXD(方式0時為RXD)引腳串行輸出,低位在先,高位在后,發(fā)送完一幀數(shù)據(jù)置“1”發(fā)送中斷標志位TI。接收時,接收器以一定波特率采樣RXD引腳的數(shù)據(jù)信息,當收到一幀數(shù)據(jù)時置“1”接收中斷標志位RI。17圖10-480C51單片機串行口內(nèi)部結(jié)構(gòu)(RXD\輸入移位寄存器)10.2.2串行口相關(guān)的特殊功能寄存器從用戶使用的角度,控制串行口的特殊功能寄存器有3個:接收和發(fā)送緩沖器SBUF(99H)、串行口控制寄存器SCON和電源控制寄存器PCON。1.發(fā)送緩沖器SBUF和接收緩沖器SBUF發(fā)送和接收SBUF共用一個特殊功能寄存器地址(99H),區(qū)別在于發(fā)送緩沖器只能寫不能讀,接收緩沖器只能讀不能寫。2.串行口控制/狀態(tài)寄存器SCON(98H)SCON用于設(shè)置串口的工作方式和標識串口的狀態(tài),其字節(jié)地址為98H,可位尋址。復位值:00000000B。寄存器中各位內(nèi)容如表10-1所示,說明如下。

19

20表10-1串行口控制寄存器SCON(1)SM0和SM1(SCON.7、SCON.6):串行口工作方式選擇位,用于選擇4種工作方式,串口方式選擇如表10-2所示。21表10-2串口工作方式選擇(2)SM2(SCON.5):多機通信控制位,在方式2或3中使用。(3)REN(SCON.4):允許接收控制位。設(shè)置1,允許接收;清0:禁止接收。(4)TB8(SCON.3):發(fā)送數(shù)據(jù)的第9位。(5)RB8(SCON.2):接收數(shù)據(jù)的第9位。(6)TI(SCON.1):發(fā)送中斷標志。(7)RI(SCON.0):接收中斷標志。串行發(fā)送中斷標志TI和接收中斷RI是同一個中斷源引起,由于CPU不知道是發(fā)送中斷標志TI還是接收中斷標志RI產(chǎn)生的中斷請求,所以,在全雙工通信時,必須由軟件來判別。223.電源控制寄存器PCONPCON特殊功能寄存器的字節(jié)地址為87H,沒有位尋址功能,其格式如表10-3所示,串行口工作于方式1、方式2和方式3時,PCON中的波特率選擇位SMOD(PCON.7)設(shè)置為1時,串行口波特率加倍。SMOD不能進行位尋址,其復位值為00000000B。23表10-3串行口電源控制寄存器PCON10.3串口工作方式單片機串口可通過設(shè)置SCON中的SM0、SM1確定串口的4種工作方式。1.方式0串行口的工作方式0為移位寄存器方式,通常外接移位寄存器,以擴展I/O口,也可外接同步輸入/輸出設(shè)備。方式0工作時,數(shù)據(jù)長度為8位,數(shù)據(jù)由RXD輸入和輸出,波特率固定為:fosc/12,同步時鐘固定通過TXD輸出。發(fā)送和接收數(shù)據(jù)時,由低位到高位。方式0發(fā)送和接收時序說明如下。24(1)方式0發(fā)送時序

在TI=0時,當CPU向SBUF寫數(shù)據(jù)時,就啟動發(fā)送過程。經(jīng)過一個機器周期(以fosc/12的固定波特率),寫入SBUF的數(shù)據(jù)由低位到高位,從RXD依次發(fā)送出去,同步時鐘從TXD送出。8位數(shù)據(jù)(一幀)發(fā)送完畢后,由硬件使發(fā)送中斷標志TI置位,向CPU申請中斷。(2)方式0接收時序在RI=0的條件下,將REN(SCON.4)置“1”,則啟動一次接收過程。串行數(shù)據(jù)通過RXD接收,同步移位脈沖通過TXD輸出。在移位脈沖控制下,RXD引腳上的串行數(shù)據(jù)依次移入移位寄存器。當8位25數(shù)據(jù)(一幀)全部移入移位寄存器后,接收控制器發(fā)“裝載SBUF”信號,將8位數(shù)據(jù)并行送入SBUF中,同時,由硬件使接收中斷標志RI置位,向CPU申請中斷。2.方式1方式1為8位UART,在方式1下,一幀信息為10位:1位起始位“0”、8位數(shù)據(jù)位(低位在前)和1位停止位“1”。TXD為發(fā)送數(shù)據(jù)端,RXD為接收數(shù)據(jù)端。波特率可設(shè)置,由定時/計數(shù)器T1的溢出率和電源控制寄存器PCON中的SMOD位決定。方式1發(fā)送和接收時序說明如下。(1)發(fā)送過程時序在TI=0時,當CPU向SBUF寫入數(shù)據(jù)時,就啟動了發(fā)送過程。數(shù)據(jù)由TXD引腳輸出,發(fā)送時鐘由T1溢出信號經(jīng)過16分頻或32分頻后得到。在發(fā)送時鐘的作用下,通過TXD端送出一個起始位“0”、8位數(shù)據(jù)(低位在前)和一個高電平停止位,當發(fā)送完一幀數(shù)據(jù),由硬件使發(fā)送中斷標志TI置位,向CPU申請中斷,完成一次發(fā)送過程。(2)接收過程時序當REN被置1,接收器就開始工作,由接收器以所設(shè)置的波特率16倍速率對RXD電平采樣。當采樣到從“1”到“0”的負跳變時,啟動接收控制器接收數(shù)據(jù)。在接收移位脈沖的控制下,所接收的數(shù)據(jù)移入移位寄存器,當8位數(shù)據(jù)及停止位全部移入后,根據(jù)以下狀態(tài),執(zhí)行操作。①當RI=0、SM2=0,接收控制器發(fā)出“裝載SBUF”信號,將輸入移位寄存器中的8位數(shù)據(jù)裝入SBUF,停止位裝入RB8,并置RI=1,向CPU申請中斷。②當RI=0、SM2=1,則停止位=“1”才發(fā)生上述操作。③當RI=0、SM2=1且停止位=“0”,接收數(shù)據(jù)不裝入SBUF,數(shù)據(jù)將會丟失。④當RI=1,則接收數(shù)據(jù)不裝入SBUF,即數(shù)據(jù)丟失。3.方式2和方式3方式2和方式3都為9位UART,接收和發(fā)送一幀數(shù)據(jù)長度為11位,即1個低電平、9位數(shù)據(jù)位和1個高電平的停止位。發(fā)送的第9位數(shù)據(jù)在發(fā)送前放于TB8中,接收到的第9位數(shù)據(jù)放于RB8中。TXD為發(fā)送數(shù)據(jù)端,RXD為接收數(shù)據(jù)端。方式2和方式3的區(qū)別在于波特率不同,其中,方式2的波特率有固定2種。方式3的波特率與方式1的波特率相同,由T1的溢出率和PCON中的SMOD位決定。在方式3時,也需要對定時/計數(shù)器T1進行初始化。方式2和方式3的發(fā)送和接收時序說明如下。(1)發(fā)送過程時序方式2和方式3發(fā)送的數(shù)據(jù)為9位,在啟動發(fā)送之前,必須把要發(fā)送的第9位數(shù)據(jù)裝入SCON中的TB8中。通過向SBUF寫入發(fā)送的字符數(shù)據(jù)來啟動發(fā)送過程,發(fā)送時,由低到高發(fā)送SBUF中8位數(shù)據(jù),第9位從TB8中取得。一幀信息發(fā)送完畢,置TI為1。(2)接收過程時序當REN置1時,啟動接收過程,采樣負跳變作為起始位,接收完一幀數(shù)據(jù),若RI=0,SM2=0或RB8=1,將接收數(shù)據(jù)裝入接收SBUF,第9位裝入RB8,使RI=1;否則丟棄接收數(shù)據(jù),不置位RI。10.4串口波特率設(shè)計80C51單片機方式0和方式2的波特率是固定的,方式1和方式3的波特率是由定時器T1的溢出率來決定的。52子系列單片機(如80C52、AT89C52等)中,可使用T2作波特率發(fā)生器。1.方式0的波特率方式0為同步移位寄存器方式,波特率固定為振蕩頻率fosc的1/12。方式0的波特率=fosc/12 (10-1)2.方式2的波特率方式2的波特率有2種,接收與發(fā)送的時鐘直接來自振蕩頻率fosc,并且還與PCON中SMOD位有關(guān)。當SMOD=0時,波特率為fosc的1/64;若SMOD=1,則波特率為fosc的1/32。方式2的波特率=2SMOD×fosc/64 (10-2)3.方式1和方式3的波特率串行口方式1和方式3為可變波特率,用T1作波特率發(fā)生器。(1)T1作波特率發(fā)生器方式1、3的波特率==2SMOD/32xT1溢出率=(2SMOD/32)x(fosc/12)÷(2n-初值) (10-3)其中,T1的溢出率是T1定時時間的倒數(shù),n是定時器T1的各種工作方式時的位數(shù)。在最典型應(yīng)用中,定時器T1選用定時方式2,此時n=8,設(shè)定時器的初值為X,則X=256-(10-4)若T1選定時方式1,需重裝時間常數(shù)。此時初值X為:X=216-fosc×2SMOD/384×B (10-5)例如,已知80C51單片機晶振頻率為11.0592MHz,設(shè)定時器T1工作方式2做波特率發(fā)生器,B=2400bit/s,求初值。設(shè)波特率控制位SMOD=0,由T1選方式2,TH1=X=28-fosc×2SMOD/384×BX=256-11.0592×106×(0+1)/384×2400=244=F4H則初始化部分程序為:TMOD=0x20;TH1=0xF4;TL1=0xF4;TR1=1;在實際應(yīng)用時,常根據(jù)已知波特率和時鐘頻率fosc計算T1的初值X。為避免繁雜初值計算,可參照常用波特率和T1初值X關(guān)系表,如表10-4所示。3536表10-4常用波特率和T1初值關(guān)系表10.5多機通信單片機多機系統(tǒng)中常采用總線型主從式多機系統(tǒng),即在數(shù)個單片機中,有一個是主機,其余的為從機,從機要服從主機的調(diào)度。80C51單片機工作在串口方式2、3時,具有主從式的多機通信功能。通信只在主、從機之間進行,從機與從機間不可以直接通信。在主從式多機系統(tǒng)中,主機發(fā)出的信息有2類:一類為地址,用來確定需要和主機通信的從機,信息特征是串行傳送的第9位數(shù)據(jù)TB8為1;另一類是數(shù)據(jù),特征是串行傳送的第9位數(shù)據(jù)TB8為0。37從機具有兩種狀態(tài),當SM2=1時,從機可接收主機發(fā)來的TB8為1的地址信息,以確定主機是否是與自己通信;一經(jīng)確認后,從機應(yīng)使SM2=0時,以便接收主機發(fā)出的TB8為0的數(shù)據(jù)。主從多機通信的過程如下:(1)首先使所有從機串口工作在方式2或方式3,且SM2=1,REN=1,處于只接收地址幀的狀態(tài)。(2)主機發(fā)送一幀地址信息,其中,前8位為地址,第9位RB8=1,該位置1表示該幀為地址信息。38(3)從機接收到地址幀后,各自將接收到的地址與本從機的地址比較。對于地址相符的從機(目標從機),則對自己的SM2清0,準備接收主機隨后發(fā)來的數(shù)據(jù)信息;對于地址不符的從機,仍保持SM2=1,對主機隨后發(fā)來的數(shù)據(jù)不予理睬,直至發(fā)送新的地址幀。(4)主機再發(fā)送數(shù)據(jù),并且TB8為0,這時目標從機正常接收數(shù)據(jù),其它從機均丟棄。3910.6串口應(yīng)用設(shè)計在單片機串口應(yīng)用中,方式0常用于擴展并行I/O口,方式1多用于實現(xiàn)點對點的雙機通信,方式2或方式3實現(xiàn)多機通信的應(yīng)用。串口應(yīng)用設(shè)計首先要確定工作方式和波特率。1.串行口控制寄存器SCON位的確定。根據(jù)工作方式確定SM0、SM1位;對于方式2和方式3還要確定SM2位;如果是接收端,則置允許接收位REN為1;如果方式2和方式3發(fā)送數(shù)據(jù),則應(yīng)將發(fā)送數(shù)據(jù)的第9位寫入TB8中。2.設(shè)置波特率對于方式0,不需要對波特率進行設(shè)置。對于方式2,設(shè)置波特率僅需對PCON中的SMOD位進行設(shè)置。對于方式1和方式3,設(shè)置波特率時,需對PCON中的SMOD位和T1設(shè)置,T1一般取方式2,8位可重置方式,初值計算如下。波特率=2SMOD×(T1的溢出率)/32T1的初值=2n-fosc×2SMOD/(12×波特率×32)10.6.1串口方式0的應(yīng)用設(shè)計80C51單片機串口工作在方式0時,常用于擴展并行I/O口,當外接串入并出的移位寄存器(如CD4094、74LS164、74HC595等芯片),可擴展并行輸出口;當外接并入串出的移位寄存器(如CD4014、74LS165等芯片)時,可擴展并行輸入口?!纠?0-1】用80C51單片機串口外接串入并出CD4094芯片,擴展并行輸出口控制8個發(fā)光二極管,使8個發(fā)光二極管從左至右延時輪流顯示,如圖10-5所示。CD4094是8位的串入并出芯片,具有一個STB控制端,當STB=0時,串行輸入門被打開,在CLK時鐘控制下,數(shù)據(jù)從DATA串行輸入口依次輸入;圖10-5單片機擴展CD4094控制發(fā)光二極管當STB=1,打開并行輸出門,并行輸出8位數(shù)據(jù)。圖10-5電路中,串口工作于方式0,TXD接CD4094的CLK,RXD接DATA,P2.0控制STB,8位并行輸出端接8個發(fā)光二極管。單片機輸出數(shù)據(jù)時,采用查詢方式,參考C程序如下:#include<reg51.h>//包含特殊功能寄存器庫sbitP2_0=P2^0;voidmain(){unsignedchari,a;SCON=0x00;a=0x01;while(1){P2_0=0;SBUF=a;44while(!TI){;}P2_0=1;TI=0;for(i=0;i<=254;i++){;}a=a*2;if(a==0x00)a=0x01;}}【例10-2】利用80C51單片機串口外接一片并行輸出串行移位寄存器74LS164,擴展的并行輸出8位數(shù)據(jù)通過數(shù)碼管顯示,實現(xiàn)循環(huán)顯示0-9這10個數(shù)字。單片機與74LS164接口電路如圖10-6所示,P3.0(RXD)接74LS164模塊的數(shù)據(jù)輸入引腳1、2,P3.1(TXD)接74LS164的時鐘引腳CLK。46圖10-6串口方式0外接串入并出轉(zhuǎn)換芯片74LS164參考程C序如下:164-1.c#include<reg51.h>#include<stdio.h>#defineucharunsignedcharucharleddat[10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};uchari;ucharj=0;main() //主程序{TMOD=0x01;TL0=0x00;TH0=0x4B;i=0x20;SCON=0x00;TI=0x00;RI=0x00;TR0=1;ET0=1;EA=1;while(1){;}}voidTIME_0()interrupt1using0{TL0=0x00;TH0=0x4B;i--;if(i<=0){i=20;TI=0;SBUF=leddat[j]; if(leddat[j]==0x09){j=0;}else{j++;}}}【例10-3】80C51單片機外接一片并入串出芯片CD4014,擴展并行輸入口,采集8個開關(guān)狀態(tài)信息到單片機內(nèi)存,電路如圖10-7所示。CD4014是8位并入串出的芯片,具有一個控制引腳P/S,當P/S=1時,8位并行數(shù)據(jù)置入片內(nèi)寄存器;當P/S=0時,在時鐘信號CLK作用下,片內(nèi)寄存器數(shù)據(jù)由低到高從QB引腳輸出,80C51單片機串口工作于方式0,TXD接CD4094的CLK,RXD接QB,P2.0接P/S,控制8位并行數(shù)據(jù)的置入和輸出;P2.1外接開關(guān)K,當開關(guān)K合上后,開始采集8個開關(guān)K0~K7狀態(tài)信息。圖10-780C51單片機擴展CD4014采集開關(guān)狀態(tài)參考C程序如下:#include<reg51.h>//包含特殊功能寄存器庫sbitP2_0=P1^0;sbitP2_1=P1^1;voidmain(){unsignedchara; P2_1=1;while(P2_1==1){;}P2_0=1;P2_0=0;SCON=0x10;while(!RI){;}RI=0;a=SBUF;}51【例10-4】圖10-8為80C51單片機串口工作于方式0輸入,外接8位并行輸入、串行輸出同步移位寄存器74LS165芯片,74LS165的8個并行輸入端接8個開關(guān),將開關(guān)的狀態(tài)通過串口方式0讀入單片機內(nèi)。74LS165的SH/端與單片機P1.0相接,SH/XXX是控制端,若SH/=0,則74LS165可并行輸入數(shù)據(jù),此刻串行輸出端關(guān)閉;當SH/=1,則并行輸入關(guān)斷,可以向單片機串行傳送。編程實現(xiàn)讀取8個開關(guān)狀態(tài),并由開關(guān)控制P2口連接的8個二極管,要求采用串口中斷方式。52圖10-8串口方式0外接并入串出轉(zhuǎn)換芯片74LS165參考C程序如下:165_1.c#include<reg51.h>#include"intrins.h"#include<stdio.h>sbitP1_0=0x90;unsignedcharm;voiddelay(unsignedinti) //延時{unsignedcharj;for(;i>0;i--) for(j=0;j<125;j++); }main(){ SCON=0x10; //串行口方式0,允許接收ES=1; //允許串行口中斷54EA=1; while(1){;}}voidSerial()interrupt4using0{if(RI==1){P1_0=0; //讀入開關(guān)的狀態(tài)delay(1);P1_0=1; //將開關(guān)的狀態(tài)送串口中RI=0;m=SBUF;P2=m;}}5510.6.2串口方式1的應(yīng)用設(shè)計下面通過雙機通信的案例介紹串口方式1的應(yīng)用編程?!纠?0-5】設(shè)單片機甲、單片機乙雙機通信,電路圖如圖10-9所示,雙機均以串行方式1傳輸數(shù)據(jù),晶振頻率均為11.0592MHz,波特率為1200波特,要求如下:單片機甲將存在片內(nèi)RAM中的0、1、2、…、9十個數(shù)字發(fā)送給單片機乙,單片機乙接收后,顯示在數(shù)碼管上。波特率的設(shè)計:設(shè)雙機SMOD為0,定時器T1用于波特率發(fā)生器,工作在方式2,TMOD=0x20;T1的初值=28-11059200×20/(12×1200×32)=0xE8串口設(shè)置在工作方式1,單片機甲發(fā)送,SCON=0x40。單片機乙接收,SCON=0x50。雙機均采用查詢方式收發(fā),禁止中斷。5657圖10-9雙機通信為觀察串口傳輸?shù)臄?shù)據(jù),電路中添加了虛擬終端來顯示串口發(fā)出的數(shù)據(jù)。添加虛擬終端,點擊ProteusISIS左側(cè)工具箱中的虛擬儀器圖標,選擇“VIRTUALTERMINAL”項,并放置在原理圖編輯窗口,然后把虛擬終端的“RXD”端與單片機甲的“TXD”端相連。對虛擬終端,需要設(shè)置其波特率,雙擊虛擬終端,打開“EditComponent”對話框,在“BaudRate”中設(shè)置為此例串口通信中需要的1200b/s。觀察仿真運行時單片機甲串行口發(fā)送出的數(shù)據(jù),可用鼠標右鍵點擊虛擬終端,點擊最下方“VirtualTerminal”項,會彈出窗口,在窗口中右擊,選擇HexDisplayMode顯示,窗口會顯示單片機甲串口“TXD”端發(fā)出的數(shù)據(jù)字節(jié),如圖10-10所示。5859圖10-10虛擬終端顯示的單片機甲串口發(fā)送的數(shù)據(jù)參考C程序如下。單片機甲發(fā)送程序:#include<reg51.h>#defineucharunsignedcharucharidatasendbuf[10]={0,1,2,3,4,5,6,7,8,9};uchari; voidmain(){TMOD=0x20;TL1=0xE8;TH1=0xE8;PCON=0x00;SCON=0x40;TR1=1;60for(i=0;i<10;i++){SBUF=sendbuf[i];while(TI==0);TI=0;}}單片機乙接收程序:#include<reg51.h>#defineucharunsignedcharconstucharLED_SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};uchari;voiddelay(unsignedinti)//延時61{unsignedintj,k;for(k=0;k<i;k++)for(j=0;j<125;j++);}voiddisplay(void){unsignedchari,*R_BUF;R_BUF=0x30;for(i=0;i<10;i++){P2=LED_SEG[*R_BUF];R_BUF++;delay(500);}} 62voidmain(){unsignedchar*R_DATA;R_DATA=0x30;TMOD=0x20;TL1=0xE8;TH1=0xE8;PCON=0x00;SCON=0x50;TR1=1;for(i=0;i<10;i++){while(RI==0);RI=0;*R_DATA=SBUF;R_DATA++;}63while(1){display();}}6410.6.3串口方式2和3的多機通信應(yīng)用設(shè)計串口方式2和方式3相比,除了波特率的設(shè)置不同,其他都相同,下面以方式3下多機通信為例,也適合于方式2。【例10-6】主從機多機通信,電路圖如圖10-11所示,主、從機均以串行方式3收發(fā)信息,晶振頻率均為11.0592MHz,波特率為9600波特,要求如下:主機向3號從機發(fā)送A、B、…和F共6個數(shù)字的共陽極數(shù)碼管段選碼,3號從機接收后顯示在數(shù)碼管上。主機程序編程思路如下:主機先發(fā)送3號從機的地址0x03,且TB8=1。等待3號從機的應(yīng)答信息。主機將接收到的地址應(yīng)答信息與3號地址0x03比較,若地址正確,設(shè)置TB8=0,循環(huán)發(fā)送6個數(shù)據(jù);若地址錯誤,則重復發(fā)送呼叫地址。3號從機編程思路:設(shè)地址狀態(tài)SM2=1,REN=1,等待主機發(fā)送地址呼叫信息。將接收的地址信息與自己的0x03地址比較,若有錯誤,等待主機再次呼叫,若地址正確,發(fā)應(yīng)答地址0x03。轉(zhuǎn)入接收數(shù)據(jù)狀態(tài)SM2=0,等待接收主機發(fā)送數(shù)據(jù),接收到數(shù)據(jù)后,若TB8=0,數(shù)據(jù)接收成功,保存數(shù)據(jù);繼續(xù)接收下一個數(shù)據(jù),直到接收完6個數(shù)據(jù)后顯示。若TB8=1,數(shù)據(jù)接收錯誤,轉(zhuǎn)為地址狀態(tài),等待主機重新呼叫。6667圖10-11主從機多機通信電路參考C程序如下。主單片機程序:#include<reg51.h>#defineucharunsignedcharucharidatasendbuf[6]={0x88,0x83,0xC6,0xA1,0x86,0x8E};uchari,renum; voidmain(){while(1){SCON=0xc8; //串口方式3,SM2=0,REN=0,TB8=1TMOD=0x20; TL1=0xfd;TH1=0xfd;//波特率9600PCON=0x00;TR1=1;68do {SBUF=0x03;//發(fā)送3號從機地址while(TI==0);//等待發(fā)送完成TI=0;REN=1;//轉(zhuǎn)接收while(RI==0);//等待接收應(yīng)答RI=0;renum=SBUF;//保存應(yīng)答}while(renum!=0x03);TB8=0;for(i=0;i<6;i++){SBUF=sendbuf[i];//主機向從機發(fā)送6個數(shù)組元素69while(TI==0);TI=0;}}}03號從單片機程序:#include<reg51.h>#defineucharunsignedcharucharidataRE_SEG[6];ucharrenum,i;voiddelay(unsignedinti)//延時{unsignedintj,k;for(k=0;k<i;k++)for(j=0;j<125;j++);}70voiddisplay(void){unsignedchari;for(i=0;i<6;i++){P2=RE_SEG[i];delay(800);}} voidmain(){while(1){SCON=0xf0; //串口方式3,SM2=1,REN=1TMOD=0x20; TL1=0xfd;71TH1=0xfd;//波特率9600PCON=0x00;TR1=1;do{while(RI==0);RI=0;renum=SBUF;}while(renum!=0x03);SM2=0;SBUF=0x03;while(TI==0);TI=0;for(i=0;i<6;i++){72while(RI==0);RI=0;if(TB8!=0)break;else{RE_SEG[i]=SBUF;}}while(1){display(); }

}}10.6.4單片機與PC機異步串行通信設(shè)計在許多應(yīng)用系統(tǒng)中,需要計算機與單片機聯(lián)合工作,計算機作為控制單片機的核心設(shè)備,即上位機,單片機通過傳感器從現(xiàn)場采集信息數(shù)據(jù)上傳至計算機,計算機分析處理后,將結(jié)果發(fā)回至單片機。隨著單片機價格下降,采用多單片機的應(yīng)用系統(tǒng)有更好的性價比,且多采用串行通信來實現(xiàn)系統(tǒng)的通信功能。在實際應(yīng)用中,可根據(jù)單片機和單片機通信距離和抗干擾性要求,采用TTL傳輸,或采用RS-232C、RS-422A、RS-485異步串行通信進行數(shù)據(jù)傳輸。741.TTL電平通信接口若單片機和單片機(或PC機)相距在1.5m之內(nèi),可將串行口直接相連,即甲機RXD引腳與乙機TXD引腳相連,乙機RXD引腳與甲機TXD引腳相連,以TTL電平直接實現(xiàn)雙機通信。2.異步串口通信標準80C51的4個I/O口包括串口都是TTL電平,采用TTL電平傳輸數(shù)據(jù),傳輸速率較低,抗干擾性差,并且傳輸距離短。在實際應(yīng)用中都采用標準串行接口,如RS-232C、RS-422A、RS-485,以提高信息傳輸速率和實現(xiàn)較遠距離傳輸?shù)取?5異步串行通信物理層接口標準主要有三個:EIA/TIA-232、EIA/TIA-422和EIA/TIA-485,這三個標準最初都是由美國電子工業(yè)協(xié)會(ElectronicIndustriesAlliance,EIA)制定的,1988年后,三個標準后續(xù)版本改由美國電信工業(yè)協(xié)會(TelecommunicationsIndustriesAssociation,TIA)制定。7610.6.5單片機與異步串口RS-232C的接口電路設(shè)計下面介紹異步串口RS-232C的應(yīng)用特性。(1)RS-232C標準特點RS-232C標準接口適合長度在1.5~30m的點對點(即只用一對收、發(fā)設(shè)備)連接,不適合更長線路或多點通信。傳輸速率限制在每秒19.2kbit/s以內(nèi)或更低。短電纜(大約2米)時,數(shù)據(jù)傳輸速率115.2kbit/s。RS-232C用非平衡(即單端)方式傳送和接收數(shù)據(jù)及控制信號,其數(shù)據(jù)和控制信號需要一根信號地(SignalGround)線以構(gòu)成回路,如圖10-12所示。77

78圖10-12RS-232C接口的非平衡(即單端)傳輸方式RS-232C是用正負電壓來表示邏輯狀態(tài),與TTL、CMOS等以高低電平表示邏輯狀態(tài)的規(guī)定不同。RS-232C標準對邏輯電平的定義:(2)數(shù)據(jù)信號電氣特性在TxD和RxD上,RS-232C采用負邏輯:邏輯1(MARK)=-3V~-15V邏輯0(SPACE)=+3~+15V(3)控制信號電氣特性在RTS、CTS、DSR、DTR和DCD等控制線上:信號有效(接通,ON,正電壓)=+3V~+25V信號無效(斷開,OFF,負電壓)=-3V~-25V(4)PC機DB-9串口(RS-232C接口)信號定義PC機串口通常使用9芯D型DB-9針型插座,外設(shè)使用DB-9孔型插座。DB-9針型插座(RS-232C接口)信號定義如表10-5所示。7980表10-5RS-232CDB-9針型插座信號定義(5)異步串口RS-232C接口電路設(shè)計由于單片機引腳的TTL電平與RS-232C標準電平互不兼容,所以單片機采用RS-232C標準串行通信時,需要進行TTL電平與RS-232C標準電平之間的變換。通常采用的MAX232/MAX232A是美國MAXIM公司生產(chǎn)的RS-232C全雙工的包含2路接收器和2路驅(qū)動發(fā)送器芯片,可實現(xiàn)TTL電平與RS-232C接口信號之間的轉(zhuǎn)換,該芯片僅需+5V電源供電,內(nèi)部有電源電壓變換器,可以把輸入的+5V電源電壓變換成為RS-232C輸出電平所需-10V~+10V電壓,滿足RS-232C邏輯電平要求。MAX232/MAX232A芯片引腳如圖10-13所示,MAX232電路結(jié)構(gòu)如圖10-14所示,其中,C1~C4均為1μF,C5為0.1μF。81

82圖10-13MAX232/MAX232A芯片引腳圖10-14MAX232結(jié)構(gòu)電路圖單片機與PC機間采用異步串口RS-232C接口通信的電路設(shè)計如圖10-15所示,PC機端RS-232C接口和單片機端RS-232C接口采用3線連接,第5引腳地線直接連接,PC機端3腳發(fā)送引腳和2腳接收引腳和單片機端收發(fā)引腳交叉連接。單片機串口輸出TXD接MAX232A的T1IN(T2IN),輸出TTL電平經(jīng)MAX232A芯片轉(zhuǎn)換為RS-232C電平;MAX232A的T1OUT連接單片機端RS-232C的D型接口的3腳,由于單片機端RS-232C的D型接口的3腳連接PC機端RS-232C的D型接頭接收2引腳,單片機發(fā)送信息被PC機接收。同理,PC機端發(fā)送RS-232C電平信息由PC機端RS-232C的D型接口發(fā)送端3腳經(jīng)過單片機端RS-232C的D型接口2腳,被MAX232A的R1IN(R2IN)接收后,83MAX232A將RS-232C電平轉(zhuǎn)換成TTL電平,由R1OUT(R2OUT)輸出至單片機接收引腳RXD。84圖10-15MAX232接口的串行通信電路10.6.6單片機與異步串口RS-422A接口電路設(shè)計下面介紹異步串口RS-422A的應(yīng)用特性。1.RS-422A標準特點RS-422A改進了RS-232C通信距離短、速度低等缺點,定義平衡電壓型數(shù)字接口電路電氣特性,RS-422A采用一對雙絞線和平衡線路驅(qū)動器以及接收器,以差分傳輸方式,將其中一線定義為A,另一線定義為B。2.RS-422A發(fā)送器電平及接口RS-422A接口及發(fā)送器電平如圖10-16所示,發(fā)送驅(qū)動器A、B之間的正電平在+2~+6V,是邏輯“1”狀態(tài),A、B間負電平在-2~-6V,是“0”邏輯狀態(tài)。還有一個信號地C,還設(shè)置一“使能”端控制發(fā)送驅(qū)動器與傳輸線切斷與連接,“使能”端起作用時,發(fā)送驅(qū)動器處于高阻狀態(tài),即“第三態(tài)”,用于多點通信。86圖10-16RS-422A接口及發(fā)送器電平3.RS-422A接收器電平RS-422A接收器電平如圖10-17所示,接收端AB間大于+200mV電平,輸出正邏輯電平,小于-200mV,輸出負邏輯電平。接收器接收平衡線上電平范圍在200mV至6V之間。差分接收器可分辨0.2V以上電位差,可減弱地線干擾和電磁干擾影響,抑制共模干擾,將傳輸速率提高到10Mbit/s,在此速率時,電纜長度為12m。其平衡雙絞線的長度與傳輸速率成反比,在100Kbit/s速率下,傳輸距離可達1200米。與RS-232C接口一樣,必須在TTL、CMOS等數(shù)字邏輯信號與RS-422A接口信號之間進行電平變換。8788圖10-17RS-422A接收器電平4.RS-422A全雙工雙向通信連接示意圖RS-422A全雙工雙向通信連接如圖10-18所示,收/發(fā)器各使用兩對差分信號線,加上地線,共5根線。RS-422A的DB-9連接器引腳定義如圖10-19所示。由于RS-422A接收器輸入阻抗高,發(fā)送驅(qū)動器比RS-232C驅(qū)動能力強,理論上RS-422A在相同傳輸線上連接最多10個接收節(jié)點。89圖10-18RS-422A全雙工雙向通信連接示意圖圖10-19RS-422A的DB-9連接器引腳定義5.RS-422A一對多的多點雙向通信RS-422A可以支持一對多的多點雙向通信,如圖10-20所示,一個主設(shè)備(Master),其余從設(shè)備(Salve),從設(shè)備間不通信。RS-422A推薦使用特性阻抗為100歐的雙絞電纜,每個回路接收端用100歐的終端電阻。91圖10-20RS-422A一點對多點雙向通信系統(tǒng)10.6.7單片機與異步串口RS-485接口電路設(shè)計下面介紹異步串口RS-485的特性及應(yīng)用編程。1.RS-485接口標準特點RS-485接口標準在RS-422A的基礎(chǔ)上,增加多點、雙向通信能力,RS-485接口標準定義平衡數(shù)字多點系統(tǒng)中發(fā)送器和接收器電氣特性,電氣規(guī)定與RS-422A相仿,例如:發(fā)送驅(qū)動器A、B間正電平時,電壓為+1.5~+6V,A、B間負電平時,電壓為-1.5~-6V,采用平衡傳輸方式、都需要在傳輸線上接終端電阻等。最大傳輸速率10Mbit/s。雙絞線長度與傳輸速率成反比,當波特率為1200bit/s時,最大傳輸距離達15千米。922.RS-485接口二線連接實現(xiàn)真正多點雙向通信RS-485采用二線與四線連接方式。RS-485接口二線連接時可實現(xiàn)真正的多點雙向通信(即總線上所有設(shè)備與上位機任意兩臺之間均能通信),如圖10-21所示,線路驅(qū)動器不發(fā)送時,需要切換到高阻抗狀態(tài)(“三態(tài)”)。只要接口通信協(xié)議與硬件配合保證在一個時刻只有一個接口嘗試在每個回路傳送即可。RS-485接口若四線連接,可實現(xiàn)點對多通信:有一個主設(shè)備(Master),其余從設(shè)備。RS-485接口無論四線還是二線總線連接,可最多連接32個設(shè)備,使用120歐電纜和終端電阻。93圖10-21典型二線連接RS-485多點通信系統(tǒng)943.單片機TTL電平與RS-485電平轉(zhuǎn)換器MAX485MAX485、MAX487-MAX491以及MAX1487是用于RS-485與RS-422A通信的低功耗收發(fā)器,其中,經(jīng)常用來完成將TTL電平轉(zhuǎn)換為RS-485電平的功能的MAX485芯片,采用單一電源+5V工作,額定電流為300μA,其驅(qū)動器擺率不受限制,可以實現(xiàn)最高2.5Mbps的傳輸速率,采用半雙工通訊方式。MAX485芯片內(nèi)部含有一個驅(qū)動器和接收器,具有8個引腳,其引腳功能如表10-6所示。RO和DI端分別為接收器輸出和驅(qū)動器的輸入端,與單片機串口RXD和TXD相連;和DE端分別為接收和發(fā)送的使能端,當為邏輯0時,器件處于接收狀態(tài);當DE為邏輯1時,器件處于發(fā)送狀態(tài),因為95MAX485工作在半雙工狀態(tài),只需用單片機的一個I/O口同時控制此兩個引腳;A端和B端分別為接收和發(fā)送的差分信號端,當A引腳的電平高于B時,代表發(fā)送的數(shù)據(jù)為1;當A的電平低于B端時,代表發(fā)送的數(shù)據(jù)為0。MAX485具有三態(tài)輸出特性,使用MAX485時,總線最多可以同時連接32個MAX485芯片,將A和B端之間加匹配電阻,一般可選100Ω的電阻。9697表10-6MAX485引腳功能【例10-7】設(shè)計上位機PC機通過RS-485串行總線與下位機單片機通信,實現(xiàn)采集和驅(qū)動,能夠?qū)?8個開關(guān)外設(shè)信號采集,并可驅(qū)動48個指示燈亮滅。采集電路如圖10-22所示,驅(qū)動電路如圖10-23所示,設(shè)計思路如下。(1)先將上位機PC機RS-232C串行接口連接RS-232C轉(zhuǎn)RS-485轉(zhuǎn)換器;(2)單片機TTL電平與RS-485接口電路設(shè)計:PC機信號由RS-485總線電平傳輸一定距離后,與下位機單片機通信時,選用MAX485芯片完成RS-485電平與單片機TTL電平轉(zhuǎn)換功能。單片機TTL電平與RS-485接口電路如圖10-24所示,單片機串口98RXD(P3.0)、TXD(P3.1)引腳分別連接MAX485芯片的RO和DI引腳,RS-485的A、B端接MAX485芯片的A、B引腳。將MAX485的和DE相連接,單片機只需要一個I/O引腳(COM)信號控制MAX485的接收和發(fā)送。99100圖10-22單片機采集8個并入串出外設(shè)信號后送RS-485接口電路

101

圖10-23數(shù)據(jù)經(jīng)RS-485接口電路送單片機驅(qū)動6個串入并出設(shè)備102圖10-24單片機TTL電平與RS-485接口電路(3)上位機PC機與下位機單片機采集協(xié)議設(shè)計:采集幀格式設(shè)計如表10-7所示,表中內(nèi)容共14個字節(jié),由2個字節(jié)幀頭(0x000x5A)、1個字節(jié)采集幀類型說明(0x57)、1個字節(jié)地址碼(0x00~0xFF),一個字節(jié)控制碼(0x07)、8個字節(jié)數(shù)據(jù)、1個字節(jié)校驗和等組成。其中,由于通信采用RS-485總線方式,可最大允許從站數(shù)量為32,從站地址碼可通過撥碼開關(guān)在0x00~0xFF之間選擇。具體采集幀格式說明如下。最小幀間隔10ms。串口配置:數(shù)據(jù)位:8;停止位:1;校驗:無;波特率:19200。103104表10-7定時器工作方式控制位①幀頭:0x000x5A②幀類型:0x57③地址碼:0x00~0xFF④控制碼:0x07⑤數(shù)據(jù):數(shù)據(jù)信息共占用八個字節(jié),第7、8字節(jié)空閑,用0000表示;由于要求對48個開關(guān)外設(shè)信號采集,48個開關(guān)分為6組,每組對應(yīng)8個開關(guān)。每組開關(guān)對應(yīng)6個數(shù)據(jù)字節(jié)的1個字節(jié),每一字節(jié)8位對應(yīng)8個開關(guān)狀態(tài)。采集命令中,6個數(shù)據(jù)字節(jié)均為0xFF。⑥校驗和字節(jié)計算公式為:校驗和=(幀頭+幀類型+地址碼+控制碼+數(shù)據(jù)位)MOD256例如:主機采集00號從機(單片機板)發(fā)出的協(xié)議為:005A570007FFFFFFFFFFFF0000B2單片機發(fā)出采集命令后,獲得采集目標板響應(yīng)信息,其幀格式與采集協(xié)議一致,只是6個數(shù)據(jù)字節(jié)中,對應(yīng)位置1表示開關(guān)狀態(tài)沒有變化,對應(yīng)位清零表示開關(guān)狀態(tài)的有效輸入。105(4)驅(qū)動通信協(xié)議設(shè)計驅(qū)動幀格式內(nèi)容共有14個字節(jié),由2個字節(jié)幀頭(0x00)、1個字節(jié)驅(qū)動幀類型說明(0x58)、1個字節(jié)地址碼(0x00~0xFF),一個字節(jié)控制碼(0x0F)、8個字節(jié)數(shù)據(jù)、1個字節(jié)校驗和等組成。具體驅(qū)動幀格式說明如下:①幀頭:005A②幀類型:58③地址碼:00~FF④控制碼:04關(guān)閉所有輸出。03開啟所有輸出。0F輸出狀態(tài)由數(shù)據(jù)位決定106⑤數(shù)據(jù)位:數(shù)據(jù)位共占用八個字節(jié),第7、8字節(jié)空閑,用0000表示;要求可驅(qū)動48個指示燈亮滅,故將驅(qū)動的48個燈每8個為一組,共6組,用A\B\C\D\E\F6組表示。當要某個燈開啟時,對應(yīng)的位清零。數(shù)據(jù)字節(jié)1到6字節(jié)分別對應(yīng)6組輸出口。而每一個數(shù)據(jù)字節(jié)的每個位對應(yīng)0~7。位置1表示關(guān)閉輸出,位清零表示開啟輸出。⑥校驗和字節(jié)的計算公式為:校驗和=(幀頭+幀類型+地址碼+控制碼+數(shù)據(jù)位)MOD256107例如:全關(guān)端口(設(shè)地址碼為0xFF):005A58FF04FFFFFFFFFFFF0000AF全開端口(設(shè)地址碼為0xFF):005A58FF03FFFFFFFFFFFF0000AE打開B1端口(設(shè)地址碼為0xFF):005A58FF0FFFFDFFFFFFFF0000B8108(5)單片機采集電路設(shè)計:單片機采集電路使用6片八位并行輸入/串行輸出移位寄存器74LS165,每片74LS165芯片的8個輸入并口引腳D0~D7連接8個開關(guān)(由于圖幅所限,開關(guān)未畫出),用來采集開關(guān)信息。連接8個開關(guān)。上電后,首先設(shè)置SH/LD端為低電平,此時將D0~D7腳上的高低電平數(shù)據(jù)存入芯片內(nèi)寄存器Q0~Q7,然后設(shè)置SH/LD端為高電平,此時芯片將寄存器內(nèi)數(shù)據(jù)通過SO串行發(fā)送。采用單片機的P0口連接8位地址線,可通過跳線帽選擇8位地址的高低電平。109(6)單片機驅(qū)動電路設(shè)計單片機驅(qū)動電路使用6片八位串行輸入并行輸出74LS595,每片74LS595芯片的Q1~Q7是并行數(shù)據(jù)輸出口端,連接8個指示燈(由于圖幅所限,開關(guān)未畫出),用來控制指示燈的亮滅。同樣,采用單片機的P0口連接8位地址線,可通過跳線帽選擇8位地址的高低電平。(7)PC機和單片機串口通信設(shè)置:最小幀間隔10ms,串口配置為:數(shù)據(jù)位8位,停止位1位,校驗位無;波特率:19200。110485采集參考程序如下:#include<reg52.h>#include<intrins.h>//包含_nop_();#defineucharunsignedchar#defineuintunsignedintuchara,b,c,d,e,f,check,sampling[6];uintWORK,sum,setsum,checksum,fsetsum;unsignedcharbasic1,basic2,basic3,basic4,basic5,basic6;sbitCOM=P2^4;sbitred=P1^5;sbityellow=P1^6;sbitgreen=P1^7;sbitQHA=P1^0;//74LS165A并入串出引腳sbitCLKA=P1^1;//時鐘引腳sbitLOADA=P1^2;//移位控制引腳sbitQHB=P3^2;//74LS165B并入串出引腳sbitCLKB=P1^3;//時鐘引腳sbitLOADB=P1^4;//移位控制引腳111sbitQHC=P3^3;//74LS165C并入串出引腳sbitCLKC=P3^4;//時鐘引腳sbitLOADC=P3^5;//移位控制引腳sbitQHD=P3^6;//74LS165D并入串出引腳sbitCLKD=P3^7;//時鐘引腳sbitLOADD=P2^0;//移位控制引腳sbitQHE=P2^1;//74LS165E并入串出引腳sbitCLKE=P2^2;//時鐘引腳sbitLOADE=P2^3;//移位控制引腳sbitQHF=P2^5;//74LS165F并入串出引腳sbitCLKF=P2^6;//時鐘引腳sbitLOADF=P2^7;//移位控制引腳voidinit_uart()//串口方式1,允許接收,允許中斷,TI作波特率發(fā)生器,波特率:19200{SCON=0x50; TMOD|=0x20;TH1=0xfd; TL1=0xfd; TI=0; RI=0;

112TR1=1;EA=1;ES=1;}voidInit_Timer0(void)//定時器T0定時,方式1,允許定時器中斷,定時時間65.536ms{TMOD|=0x01; TH0=0x00; TL0=0x00;EA=1;ET0=1;TR0=1;}unsignedintread_165A()//采集74LS165A一字節(jié)并入串出數(shù)據(jù){unsignedcharbasic;unsignedintcc;LOADA=1;

113_nop_();_nop_();LOADA=0;_nop_();_nop_();LOADA=1;CLKA=1;basic=0;basic=basic<<1;if(QHA) basic|=0x01;for(cc=0;cc<7;cc++){ CLKA=0; _nop_(); CLKA=1; basic=basic<<1; if(QHA) basic|=0x01;}

basic1=basic; returnbasic1;}unsignedintread_165B()//采集74LS165B一字節(jié)并入串出數(shù)據(jù){unsignedcharbasic;unsignedintcc;LOADB=1;_nop_();_nop_();LOADB=0;_nop_();_nop_();LOADB=1;CLKB=1;basic=0;basic=basic<<1;if(QHB) basic|=0x01;

115for(cc=0;cc<7;cc++){ CLKB=0; _nop_(); CLKB=1; basic=basic<<1; if(QHB) basic|=0x01;} basic2=basic; returnbasic2;}unsignedintread_165C()//采集74LS165C一字節(jié)并入串出數(shù)據(jù){unsignedcharbasic;unsignedintcc;LOADC=1;_nop_();_nop_();

116LOADC=0;_nop_();_nop_();LOADC=1;CLKC=1;basic=0;basic=basic<<1;if(QHC) basic|=0x01;for(cc=0;cc<7;cc++){ CLKC=0; _nop_(); CLKC=1; basic=basic<<1; if(QHC) basic|=0x01;} basic3=basic; returnbasic3;}117unsignedintread_165D()//采集74LS165D一字節(jié)并入串出數(shù)據(jù){unsignedcharbasic;unsignedintcc;LOADD=1;_nop_();_nop_();LOADD=0;_nop_();_nop_();LOADD=1;CLKD=1;basic=0;basic=basic<<1;if(QHD) basic|=0x01;for(cc=0;cc<7;cc++){ CLKD=0; _nop_();

118CLKD=1; basic=basic<<1; if(QHD) basic|=0x01;} basic4=basic; returnbasic4;}unsignedintread_165E()//采集74LS165E一字節(jié)并入串出數(shù)據(jù){unsignedcharbasic;unsignedintcc;LOADE=1;_nop_();_nop_();LOADE=0;_nop_();_nop_();LOADE=1;CLKE=1;

119basic=0;basic=basic<<1;if(QHE) basic|=0x01;for(cc=0;cc<7;cc++){ CLKE=0; _nop_(); CLKE=1; basic=basic<<1; if(QHE) basic|=0x01;} basic5=basic; returnbasic5;}unsignedintread_165F()//采集74LS165F一字節(jié)并入串出數(shù)據(jù){unsignedcharbasic;

120unsignedintcc;LOADF=1;_nop_();_nop_();LOADF=0;_nop_();_nop_();LOADF=1;CLKF=1;basic=0;basic=basic<<1;if(QHF) basic|=0x01;for(cc=0;cc<7;cc++){ CLKF=0; _nop_(); CLKF=1; basic=basic<<1; if(QHF)

121basic|=0x01;} basic6=basic; returnbasic6;}voiddelay(intms)//延時1ms{ intk; while(ms--) { for(k=0;k<250;k++) { _nop_(); _nop_(); } }}voidsampl(void) //采集6路74LS165并入串出數(shù)據(jù){

122sampling[0]=read_165A();//采集74LS165A并入串出數(shù)據(jù) sampling[1]=read_165B();//采集74LS165B并入串出數(shù)據(jù) sampling[2]=read_165C();//采集74LS165C并入串出數(shù)據(jù) sampling[3]=read_165D();//采集74LS165D并入串出數(shù)據(jù) sampling[4]=read_165E();//采集74LS165E并入串出數(shù)據(jù) sampling[5]=read_165F();//采集74LS165F并入串出數(shù)據(jù)}voidsend(void) //通過MAX485發(fā)送一幀數(shù)據(jù)(0x000x5A0x57地址碼0x078字節(jié)數(shù)據(jù)校驗和){ ucharaa; COM=1; SBUF=0x00; delay(1); SBUF=0x5A; checksum=checksum+0x5A; delay(1); SBUF=0x57; checksum=checksum+0x57; delay(1);

123SBUF=a; checksum=checksum+a; delay(1); SBUF=0x07; checksum=checksum+0x07; delay(1); for(aa=0;aa<6;aa++) { SBUF=sampling[aa]; checksum=checksum+sampling[aa]; delay(1); } SBUF=0x00; delay(1); SBUF=0x00; delay(1); fsetsum=checksum%256; SBUF=fsetsum; fsetsum=0;

124checksum=0; delay(3); COM=0;}voidmain(){ a=0; b=0; c=0; d=0; e=0; f=0; COM=0; Init_Timer0(); init_uart() ; while(1) { a=P0; //采集地址 if(check==1) {

125checksum=0; delay(3); COM=0;}voidmain(){ a=0; b=0; c=0; d=0; e=0; f=0; COM=0; Init_Timer0(); init_uart() ; while(1) { a=P0; //采集地址 if(check==1) {

126sampl();//采集8路并入串出數(shù)據(jù) delay(3); send();//發(fā)送一幀信息 check=0; } }}voidTimer0_isr(void)interrupt1using1{TH0=0x00; TL0=0x00;WORK++;if(WORK>10){WORK=0;red=!red;}//每到定時655.36ms紅燈亮滅交替}voidUART_SER(void)interrupt4//串口接收處理{ if(RI==1) { RI=0; yellow=!yellow;//接收到MAX485串口數(shù)據(jù),亮黃燈

127switch(b) { case0: if(SBUF==0x00)//接收到幀頭第一個字節(jié)0x00 { b++; sum=sum+SBUF; } else { b=0; sum=0; } break; case1: if(SBUF==0x5A)//接收到幀頭第二個字節(jié)0x5A { b++; sum=sum+SBUF; }

128else { b=0; sum=0; } break; case2: if(SBUF==0x57)//接收到幀類型0x57 { b++; sum=sum+SBUF; } else { b=0; sum=0; } break; case3:

129if(SBUF==a)//接收到采集芯片的地址 { b++; sum=sum+SBUF; } else { b=0; sum=0; }break; case4: if(SBUF==0x07)//接收到控制碼0x07 { b++; sum=sum+SBUF; } else { b=0;

130sum=0; }break;case5:sampling[c]=SBUF;//接收采集數(shù)據(jù)信息 sum=sum+sampling[c]; c++;

if(c>=9) { sum=sum-sampling[c-1]; setsum=sum%256;//計算校驗和 for(e=0;e<6;e++) { if(sampling[e]==0xff) f++; } if(f==6) { f=0;

131check=1;//校驗成功 c--; if(sampling[c]!=setsum) { check=0;//校驗不成功 } } b=0; f=0; c=0; sum=0; setsum=0; } break; } } else { TI=0; }}132驅(qū)動程序如下:#include<reg52.h>#include<intrins.h>//包含_nop_();#defineucharunsignedchar#defineuintunsignedintuchara,b,c,d,e,f,g,flag,flag_close,flag_open,close,open,receive[9];uintsum,setsum,workn;sbitCOM=P3^2;sbityellow=P1^6;sbitwork=P1^5;sbitSIA_595=P1^0;//74HC595A串行輸入數(shù)據(jù)線sbitRCKA_595=P1^1;//74HC595A輸出存儲器鎖存時鐘線sbitSCLKA_595=P1^2;//74HC595A數(shù)據(jù)輸入時鐘線sbitSIB_595=P2^4;//74HC595B串行輸入數(shù)據(jù)線sbitRCKB_595=P1^3;//74HC595B輸出存儲器鎖存時鐘線sbitSCLKB_595=P1^4;//74HC595B數(shù)據(jù)輸入時鐘線sbitSIC_595=P2^5;//74HC595C串行輸入數(shù)據(jù)線sbitRCKC_595=P2^6;//74HC595C輸出存儲器鎖存時鐘線133sbitSCLKC_595=P2^7;//74HC595C數(shù)據(jù)輸入時鐘線sbitSID_595=P3^6;//74HC595D串行輸入數(shù)據(jù)線sbitRCKD_595=P3^7;//74HC595D輸出存儲器鎖存時鐘線sbitSCLKD_595=P2^0;//74HC595D數(shù)據(jù)輸入時鐘線sbitSIE_595=P2^1;//74HC595E串行輸入數(shù)據(jù)線sbitRCKE_595=P2^2;//74HC595E輸出存儲器鎖存時鐘線

溫馨提示

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

最新文檔

評論

0/150

提交評論