傳感器溫度控制器_第1頁(yè)
傳感器溫度控制器_第2頁(yè)
傳感器溫度控制器_第3頁(yè)
傳感器溫度控制器_第4頁(yè)
傳感器溫度控制器_第5頁(yè)
已閱讀5頁(yè),還剩24頁(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)介

1、溫度監(jiān)控系統(tǒng) 設(shè)計(jì)者: 1 設(shè)計(jì)背景 1.1 設(shè)計(jì)目的及意義 隨著現(xiàn)代計(jì)算機(jī)和自動(dòng)化技術(shù)的發(fā)展,作為各種信息的感知、采集、轉(zhuǎn)換、傳輸相處理的功能器件,溫度傳感器的作用日益突出,成為自動(dòng)檢測(cè)、自動(dòng)控制系統(tǒng)和計(jì)量測(cè)試中不可缺少的重要技術(shù)工具,其應(yīng)用已遍及工農(nóng)業(yè)生產(chǎn)和日常生活的各個(gè)領(lǐng)域。本設(shè)計(jì)就是為了滿足人們?cè)谏钌a(chǎn)中對(duì)溫度測(cè)量系統(tǒng)方面的需求。    (1)在學(xué)習(xí)了課程后,為了加深對(duì)理論知識(shí)的理解,學(xué)習(xí)理論知識(shí)在實(shí)際中的運(yùn)用,培養(yǎng)動(dòng)手能力和解決實(shí)際問(wèn)題的經(jīng)驗(yàn)。    (2)通過(guò)實(shí)

2、驗(yàn)提高對(duì)單片機(jī)的認(rèn)識(shí),提高軟件調(diào)試能力。    (3)進(jìn)一步熟悉和掌握單片機(jī)的結(jié)構(gòu)及工作原理,通過(guò)課程設(shè)計(jì),掌握以單片機(jī)核心的電路設(shè)計(jì)的基本方法和技術(shù)。    (4)通過(guò)實(shí)際程序設(shè)計(jì)和調(diào)試,逐步掌握模塊化程序設(shè)計(jì)方法和調(diào)試技術(shù)。    (5)熟悉溫度控制的工作原理,選擇合適的元件,繪制系統(tǒng)電路原理圖,運(yùn)用單片機(jī)原理及其應(yīng)用,進(jìn)行軟硬件系統(tǒng)的設(shè)計(jì)和調(diào)試,加深對(duì)單片機(jī)的了解和運(yùn)用,進(jìn)而提高自己的應(yīng)用知識(shí)能力、設(shè)計(jì)能力和調(diào)試能力。 1.2 總體設(shè)計(jì)思路 

3、;本設(shè)計(jì)以單片機(jī)為基礎(chǔ),溫度監(jiān)控系統(tǒng)大致上可以分為以下幾個(gè)步驟: 1.2.1系統(tǒng)分析過(guò)程 (1)根據(jù)系統(tǒng)的目標(biāo),明確所采用溫度監(jiān)控系統(tǒng)的目的和任務(wù)。 (2)確定系統(tǒng)所在的工作環(huán)境。 (3)根據(jù)系統(tǒng)的工作要求,確定系統(tǒng)的基本功能和方案。  1.2.2 系統(tǒng)設(shè)計(jì)內(nèi)容        (1)構(gòu)思設(shè)計(jì)溫度監(jiān)控系統(tǒng)的工作流程。 (2)對(duì)要求設(shè)計(jì)的系統(tǒng)進(jìn)行功能需求分析,考慮多種設(shè)計(jì)方案,比較各方案的特點(diǎn),并確定合理可行的方案,并設(shè)計(jì)相應(yīng)的功能結(jié)構(gòu)。&

4、#160;(3)根據(jù)系統(tǒng)的控制要求,選擇合適型號(hào)的芯片及元器件。  (4) 設(shè)計(jì)以單片機(jī)為核心的控制程序。      (5) 電路板及其結(jié)構(gòu)的設(shè)計(jì)。      (6) 進(jìn)行系統(tǒng)的調(diào)試,完成最終的設(shè)2 總體設(shè)計(jì)方案設(shè)計(jì) 2.1 系統(tǒng)框圖  本設(shè)計(jì)為無(wú)線電控制電路,系統(tǒng)框圖如下所示:        &#

5、160;                        圖1-1 系統(tǒng)框圖 2.2 系統(tǒng)功能 此設(shè)計(jì)以單片機(jī)為核心的溫度監(jiān)控系統(tǒng),其功能是:平常狀態(tài)下可以做溫度計(jì)使用。當(dāng)溫度超過(guò)預(yù)設(shè)溫度時(shí)二極管會(huì)閃爍報(bào)警,當(dāng)溫度降下時(shí)二極管則停止閃爍。 電路設(shè)計(jì)及功能如下所述: 本設(shè)計(jì)大體可分為三個(gè)部分,即溫度采集

6、,數(shù)碼顯示,報(bào)警電路。溫度采集部分利用DS18B20進(jìn)行溫度采集,感知溫度,后數(shù)碼顯示出溫度,若溫度超過(guò)了預(yù)設(shè)溫度報(bào)警電路則啟亮發(fā)光二極管,閃爍。整體電路復(fù)位電路 晶振電路 報(bào)警電路    單片機(jī)AT89C51 溫度傳感器 顯示電路3 系統(tǒng)的軟件結(jié)構(gòu)設(shè)計(jì) 3.1 設(shè)計(jì)的流程圖  3.2 系統(tǒng)部分程序設(shè)計(jì)及分析 3.2.1 復(fù)位子程序     (1)主機(jī)將信號(hào)線置為低電平,時(shí)間為480-9

7、60uS。     (2)主機(jī)將信號(hào)線置為高電平,時(shí)間為15-60uS。 (3)DS18B20發(fā)出60-240uS的低電平作為應(yīng)答信號(hào),主機(jī)收到此信號(hào)才操作3.2.2 讀子程序 (1)主機(jī)將信號(hào)線從高電平拉至低電平1uS以上,再升為高電平,產(chǎn)生讀起始信號(hào)。 (2)從主機(jī)將信號(hào)線從高電平拉至低電平15-60uS的時(shí)間內(nèi),DS18B20將數(shù)據(jù)放到信號(hào)線上,完成1個(gè)讀周期。 (3)在開(kāi)始另一個(gè)讀周期前,必須有1uS以上的高電平恢復(fù)期。 讀子程序如下所示: unsigned 

8、;char duchu(void)                           unsigned char i,j,t=0,w=1;   for(i=0;i<8;i+)       &#

9、160;     t=t>>1;       s=0;       _nop_();       _nop_();       s=1;       for(j=10;j>0;j-)

10、;       if(s=1)           t=t|0x80;         else           t=t|0x00;       

11、for(j=100;j>0;j-);          return(t);     3.2.3 寫(xiě)子程序 (1)主機(jī)將信號(hào)線從高電平拉至低電平,產(chǎn)生寫(xiě)起始信號(hào)。 (2)從信號(hào)線的下降沿開(kāi)始,在15-60uS的時(shí)間內(nèi),DS18B20對(duì)信號(hào)線檢測(cè),如高則寫(xiě)1,低則寫(xiě)0,完成1個(gè)寫(xiě)周期。 (3)在開(kāi)始另一個(gè)寫(xiě)周期前,必須有1uS以上的高電平恢復(fù)期。 寫(xiě)子程序如下所示: unsigned

12、 char xieru(unsigned char o)             char i,j;    for(i=0;i<8;i+)            if(o&0x01)=0)     

13、;               s=0;           for(j=35;j>0;j-);           s=1;        &

14、#160;         else                        s=0;             for(j=2;j&g

15、t;0;j-);             s=1;             for(j=33;j>0;j-);                  o=o&

16、gt;>1;             3.2.4 其他程序 本設(shè)計(jì)中除了上述三個(gè)子程序外,還涉及到顯示程序,數(shù)據(jù)處理程序,中斷程序和延時(shí)程序等,由于篇幅原因不作具體介紹. 4 結(jié)論 通過(guò)這次畢業(yè)設(shè)計(jì),提升了我的自學(xué)能力,通過(guò)不斷的查閱資料,通過(guò)老師的不斷講解,來(lái)解決其中遇到的困難,比如如何解決DS18B20控制問(wèn)題,如何解決報(bào)警問(wèn)題等。 本文所討論的設(shè)計(jì)采用了AT89C51單片機(jī)作為系統(tǒng)的中央控制單元

17、,DS18B20作為溫度采集器,并結(jié)合軟件編程,實(shí)現(xiàn)溫度傳感電路與單片機(jī)的結(jié)合。 該系統(tǒng)具有更高速、更靈敏、更簡(jiǎn)捷地獲取被分析、檢測(cè)、控制對(duì)象的溫度信息的能力,同時(shí)具有良好的抗干擾及環(huán)境適應(yīng)能力(測(cè)溫范圍-55 + 125 )。因其體積小,使用方便,封裝形式多樣,適用于各種狹小空間設(shè)備數(shù)字測(cè)溫和控制領(lǐng)域,且系統(tǒng)結(jié)構(gòu)較為簡(jiǎn)單,可大規(guī)模的采用,成本低廉。2.2 硬件介紹 計(jì)算機(jī)工作的外圍電路設(shè)備(1)溫度傳感器溫度傳感器采用補(bǔ)償型NTC熱敏電阻其主要性能如下:補(bǔ)償型NTC熱敏電阻 B值誤差范圍小,對(duì)于阻值誤差范圍在5的產(chǎn)品,其一致性、互換性良好。適合于一般精

18、度的溫度測(cè)量和計(jì)量設(shè)備。外型結(jié)構(gòu)和尺寸:圖2.2.1 溫度傳感器結(jié)構(gòu)尺寸圖主要技術(shù)參數(shù):時(shí)間常數(shù)30S測(cè)量功率0.1mW使用溫度范圍-55+125耗散系數(shù)6mW/額定功率0.5W降功耗曲線:圖2.2.2溫度傳感器功耗曲線圖(2)核心處理單元MicroChip PIC16F877A單片機(jī)MicroChip PCI16F877A單片機(jī)主要性能:具有高性能RISC CPU僅有35條單字指令。除程序指令為兩個(gè)周期外,其余的均為單周期指令。運(yùn)行速度:DC-20M時(shí)鐘輸入。DC-200ns指令周期。8K*14個(gè)FLASH程序存儲(chǔ)器。368*8個(gè)數(shù)據(jù)存儲(chǔ)器(RAM)字節(jié)。引腳輸出和PIC16C73B/74B

19、/76/77兼容。中斷能力(達(dá)到14個(gè)中斷源)。8級(jí)深度的硬件堆棧。直接,間接和相對(duì)尋址方式。上電復(fù)位(POR)。上電定時(shí)器(PWRT)和震動(dòng)啟動(dòng)定時(shí)器。監(jiān)視定時(shí)器(WDT),它帶有片內(nèi)可靠運(yùn)行的RC振蕩器。可編程的代碼保護(hù)。低功耗睡眠方式。可選擇的振蕩器。低功耗,高速CMOS FLASH/EEPROM工藝。全靜態(tài)設(shè)計(jì)。在線串行編程(ICSP)。單獨(dú)5v的內(nèi)部電路串行編程(ICSP)能力。處理機(jī)讀/寫(xiě)訪問(wèn)程序存儲(chǔ)器。運(yùn)行電壓范圍2.0v到5v。高輸入/輸出電流25mA。商用,工業(yè)用溫度范圍。低功耗: 在5v,4MHz時(shí)典型值小于2mA。 在3v,32KHz時(shí)典型值小于20uA。 典型的靜態(tài)電流

20、值小于1uA。外圍特征:Timer 0 :帶有預(yù)分頻的8位定時(shí)器/計(jì)數(shù)器。Timer 1 :帶有預(yù)分頻的16位定時(shí)器/計(jì)數(shù)器,在使用外部晶體時(shí)鐘時(shí)在SLEEP期間仍能工作。Timer 2 :帶有8位周期寄存器,預(yù)分頻和后分頻器的8位定時(shí)器/計(jì)數(shù)器2個(gè)捕捉器,比較器和PWM模塊。其中 :捕捉器是16位的,最大分辨率為12.5nS。比較器是16位的,最大分辨率為200nS。PWM最大分辨率為是10位。10位多通道模/數(shù)轉(zhuǎn)換器。帶有SPI(主模式)和I2C(主/從)模式的SSP。帶有9位地址探測(cè)的通用同步異步接收/發(fā)送(USART/RCI)。帶有RD,WR和CS控制(只40/44引腳)8位字寬的并行

21、從端口。帶有降壓的復(fù)位檢測(cè)電路。(3)RS-232-C接口電路計(jì)算機(jī)與計(jì)算機(jī)或計(jì)算機(jī)與終端之間的數(shù)據(jù)傳送可以采用串行通訊和并行通訊二種方式。由于串行通訊方式具有使用線路少、成本低,特別是在遠(yuǎn)程傳輸時(shí),避免了多條線路特性的不一致而被廣泛采用。 在串行通訊時(shí),要求通訊雙方都采用一個(gè)標(biāo)準(zhǔn)接口,使不同 的設(shè)備可以方便地連接起來(lái)進(jìn)行通訊。 RS-232-C接口(又稱 EIA RS-232-C)是目前最常用的一種串行通訊接口。它是在1970年由美國(guó)電子工業(yè)協(xié)會(huì)(EIA)聯(lián)合貝爾系統(tǒng)、 調(diào)制解調(diào)器廠家及計(jì)算機(jī)終端生產(chǎn)廠家共同制定的用于串行通訊的標(biāo)&

22、#160;準(zhǔn)。它的全名是“數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間 串行二進(jìn)制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)”該標(biāo)準(zhǔn)規(guī)定采用一個(gè)25個(gè)腳的 DB25連接器,對(duì)連接器的每個(gè)引腳的信號(hào)內(nèi)容加以規(guī)定,還對(duì)各種信 號(hào)的電平加以規(guī)定。接口的信號(hào)內(nèi)容 實(shí)際上RS-232-C的25條引線中有許多是很少使用的,在計(jì)算機(jī)通訊中一般只使用3-9條引線。RS-232-C最常用的9條引線的信號(hào)。接口的電氣特性 在RS-232-C中任何一條信號(hào)線的電壓均為負(fù)邏輯關(guān)系。即:邏輯。“1”,-5-15V;邏輯“0” +5 +15V 。噪聲容限為2

23、V。即 要求接收器能識(shí)別低至+3V的信號(hào)作為邏輯“0”,高到-3V的信號(hào) 作為邏輯“1” 。  接口的物理結(jié)構(gòu) RS-232-C接口連接器一般使用型號(hào)為DB-25的25芯插頭座,通常插頭在DCE端,插座在DTE端. 一些設(shè)備與PC機(jī)連接的RS-232-C接口,因?yàn)椴皇褂脤?duì)方的傳送控制信號(hào),只需三條接口線,即“發(fā)送數(shù)據(jù)”、“接收數(shù)據(jù)”和“信號(hào)地”。所以采用DB-9的9芯插頭座,傳輸線采用屏蔽雙絞線。傳輸電纜長(zhǎng)度 由RS-232C標(biāo)準(zhǔn)規(guī)定在碼元畸變小于4%的情況下,傳輸電纜長(zhǎng)度應(yīng)為50英尺,其實(shí)這個(gè)4%的碼元畸變是很保守的,在實(shí)際應(yīng)用中,

24、約有99%的用戶是按碼元畸變1020%的范圍工作的,所以實(shí)際使用中最大距離會(huì)遠(yuǎn)超過(guò)50英尺。圖2.3.1 Max232結(jié)構(gòu)圖(4)繼電器繼電器是具有隔離功能的自動(dòng)開(kāi)關(guān),廣泛用于遙控,遙測(cè),通信,自動(dòng)控制,機(jī)電一體化及電力電子設(shè)備中,是最重要的控制元件之一。繼電器是在自動(dòng)控制電路中起控制與隔離作用的執(zhí)行部件,它實(shí)際上是一種可以用低電壓、小電流來(lái)控制大電流、高電壓的自動(dòng)開(kāi)關(guān)。在本系統(tǒng)中,繼電器控制的自動(dòng)溫度調(diào)節(jié)電路和PCI16F877A單片機(jī)中程序構(gòu)成溫度自動(dòng)監(jiān)測(cè)電路,實(shí)現(xiàn)對(duì)生物培養(yǎng)液溫度的監(jiān)測(cè)和自動(dòng)控制(5)半導(dǎo)體降溫片及電阻加熱絲半導(dǎo)體制冷器是根據(jù)熱電效應(yīng)技術(shù)的特點(diǎn),采用特殊半導(dǎo)體材料熱電堆來(lái)

25、制冷,能夠?qū)㈦娔苤苯愚D(zhuǎn)換為熱能,效率較高。其工作原理如圖2.5.1:圖2.5.1半導(dǎo)體降溫片工作原理圖半導(dǎo)體制冷片由許多N型和P型半導(dǎo)體之顆?;ハ嗯帕卸?,而N P之間以一般的導(dǎo)體相連接而成一完整線路,通常是銅、鋁或其他金屬導(dǎo)體,最後由兩片陶瓷片像夾心餅乾一樣夾起來(lái),陶瓷片必須絕緣且導(dǎo)熱良好,通上電源之後,冷端的熱量被移到熱端,導(dǎo)致冷端溫度降低,熱端溫度升高。它的外觀如圖2.5.2所示。正視圖側(cè)視圖2)本控制系統(tǒng)是對(duì)生物培養(yǎng)液進(jìn)行溫度監(jiān)控,故太快的溫度變化對(duì)生物繁殖顯圖2.5.2半導(dǎo)體降溫片外觀圖本控制系統(tǒng)是對(duì)生物培養(yǎng)液進(jìn)行溫度監(jiān)控,過(guò)快的溫度變化對(duì)生物繁殖顯然是不利的,因此在本系統(tǒng)中采用的是

26、高阻抗小功率加熱電阻絲進(jìn)行溫度的小范圍調(diào)節(jié)。3 溫度控制系統(tǒng)的組成框圖采用典型的反饋式溫度控制系統(tǒng),組成部分見(jiàn)圖3.1。其中數(shù)字控制器的功能由單片機(jī)實(shí)現(xiàn)。圖3.1溫度控制系統(tǒng)的組成框圖 培養(yǎng)皿的傳遞函數(shù)為,其中1為電阻加熱的時(shí)間常數(shù),為電阻加熱的純滯后時(shí)間,為采樣周期。A/D轉(zhuǎn)換器可劃歸為零階保持器內(nèi),所以廣義對(duì)象的傳遞函數(shù)為 (3-1-1) 廣義對(duì)象的Z傳遞函數(shù)為 (3-1-2) 所以系統(tǒng)的閉環(huán)Z傳遞函數(shù)為 (3-1-3) 系統(tǒng)的數(shù)字控制器為= (3-1-4) 寫(xiě)成差分方程即為 (3-1-5) 令 ,得 (3-1-6)式中 第次采樣時(shí)的偏差;第次采樣時(shí)的偏差;第次采樣時(shí)的偏差;4 溫度控制系

27、統(tǒng)結(jié)構(gòu)圖及總述PIC16f877A單片機(jī)加熱控制電路高阻抗加熱絲降溫控制電路半導(dǎo)體降溫片溫度傳感器培養(yǎng)皿TTL電平到EIA電平轉(zhuǎn)換電路商用計(jì)算機(jī)顯示終端 圖4.1溫度控制系統(tǒng)結(jié)構(gòu)圖圖4.1中溫度傳感器和Micro Chip PIC16F877A單片機(jī)中的A/D轉(zhuǎn)換器構(gòu)成輸入通道,用于采集培養(yǎng)皿內(nèi)的溫度信號(hào)。溫度傳感器輸出電壓經(jīng)過(guò)A/D轉(zhuǎn)換后的數(shù)字量與培養(yǎng)皿內(nèi)的溫度給定值數(shù)字化后進(jìn)行比較,即可得到實(shí)際溫度和給定溫度的偏差。培養(yǎng)皿內(nèi)的溫度設(shè)定值由Micro Chip PIC16F877A單片機(jī)中程序設(shè)定。由Micro Chip PIC16F877A單片機(jī)構(gòu)成的數(shù)字控制器進(jìn)行比較運(yùn)算,經(jīng)過(guò)比較后輸出

28、控制量控制由加熱和降溫電路構(gòu)成的溫度調(diào)節(jié)電路對(duì)培養(yǎng)皿中的培養(yǎng)液溫度進(jìn)行調(diào)節(jié)。同時(shí)通過(guò)電平轉(zhuǎn)換電路把當(dāng)前溫度傳輸?shù)缴逃糜?jì)算機(jī)的串口中,由計(jì)算機(jī)動(dòng)態(tài)的顯示培養(yǎng)皿中的溫度,正常情況下溫度控制由Micro Chip PIC16F877A單片機(jī)自動(dòng)控制。必要時(shí),計(jì)算機(jī)也可以通過(guò)軟件來(lái)強(qiáng)制改變培養(yǎng)皿中溫度。5 溫度控制系統(tǒng)軟件設(shè)計(jì)5.1 Microchip PIC16F877A單片機(jī)溫度控制系統(tǒng)軟件結(jié)構(gòu)圖如圖5.1.1所示。檢測(cè)與變送A/D轉(zhuǎn)換工程量變換溫度非線性轉(zhuǎn)換發(fā)送數(shù)據(jù)到串口比較判斷算法溫度預(yù)設(shè)值溫度調(diào)節(jié) 電路執(zhí)行器從串口接受數(shù)據(jù)命令識(shí)別控制程序 圖5.1.1單片機(jī)溫度控制系統(tǒng)軟件結(jié)構(gòu)圖5.2 單片

29、機(jī)控制流程圖開(kāi)始初始化PIC16F877A單片機(jī)端口地址讀入預(yù)設(shè)溫度值啟動(dòng)A/D轉(zhuǎn)換A/D轉(zhuǎn)換結(jié)果送入NX單元NX-FF>0F0-NX>0降溫加熱工程量變換溫度非線性溫度轉(zhuǎn)換發(fā)送數(shù)據(jù)到串口命令識(shí)別程序從串口接受數(shù)據(jù)YYYNNN 圖5.2.1單片機(jī)控制流程圖5.3 溫度變換程序模塊溫度傳感器在12到60輸出2.52V1.02V,溫度起點(diǎn)為12,滿量程為48。Micro Chip PIC16F877A單片機(jī)內(nèi)嵌的10位A/D轉(zhuǎn)換器對(duì)應(yīng)輸出的數(shù)字量為0000000000B1111111111B(05V),應(yīng)用以下變換公式進(jìn)行變換:AX=A0+(AM-A0)(NX-N0)/(NM-N0)式

30、中,A0為一次測(cè)量?jī)x表的下限。AM為一次測(cè)量?jī)x表的上限。AX實(shí)際測(cè)量值。N0儀表下限對(duì)應(yīng)的數(shù)字量。NM儀表上限對(duì)應(yīng)的數(shù)字量。NX測(cè)量值對(duì)應(yīng)的數(shù)字量。5.4 溫度非線性轉(zhuǎn)換程序模塊采用折線擬合法進(jìn)行線性化處理如圖5.4.1所示,分為以下幾段:當(dāng)1.73VAx<2.52V時(shí),T=0.06*WN+12當(dāng)1.40VWN<1.73V時(shí),T=0.03*WN+25當(dāng)1.24VWN<1.40V時(shí),T=0.016*WN+40當(dāng)1.06VWN<1.24V時(shí),T=0.018WN+50表5.4.1 溫度曲線實(shí)際測(cè)量數(shù)據(jù)溫度()12131415161718電壓(V)2.522.482.472.4

31、42.402.392.37溫度()19202122232425電壓(V)2.322.282.222.152.091.831.73溫度()26272829303132電壓(V)1.701.661.641.611.581.561.54溫度()33343536373839電壓(V)1.531.501.481.461.451.431.41溫度()40414243444546電壓(V)1.401.381.371.351.321.301.29溫度()47484950515253電壓(V)1.271.261.251.241.221.201.19溫度()54555657585960電壓(V)1.171.161

32、.121.111.091.071.06 圖5-1圖5.4.1 溫度分段線限等效圖6 通信協(xié)議的設(shè)計(jì)由于溫度采集和實(shí)施控制是通過(guò)單片機(jī)控制系統(tǒng)實(shí)現(xiàn),而微機(jī)完成溫度監(jiān)控,所以需要采用單片機(jī)和微機(jī)之間的通信協(xié)議。本設(shè)計(jì)應(yīng)用條件為傳輸距離不超過(guò)15米的短距離數(shù)據(jù)傳輸,且傳輸數(shù)據(jù)量較小,所以采用在控制領(lǐng)域里應(yīng)用較廣泛RS232C串行通信方式。 針對(duì)近程小批量的數(shù)據(jù)通信,設(shè)計(jì)時(shí)采用3 線制(RXD ,TXD ,GND)軟握手的零MODEM方式。即:將PC機(jī)和單片機(jī)的“發(fā)送數(shù)據(jù)線(TXD)”與“接收數(shù)據(jù)(RXD)”交叉連接,二者的地線(GND)直接相連而其它信號(hào)線如握手信號(hào)線均不用,而采用軟件握手。這樣即可

33、以實(shí)現(xiàn)預(yù)定的任務(wù),又可以簡(jiǎn)化電路設(shè)計(jì)節(jié)約了成本。由于RS232C是早期為促進(jìn)公用電話網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)通信而制定的標(biāo)準(zhǔn),其邏輯電平與TTL, MOS 邏輯電平不同。邏輯0 電平規(guī)定為+5+15V之間,邏輯1是電平為-5 -15V 之間。因此在將PC機(jī)和單片機(jī)的RXD和TXD交叉連接時(shí),必須進(jìn)行電平轉(zhuǎn)換。下圖即為通信時(shí)的硬件連接圖,其中器件MAX232完成邏輯電平轉(zhuǎn)換的任務(wù)。圖6.1 電平轉(zhuǎn)換電路圖注:在PC機(jī)中9針RS232接口中:2線:RXD, 3線:TXD, 5線:GND而在25針的RS232接口中:3線:RXD, 2線:TXD, 7線:GND6.1 軟件設(shè)計(jì)在進(jìn)行數(shù)據(jù)通信的軟件設(shè)計(jì)時(shí),必須解決

34、好兩個(gè)方面的問(wèn)題:一是可靠性,二是速度。而這兩方面的問(wèn)題,可靠性是第一位的,速度只能是在可靠的基礎(chǔ)上的速度??煽靠焖俎D(zhuǎn)輸?shù)膶?shí)現(xiàn),需要PC-單片機(jī)軟件以及通信協(xié)議等各個(gè)環(huán)節(jié)的可靠和其間的相互配合。6.1.1 通信協(xié)議概述在設(shè)計(jì)PC-單片機(jī)通信協(xié)議時(shí),需說(shuō)明一點(diǎn):在本系統(tǒng)的實(shí)際通信中,PC機(jī)是主控者單片機(jī)只是被動(dòng)接收者。采用這種通信協(xié)議較雙方互為主控者時(shí)簡(jiǎn)單。本通信協(xié)議的設(shè)計(jì)思想是基于幀傳輸方式。即在向RS232串口發(fā)送命令信號(hào),應(yīng)答信號(hào)及數(shù)據(jù)信號(hào)時(shí),是一幀一幀地發(fā)送的。為了使數(shù)據(jù)快速可靠地傳輸,將每一幀數(shù)據(jù)唯一對(duì)應(yīng)一命令幀。此時(shí)傳輸數(shù)據(jù)即執(zhí)行命令具體如下:(1) 在PC讀數(shù)據(jù)時(shí),遵循“讀命令-等

35、數(shù)據(jù)-報(bào)告”,即PC下達(dá)一命令,等待接收數(shù)據(jù),根據(jù)所接收數(shù)據(jù)的正誤向應(yīng)用程序報(bào)告此命令的執(zhí)行情況。(2) 在PC寫(xiě)數(shù)據(jù)時(shí),遵循“寫(xiě)命令-等回應(yīng)-報(bào)告”,即PC下達(dá)一寫(xiě)命令(此時(shí)所要寫(xiě)的數(shù)據(jù)含于此命令中),等待單片機(jī)發(fā)來(lái)的“已正確接收”的回應(yīng)信號(hào),并向應(yīng)用程序報(bào)告此命令執(zhí)行完畢。(3) 如果在轉(zhuǎn)輸過(guò)程中,其間PC或MCU所接收任何一幀信號(hào)出現(xiàn)錯(cuò)誤時(shí),均會(huì)向?qū)Ψ桨l(fā)送重發(fā)此幀信號(hào)的請(qǐng)求。如果連續(xù)三次轉(zhuǎn)輸失敗,則退出通信并向應(yīng)用程序報(bào)告。6.2 通信協(xié)議說(shuō)明6.2.1信號(hào)幀分類(1) 讀命令幀:當(dāng)PC讀數(shù)據(jù)時(shí),PC向PIC16F877A發(fā)送的命令信號(hào)。(2) 寫(xiě)命令幀:當(dāng)PC寫(xiě)數(shù)據(jù)時(shí),PC向PIC16

36、F877A發(fā)送的命令信號(hào)(內(nèi)含所要寫(xiě)的數(shù)據(jù))。(3) 數(shù)據(jù)幀:當(dāng)PC讀數(shù)據(jù)時(shí),PIC16F877A向PC發(fā)送的內(nèi)含數(shù)據(jù)信息的信號(hào)。(4) 正回應(yīng)幀:當(dāng)PC寫(xiě)數(shù)據(jù)時(shí),PIC16F877A向PC報(bào)告數(shù)據(jù)已正確接收的信號(hào)。(5) 重發(fā)命令幀:當(dāng)PC讀/寫(xiě)數(shù)據(jù)時(shí),PIC16F877A所接收的信號(hào)幀(讀/寫(xiě)命令幀)有誤時(shí)向PC發(fā)出的請(qǐng)求重發(fā)信號(hào)。(6) 放棄命令幀:當(dāng)PC讀/寫(xiě)數(shù)據(jù)時(shí)出現(xiàn)了使程序無(wú)法正常執(zhí)行時(shí)PC或PIC16F877A向?qū)Ψ桨l(fā)出的退出通信的通知信號(hào)。6.2.2信號(hào)幀格式(1) 讀命令幀格式幀頭標(biāo)志幀類型器件地址起始地址長(zhǎng)度校驗(yàn)和幀尾標(biāo)志幀頭標(biāo)志(1 Bit): 表示此數(shù)據(jù)包屬于本串口通信

37、協(xié)議,并為是否接收此包數(shù)據(jù)的標(biāo)志。幀類型(1 Bit): 所用信號(hào)幀的識(shí)別標(biāo)志,即1.2.1 信號(hào)幀分類中的各類型信號(hào)的標(biāo)志字節(jié)。器件地址(1Byte): PC所要訪問(wèn)的外部器件的地址即是哪一個(gè)外部器件。起始地址(2Byte): PC所要訪問(wèn)的器件的存貯器起始地址。長(zhǎng)度(1Byte): 一次命令所轉(zhuǎn)輸?shù)臄?shù)據(jù)長(zhǎng)度。校驗(yàn)和(1Byte): 此幀信號(hào)的校驗(yàn)字節(jié),為異或校驗(yàn)。幀尾標(biāo)志(1Byte): 此幀信號(hào)的結(jié)束標(biāo)志。(2) 寫(xiě)命令幀幀頭標(biāo)志幀類型器件地址起始地址長(zhǎng)度數(shù)據(jù)區(qū)校驗(yàn)和幀尾標(biāo)志數(shù)據(jù)區(qū):所要寫(xiě)的數(shù)據(jù)信息。其它分析同上。(3) 數(shù)據(jù)幀幀頭標(biāo)志幀類型長(zhǎng)度數(shù)據(jù)區(qū)校驗(yàn)字幀尾標(biāo)志長(zhǎng)度:所轉(zhuǎn)輸數(shù)據(jù)的長(zhǎng)度

38、。數(shù)據(jù)區(qū):所轉(zhuǎn)輸?shù)臄?shù)據(jù)信息。其它分析同上。(4) 正響應(yīng)幀幀頭標(biāo)志幀類型空校驗(yàn)字幀尾標(biāo)志空無(wú)意義:為了PIC16F877A編程的方便而加入。其它分析同上。(5) 重發(fā)幀幀頭標(biāo)志幀類型空校驗(yàn)字幀尾標(biāo)志其它分析同上。(6) 放棄幀幀頭標(biāo)志幀類型錯(cuò)誤碼校驗(yàn)字幀尾標(biāo)志錯(cuò)誤碼:00H 執(zhí)行PC命令發(fā)放棄幀回應(yīng)被動(dòng)退出通訊。01H PIC16F877A 單片機(jī)方寫(xiě)入芯片發(fā)生錯(cuò)誤主動(dòng)通知PC退出通訊。6.2.3 通信協(xié)議處理流程(1) 數(shù)據(jù)分幀與數(shù)據(jù)重組圖6.2.1串口數(shù)據(jù)發(fā)送過(guò)程 圖6.2.2串口數(shù)據(jù)接受過(guò)程將應(yīng)用程序發(fā)送過(guò)來(lái)的數(shù)據(jù)作為一個(gè)數(shù)據(jù)流放在發(fā)送緩沖區(qū)中,通過(guò)通信協(xié)議進(jìn)行分幀切割發(fā)送。在接收端,分

39、幀的數(shù)據(jù)去掉幀頭重新組合到接收緩沖區(qū)中,交給應(yīng)用程序處理,發(fā)送過(guò)程的示意如圖6.2.1,接收過(guò)程的示意圖如圖6.2.2。單片機(jī)串口通信軟件設(shè)計(jì)流程圖串口接受到一幀數(shù)據(jù)此幀是否正確連續(xù)3次不正確退出通信并報(bào)告讀命令信號(hào)退出等待下一幀重發(fā)命令幀寫(xiě)命令信號(hào)分析此命令開(kāi)始執(zhí)行分析此命令取出數(shù)據(jù)信息發(fā)數(shù)據(jù)幀發(fā)正回應(yīng)數(shù)據(jù)幀退出通信并報(bào)告退出等待下幀命令NYYNYYNN 圖6.2.3單片機(jī)串口通信軟件流程圖應(yīng)用程序通知通信開(kāi)始讀還是寫(xiě)發(fā)送讀命令發(fā)送寫(xiě)命令串口收到命令此幀是否正確?連續(xù)三次否退出通信是幀數(shù)據(jù)嗎?重發(fā)命令幀等待下幀信號(hào)處理數(shù)據(jù)是正回應(yīng)幀嗎命令執(zhí)行完畢是重發(fā)幀嗎退出通信并報(bào)告重發(fā)命令幀等待下幀信號(hào)

40、讀寫(xiě)NPC接收數(shù)據(jù)軟件設(shè)計(jì)流程 N N Y Y Y Y Y Y N圖6.2.4 PC串口通信軟件設(shè)計(jì)流程圖 6.3 PC 上位機(jī)的軟件設(shè)計(jì)6.3.1 PC軟件設(shè)計(jì)方法的選擇在開(kāi)發(fā)PC上位機(jī)的通信程序中,人們常用的編程語(yǔ)言可分為3類:(1) 直接面向底層硬件的匯編語(yǔ)言。(2) DOS環(huán)境下的高級(jí)編程語(yǔ)言,如: C語(yǔ)言等。(3) Windows環(huán)境下的高級(jí)編程語(yǔ)言,如:VC+等。而在這3種方式中Windows環(huán)境下的串口編程以其設(shè)備無(wú)關(guān)性,可移植性以及界面友好等特征而得到廣泛應(yīng)用。同時(shí)在Windows操作系統(tǒng)已經(jīng)占據(jù)統(tǒng)治地位的情況下,欲開(kāi)發(fā)良好的通信程序,利用Windows環(huán)境下的高級(jí)語(yǔ)言已漸成為

41、必然的選擇。開(kāi)發(fā)Windows環(huán)境下的串口通信程序主要有以下2種方法:(1) 利用Windows API(Application Program Interface)用戶程序接口函數(shù);(2) 利用ActiveX控件;后者的主要特點(diǎn)是簡(jiǎn)單易學(xué),但前者的功能更為強(qiáng)大控制手段更為靈活。6.3.2 PC軟件通信方式的選擇在Win32環(huán)境下串行通信有兩種:主要方式即同步方式,異步方式兩種方式有各自的特點(diǎn)。在軟件設(shè)計(jì)時(shí)應(yīng)根據(jù)實(shí)際情況選擇合適的方式。(1)同步方式在同步方式中,讀串口的函數(shù)試圖在串口的接收緩沖區(qū)中讀取規(guī)定數(shù)目的數(shù)據(jù),直到規(guī)定數(shù)目的數(shù)據(jù)全部被讀出或設(shè)定的超時(shí)時(shí)間已到時(shí)才返回。例如:(以C+ B

42、uilder編程語(yǔ)言為例下同)COMMTIMEOUTS cto;int timeConstant, timeMutiplier;cto.ReadTotalTimeoutConstant = timeConstant; /設(shè)置總超時(shí)常數(shù)cto.ReadTotalTimeoutMultiplier = timeMutiplier; /設(shè)置總超時(shí)系數(shù)SetCommTimeouts(m_hFile,&cto); /超時(shí)設(shè)置ReadFile (hComport,inBuffer,nWantRead,&nRealRead,NULL);/讀串口COMMTIMEOUTS結(jié)構(gòu)用于設(shè)置超時(shí),指定讀

43、寫(xiě)函數(shù)的等待時(shí)間在ReadFile 函數(shù)中hComport 為待讀串口句柄;inBuffer 為輸入緩沖區(qū)大小;nWantRead 為每次調(diào)用ReadFile 時(shí),函數(shù)試圖讀出的字節(jié)數(shù);nRealRead 為實(shí)際讀出的字節(jié)數(shù);最后一個(gè)參數(shù)值NULL 代表ReadFile將采用同步文件讀寫(xiě)方式。(2)異步方式異步方式中,利用Win32 的多線程結(jié)構(gòu),可以讓串口的讀寫(xiě)操作在后臺(tái)進(jìn)行,而應(yīng)用程序的其它部分在前臺(tái)執(zhí)行例如:CreateFile(lpszPort, /打開(kāi)串口GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED

44、, /允許異步操作0);OVERLAPPED lpOverlapped;COMMTIMEOUTS cto;int timeConstant, timeMutiplier;cto.ReadTotalTimeoutConstant = timeConstant; /設(shè)置總超時(shí)常數(shù)cto.ReadTotalTimeoutMultiplier = timeMutiplier; /設(shè)置總超時(shí)系數(shù)SetCommTimeouts(m_hFile,&cto); /超時(shí)設(shè)置lpOverlapped.hEvent=CreateEvent (NULL.TRUE,FALSE,NULL);ReadFile (h

45、Comport,inBuffer,nWantRead,&nRealRead,&lp Overlapped); /讀串口lpOverlapped 是1個(gè)OVERLAPPED 結(jié)構(gòu)變量,OVERLAPPED 結(jié)構(gòu)用于指出讀寫(xiě)操作與其它操作的重疊為了實(shí)現(xiàn)線程間同步與通信,上面的代碼中用CreateEvent 函數(shù)產(chǎn)生1 個(gè)人工復(fù)位事件,并將其句柄賦予lpOverlapped的hEvent成員這樣,在異步讀寫(xiě)完成時(shí),Windows95發(fā)送該事件信號(hào)。(3)兩種方式的比較異步方式利用多線程結(jié)構(gòu)來(lái)監(jiān)視通信設(shè)備,其最大優(yōu)點(diǎn)是程序?qū)邮諗?shù)據(jù)具有自主覺(jué)察能力。一旦通信線程查詢到數(shù)據(jù)已發(fā)送到串口上

46、,線程自動(dòng)向應(yīng)用程序發(fā)送一個(gè)數(shù)據(jù)接收到的消息,應(yīng)用程序可用該消息來(lái)讀取通信設(shè)備傳來(lái)的數(shù)據(jù)。并且使用通信線程還不占用CPU時(shí)間,這樣系統(tǒng)實(shí)際上具有了同時(shí)控制多個(gè)通信設(shè)備(如MODEM)的能力。因此在對(duì)系統(tǒng)強(qiáng)壯性要求較高的場(chǎng)合下應(yīng)采用異步方式。異步方式的優(yōu)點(diǎn)也恰是同步方式的缺點(diǎn)。使用同步方式時(shí)容易發(fā)生線程阻塞,從而使系統(tǒng)性能下降。但在某些場(chǎng)合下,該缺點(diǎn)可以通過(guò)一些措施盡可能地減小,而其簡(jiǎn)單易用的優(yōu)點(diǎn)卻是很好地體現(xiàn)出來(lái)。如果不考慮Win95的進(jìn)程和線程的問(wèn)題,僅在串口有數(shù)據(jù)時(shí),去讀串口緩沖區(qū)就可以了。此時(shí)確定串口讀取的時(shí)機(jī),握手協(xié)議及軟件糾錯(cuò)的實(shí)現(xiàn)是程序員應(yīng)考慮的主要問(wèn)題,也是減小線程阻塞所帶來(lái)的負(fù)

47、面影響的主要措施??梢圆捎猛睫D(zhuǎn)輸方式的場(chǎng)合有如下一些特點(diǎn): 何時(shí)轉(zhuǎn)輸數(shù)據(jù)由PC機(jī)來(lái)決定,下位機(jī)只是被動(dòng)接收并執(zhí)行命令。 有限時(shí)間內(nèi),PC機(jī)命令可以執(zhí)行完畢并返回結(jié)果。而不會(huì)使PC機(jī)處于長(zhǎng)時(shí)間等待。 每次所轉(zhuǎn)輸?shù)臄?shù)據(jù)的長(zhǎng)度是已知的,所轉(zhuǎn)輸?shù)臄?shù)據(jù)量是有限且比較小。我們?cè)陂_(kāi)發(fā)串行通信程序時(shí),分別應(yīng)用這兩種方式開(kāi)發(fā)都獲得了成功。鑒于應(yīng)用異步方式的安全性和普遍性6.3.3具體實(shí)現(xiàn)方法下面以C+ Builder為例,敘述PC機(jī)通信軟件的實(shí)現(xiàn)過(guò)程:(1)打開(kāi)串口在Win32中,串口和其他通信設(shè)備是作為文件處理的。串口的打開(kāi)并閉讀取以及寫(xiě)入所用的函數(shù)與操作文件的函數(shù)相同。通信會(huì)話由調(diào)用CreateFile

48、函數(shù)打開(kāi)串口開(kāi)始,CreateFile 以讀訪問(wèn)權(quán)限,寫(xiě)訪問(wèn)權(quán)限或讀寫(xiě)訪問(wèn)權(quán)限“打開(kāi)串口”并設(shè)定了對(duì)其是異步操作方式。還是同步操作方式調(diào)用該函數(shù)打開(kāi)串口進(jìn)行讀寫(xiě)操作的例子如下:mHandle = CreateFile(lpszPort, /串口名GENERIC_READ|GENERIC_WRITE, /允許讀/寫(xiě)0, /獨(dú)占方式串口不能共享NULL, /安全性屬性一般設(shè)為0OPEN_EXISTING, /串口是已存在的不能建新端口lpOverlapped, /異步方式0 /串口無(wú)模板文件應(yīng)設(shè)為0);如果調(diào)用成功函數(shù)返回串口的句柄賦給Handle,如果調(diào)用失敗則函數(shù)返回INVALID_HANDL

49、E_VALUE。(2)初始化串口對(duì)串口的初始化工作包括對(duì)波特率,數(shù)據(jù)位,停止位,奇偶校驗(yàn)位I/O 緩沖大小以及超時(shí)等參數(shù)的設(shè)置。在調(diào)用API 函數(shù)進(jìn)行串口初始化時(shí),波特率,數(shù)據(jù)位,奇偶校驗(yàn)停止位的信息包含于一個(gè)DCB結(jié)構(gòu)中,而超時(shí)方面的信息則包含于COMMTIMEOUTS結(jié)構(gòu)中,一般在用CreateFile 打開(kāi)串行口后,可以調(diào)用GetCommState 函數(shù)來(lái)獲取串行口的初始配置。要修改串行口的配置應(yīng)該先修改DCB結(jié)構(gòu),然后再調(diào)用SetCommState函數(shù)用指定的DCB結(jié)構(gòu)來(lái)設(shè)置串行口。例如:DCB dcb;GetCommState(mHandle, &dcb) /讀取DCB結(jié)構(gòu)d

50、cb.BaudRate=9600 / 設(shè)置波特率為9600b/sdcb.ByteSize=8; / 每個(gè)字符有8位dcb.Parity=NOPARITY; / 無(wú)校驗(yàn)dcb.StopBits=ONESTOPBIT; / 一個(gè)停止位SetCommState(hCom, &dcb) / 保存至DCB結(jié)構(gòu)使設(shè)置值生效調(diào)用SetupComm 函數(shù)可以設(shè)置串行口的輸入和輸出緩沖區(qū)的大小。如果通信的速率較高則應(yīng)該設(shè)置較大的緩沖區(qū)。例如:SetupComm( mHandle , 1024*2, 1024*2 ) /輸入輸出緩沖區(qū)的大小均為2K在用ReadFile 和WriteFile 讀寫(xiě)串行口時(shí),

51、需要考慮超時(shí)問(wèn)題。如果在指定的時(shí)間內(nèi)沒(méi)有讀出或?qū)懭胫付〝?shù)量的字符,那么ReadFile 或WriteFile 的操作就會(huì)結(jié)束。要查詢當(dāng)前的超時(shí)設(shè)置應(yīng)調(diào)用GetCommTimeouts 函數(shù)。該函數(shù)會(huì)填充一個(gè)COMMTIMEOUTS 結(jié)構(gòu)調(diào)用SetCommTimeouts 可以用某一個(gè)COMMTIMEOUTS結(jié)構(gòu)的內(nèi)容來(lái)設(shè)置超時(shí)。TimeOuts. ReadIntervalTimeout=0 /讀間隔超時(shí)TimeOuts.ReadTotalTimeoutMultiplier=10 /讀時(shí)間系數(shù)TimeOuts.ReadTotalTimeoutConstant=100 /讀時(shí)間常量TimeOuts

52、.WriteTotalTimeoutMultiplier=10 /寫(xiě)時(shí)間系數(shù)TimeOuts.WriteTotalTimeoutConstant=100 /寫(xiě)時(shí)間常數(shù)SetCommTimeouts(hCom, &TimeOuts); / 保存設(shè)置值生效COMMTIMEOUTS結(jié)構(gòu)的成員都以毫秒為單位??偝瑫r(shí)的計(jì)算公式是:總超時(shí)=時(shí)間系數(shù)×要求讀/寫(xiě)的字符數(shù)+ 時(shí)間常數(shù)異步方式讀寫(xiě)串行口時(shí)雖然ReadFile()和WriteFile() 在完成操作以前就可能返回但超時(shí)仍然是起作用的。這種情況下,超時(shí)規(guī)定的是操作的完成時(shí)間而不是ReadFile()和WriteFile()的返回時(shí)

53、間。(3)讀寫(xiě)串口初始化工作完成以后便可以根據(jù)通信協(xié)議合理安排讀/寫(xiě)函數(shù)ReadFile()和WriteFile()以讀寫(xiě)各種握手信息和數(shù)據(jù)信息等。其中何時(shí)讀取單片機(jī)發(fā)送過(guò)來(lái)的數(shù)據(jù)信息及應(yīng)答信息是重要的。此時(shí)采取的是事件驅(qū)動(dòng)法,即:設(shè)置通信資源上的事件掩碼為EV_RXCHAR 。當(dāng)接收到一個(gè)字符并放入緩沖區(qū)后即通知應(yīng)用程序例。/PC發(fā)送一組命令至單片機(jī)WriteFile(mHandle, /串口句柄pDataBuff, /存放數(shù)據(jù)緩種區(qū)iLen, /所寫(xiě)數(shù)據(jù)的長(zhǎng)度pdwWritten, /已寫(xiě)長(zhǎng)度操作前應(yīng)置為0lpOverlapped) /異步方式/設(shè)置通信事件掩碼DWORD dwMask=E

54、V_RXCHAR;SetCommMask(m_hFile,dwMask) /設(shè)置通信事件掩碼/等待通信事件的發(fā)生OVERLAPPED os ;memset( &os, 0, sizeof( OVERLAPPED ) ) ;os.hEvent=CreateEvent(NULL TRUE FALSE NULL)if(!WaitCommEvent(m_hFile, &dwEvtMask, &os) / 重疊操作if(GetLastError()=ERROR_IO_PENDING)/ 無(wú)限等待重疊操作結(jié)果GetOverlappedResult(mHandle, &os,

55、 &dwTrans, true);/事件已發(fā)生安排讀操作ReadFile(mHandle, /串口句柄pDataBuff, /存放數(shù)據(jù)緩種區(qū)iLen, /所讀數(shù)據(jù)的長(zhǎng)度pdwRead, /實(shí)際所讀長(zhǎng)度lpOverlapped) /異步方式在上例中,我們無(wú)限等待通信事件的發(fā)生。如果通信事件一直沒(méi)有發(fā)生則系統(tǒng)將不會(huì)繼續(xù)執(zhí)行。在實(shí)際程序設(shè)計(jì)中我們可以設(shè)置一時(shí)限,超過(guò)此時(shí)限通信事件未到則執(zhí)行相應(yīng)錯(cuò)誤處理此時(shí),只需將GetOverlappedResult函數(shù)替換為WaitForSingleObject函數(shù)此函數(shù)的聲明形式如下:WaitForSingleObject(HANDLE hEvent,

56、/事件句柄unsigned long mTimeOuts /超時(shí)設(shè)置)(4) 關(guān)閉串口通信完畢調(diào)用CloseHandle() 函數(shù)關(guān)閉串口例如CloseHandle(mHandle); /關(guān)閉mHandle為打開(kāi)串口時(shí)返回的句柄6.4 單片機(jī)軟件設(shè)計(jì)我們知道影響數(shù)據(jù)轉(zhuǎn)輸產(chǎn)生錯(cuò)誤的因素有:轉(zhuǎn)輸線分布參數(shù)上下位機(jī)間的波特率誤差現(xiàn)場(chǎng)干擾等。而針對(duì)近程小批量數(shù)據(jù)的通信,下位機(jī)的波特率誤差性是影響可靠通信的最主要因素。所以在單片機(jī)軟件的設(shè)計(jì)時(shí)應(yīng)重點(diǎn)考慮并設(shè)置好波特率。6.4.1波特率(1)波特率誤差來(lái)源分析單片機(jī)的振蕩電路是由晶體及電容C1 和C2 構(gòu)成。晶振頻率主要由晶體的因有頻率決定,同時(shí)也與電容C

57、1、C2及外界溫度有一定的關(guān)系。另外,晶體頻率的標(biāo)稱值與實(shí)際值也不可能完全一致。波特率最大允許誤差分析在異步串行通信方式1中單片機(jī)以16倍波特率的采樣速率對(duì)接收數(shù)據(jù)(RXD)不斷采樣,一旦檢測(cè)到由1到0的負(fù)跳變,16分頻計(jì)數(shù)器立刻復(fù)位,使之滿度翻轉(zhuǎn)的時(shí)刻恰好與輸入位的邊沿對(duì)準(zhǔn)。16分頻計(jì)數(shù)器把每個(gè)接收位的時(shí)間分為16 份,在中間三位即7 ,8 ,9 ,狀態(tài)時(shí)位檢測(cè)器對(duì)RXD 端的值采樣,并以3取2的表決方式確定所接收的數(shù)據(jù)位。由此可見(jiàn),當(dāng)波特率的誤差使得在接收某位數(shù)據(jù)位時(shí),采樣點(diǎn)離該位的中點(diǎn)半位間隔時(shí)將會(huì)對(duì)該位采樣兩次。即:欲使接收的第N位為正確位時(shí),須滿足下式成立:所允許的波特率誤差N > 0.54故當(dāng)所傳輸?shù)囊粠瑪?shù)據(jù)為10 位時(shí),所允許的最大的波特率允許誤差為5 %對(duì)于其它常用的8位,9位,11位,一幀的串行傳輸,其最大的波特率允許誤差分別為6.25%,5.56%, 和4.5%。減小波特率誤差的措施我們知道使用離散度小的晶振是減小波特率誤差的關(guān)鍵。如果,晶振的離散度已超過(guò)所允許的范圍,此時(shí)不宜用其標(biāo)稱值,可以采用測(cè)量其波特率的方法來(lái)得出實(shí)際的晶振波特率值。(2)單片機(jī)軟件的實(shí)現(xiàn)設(shè)置通信方式和

溫馨提示

  • 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)論