由單片機構成的雙機通信系統采用總線型主從式結構。程設計就是要利用單片機來完成一個系統,實現雙片單片機串行通信。通信的結果實用數碼管進行顯示,數碼管采用查表方式顯示。所謂主從式結構,即在兩個單片機中,一個主機負責通信管理,另一個為從機,從機要負責主機的調度與支配。該設計用AT89C51芯片,并用C語言程序來控制AT89C51,使之能實現兩個單片機之間的通信。通信方式為單工通信,一個為主單片機,作為發送方,另一個為從單片機,作為接收方。
目錄摘要 前言 二 緒論 2.1單片機 2.2C語言: 2.3雙機通信 三.系統分析 3.1 基本原理 3.2波特率選擇 3.3通信協議的使用 四 、硬件設計 4.1單片機串行通信功能 4.2 MAX232芯片 4.3整體電路設計 五、軟件設計 5.1串行通信軟件實現 5.2程序流程圖 六.聯合調試 總結 參考文獻
前言近年來,在自動化控制和只能儀器儀表中,單片機的應用越來越廣泛,由于單片機的運算功能較差,往往需要借助計算機系統,因此單片機和PC機進行遠程通信更具有實際意義,通信的關鍵在于互傳數據信息。51單片機內部的串行口具有通信的功能,該 串口可作為通信接口,利用該串口與PC機的串口通信進行串行通信,將單片機采集的數據進行整理及統計等復雜處理就能滿足實際的應用需要。51單片機的開發除了硬件支持外,同樣離不開軟件。用匯編語言或C語言等高級語言編寫的源程序必須轉化為機器碼才能被執行。目前流行的Keil 8051c編譯器。它提供了集成開發環境,包括C編譯器、宏編碼、連接器、庫管理和仿真調制器。 利用keil 8051ccuvision編寫的程序可直接調用編譯器編譯,連接后可直接運行。學生結合自己的實際情況,選擇合適的方法來完成51單片機和PC機的串口通 信。
二 緒論 2.1單片機單片機是一種集成在電路芯片,是采用超大規模集成電路技術把具有數據處理能力的中央處理器CPU隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統、定時器/計時器等功能(可能還包括顯示驅動電路、脈寬調制電路、模擬多路轉換器、A/D轉換器等電路)集成到一塊硅片上構成的一個小而完善的計算機系統。 在我國,單片機已經不是一個陌生的名詞,它的出現是近代計算機技術發展史上的一個重要里程碑,因為單片機的誕生標志著計算機正式形成了通用計算機系統和嵌入式計算機系統兩大分支。在單片機誕生之前,為了滿足工程對象的嵌入式應用要求,只能將通用計算機進行機械加固、電氣加固后嵌入到對象系統中構成。由于通用計算機的巨大體積和高成本,無法嵌入到大多數對象體系中。單片機則應嵌入式應用而誕生。單片機的單芯片的微小體積和極低的成本,可廣泛的嵌入到玩具、家用電器、機器人、儀器儀表、汽車電子系統、工業控制單元、辦公自動化設備、金融電子系統、艦船、個人信息終端及通訊產品中,成為現代電子系統中最重要的智能化工具。 單片機作為最典型的嵌入式系統,它的成功應用推動了嵌入式系統的發展。近年來。除了各種類型的工控機,各種以通用微處理器構成的計算機主模板快、以通用處理器為核,片內擴展一些外圍功能電路單元構成的嵌入式微處理器,甚至單片形式的PC及等,都實現了嵌入式應用,成為嵌入式系統的龐大家族。 作為典型的嵌入式系統的單片機,在我國大規模應用已有十余年歷史。在全國高等工科院校中,已普遍開設單片機及相關課程。單片機已成為電子系統中最普遍的應用手段。除了單設課程外,在涉及的許多環節,如課程設計、畢業設計、研究生論文課題中,單片機系統都是最廣泛的應用手段。目前,許多單片機教材都Shiite以80C51系列為基礎來講述其原理及應用的。這是因為MCS-51系列單片機奠定了8位單片機的基礎,形成了單片機的經典體系結構。單片機是現代計算機、電子技術的新興領域,無論是單片機本身還是單片機應用系統設計方案都會隨著時代不斷發生變變化。 2.2C語言:C語言是Combined Language(組合語言)的中英混合簡稱。是一種計算機程序設計語言。它既具有高級語言的特點,又具有匯編語言的特點。它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬件的應用程序。因此,它的應用范圍廣泛,不僅僅是在軟件開發上,而且各類科研都需要用到C語言,具體應用比如單片機以及嵌入式系統開發。 C 語言特點: 是一種成功的系統描述語言,用C語言開發的UNIX操作系統就是一個成功的范例;同時C語言又是一種通用的程序設計語言,在國際上廣泛流行。世界上很多著名的計算公司都成功的開發了不同版本的C語言,很多優秀的應用程序也都使用C語言開發的,它是一種很有發展前途的高級程序設計語言。1. C是中級語言。它把高級語言的基本結構和語句與低級語言的實用性結合起來。C 語言可以像匯編語言一樣對位、字節和地址進行操作, 而這三者是計算機最基本的工作單元。2.C是結構式語言。結構式語言的顯著特點是代碼及數據的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。這種結構化方式可使程序層次清晰,便于使用、維護以及調試。C 語言是以函數形式提供給用戶的,這些函數可方便的調用,并具有多種循環、條件語句控制程序流向,從而使程序完全結構化。3.C語言功能齊全。具有各種各樣的數據類型,并引入了指針概念,可使程序效率更高。另外C語言也具有強大的圖形功能,支持多種顯示器和驅動器。而且計算功能、邏輯判斷功能也比較強大,可以實現決策目的的游戲。 C語言適用范圍大。適合于多種操作系統,如Windows、DOS、UNIX等等;也適用于多種機型。C語言對編寫需要硬件進行操作的場合,明顯優于其它解釋型高級語言,有一些大型應用軟件也是用C語言編寫的。C語言具有繪圖能力強,可移植性,并具備很強的數據處理能力,因此適于編寫系統軟件,三維,二維圖形和動畫。它是數值計算的高級語言。5.C語言文件由數據序列組成,可以構成二進制文件或文本文件。常用的C語言IDE(集成開發環境)有Microsoft Visual C++,Dev-C++,Code::Blocks,Borland C++,Watcom C++ ,Borland C++ Builder,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,High C,Turbo C,C-Free,win-tc 等等…… 對于一個初學者,Microsoft Visual C++是一個比較好的軟件。界面友好,功能強大,調試也很方便。 2.3雙機通信兩臺機器的通信方式可分為單工通信、半雙工通信、雙工通信,他們的通信原理及通信方式為: 單工通信:是指消息只能單方向傳輸的工作方式。單工通信信道是單向信道,發送端和接收端的身份是固定的,發送端只能發送信息,不能接收信息;接收端只能接收信息,不能發送信息,數據信號僅從一端傳送到另一端,即信息流是單方向的。通信雙方采用“按——講”(Push To Talk,PTT)單工通信屬于點到點的通信。根據收發頻率的異同,單工通信可分為同頻通信和異頻通信。 半雙工通信:這種通信方式可以實現雙向的通信,但不能在兩個方向上同時進行,必須輪流交替地進行。也就是說,通信信道的每一段都可以是發送端,也可以是接端。但同一時刻里,信息只能有一個傳輸方向。如日常生活中的例子有步話機通信等。 雙工通信:雙工通信是指在同一時刻信息可以進行雙向傳輸,和打電話一樣,說的同時也能聽,邊說邊聽。這種發射機和接收機分別在兩個不同的頻率上(兩個頻率差有一定要求)能同時進行工作的雙工機也稱為異頻雙工機。雙工機的特點是使用方便,但線路設計較復雜,價格也較高。
三.系統分析3.1 基本原理MCS-51系列單片機上有一個通用異步接收/發送器UART,通過引腳RXD[P3.O]和TXD[P3.1]可與外音B電路進行全雙工的串行異步通信,發送數據時由TXD端送出,接收時數據由RXD端輸入。本文將具體介紹單片機串口的特點和編程方法,并且在最后給出一個實用的單片機與計算機通過串口通信的程序。1.1串行接口的基本特點 MCS-51單片機的串行端口有4種基本工作方式,通過編程設置,可以使其工作在任一方式,以滿足不同場合的需要。其中,方式0主要用于外接移位寄存器,以擴展單片機的I/O電路;工作方式1多用于雙機之間或與外設電路的通信;方式2、3除有方式1的功能外,還可以作多機通信,以構成分布式多微機系統。 串行端口有兩個控制寄存器SCON、PCON,用于設置工作方式、發送或接收的狀態、特征位、數據傳送波特率[每秒傳送的位數]以及作為中斷標志等。 串行端口有一個數據寄存器SBUF在特殊功能寄存器中的字節地址為99H,該寄存器為發送和接收所共用。 串行端口的波特率可以用程序來控制。在不同工作方式中,由時鐘振蕩頻率的分頻值或由定時器T1的定時溢出時間確定,使用十分方便靈活。???串口控制寄存器 輸入:在(REN)=1時,串行口采樣RXD引腳,當采樣到1至O的跳變時,確認是串行發送來的一幀數據的開始位0,從而開始接收一幀數據。只有當8位數據接收完,并檢測到高電平停止位后,只有滿足①(R1)=0;②(SM2)=0或接收到的第9位數據為1時,停止位才進入RB8,8位數據才能進入接收寄存器,并由硬件置位中斷標志RI;否則信息丟失。所以在方式1接收時,應先用軟件清零RI和SM2標志。 方式2為固定波特率的11位UART方式。它比方式1增加了一位可程控為1或0的第9位數據。 輸出:發送的串行數據由TXD端輸出一幀信息為11位,附加的第9位來自SCON寄存器的TB8位,用軟件置位或復位。它可作為多機通訊中地址/數據信息的標志位,也可以作為數據的奇偶校驗位。當CPU執行一條數據寫入SUBF的指令且TI=0時,就啟動發送器發送。發送一幀信息后,置位中斷標志TI。 ? 輸入:在(REN)=1時,串行口采樣RXD引腳,當采樣到1至O的跳變時,確認是串行發送來的一幀數據的開始位0,從而開始接收一幀數據。在接收到附加的第9位數據后,當滿足①(RI):0;②(SM2)=0或接收到的第9位數據為1時,第9位數據才進入RB8,8位數據才能進入接收寄存器,并由硬件置位中斷標志Ri;否則信息丟失。且不置位RI。 方式3為波特率可變的11位UART方式。除波特率外,其余與方式2相同。 波特率的選擇??? 如前所述,在串行通訊中,收發雙方的數據傳送率(波特率)要有一定的約定。在MCS-51串行口的四種工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可變的,由定時器T1的溢出率控制。 1.方式O 方式0的波特率固定為主振頻率? 的1/12。 2.方式2 方式2的波特率由PCON中的選擇位SMOD來決定,可表示為:波特率=2sMoD×fosc/64也就是當SMOD=1時,波特率為1/32×fosc,當SMOD=0時,波特率為1/64×fosc。 3.方式1和方式3 定時器T1作為波特率發生器,其公式如下: 波特率=2SMOD/32×定時器T1溢出率 T1溢出率=T1計數率/產生溢出所需的周期數 式中T1計數率取決于它工作在定時器狀態還是計數器狀態。當工作于定時器狀態時,T1計數率為Fosc/2:當工作于計數器狀態時,T1計數率為外部輸入頻率,此頻率應小于Fosc/24。產生溢出所需周期與定時器T1的工作方式、T1的預置值有關。定時器T1工作于方式O:溢出所需周期數=8192-× 定時器T1工作于方式1:溢出所需周期數=65536-X 定時器T1工作于方式2:溢出所需周期數=256-X 因為方式2為自動重裝入初值的8位定時器/計數器模式,所以用它來做波特率發生器最恰當。這種方式下,T1的溢出率[次/秒]計算式可以表示為: T1溢出率=Fsoc/12[256-X] 3.2波特率選擇波特率(Boud Rate)就是在串口通信中每秒能夠發送的位數(bits/second)。MCS-51串行端口在四種工作模式下有不同的波特率計算方法。其中,模式0和模式2波特率計算很簡單,請同學們參看教科書;模式1和模式3的波特率選擇相同,故在此僅以工作模式1為例來說明串口通信波特率的選擇。???? 在串行端口工作于模式1,其波特率將由計時/計數器1來產生,通常設置定時器工作于模式2(自動再加模式)。在此模式下波特率計算公式為:?????????波特率=(1+SMOD)*晶振頻率/(384*(256-TH1)) 其中,SMOD——寄存器PCON的第7位,稱為波特率倍增 。TH1——定時器的重載值。???? 在選擇波特率的時候需要考慮兩點:首先,系統需要的通信速率。這要根據系統的運作特點,確定通信的頻率范圍。然后考慮通信時鐘誤差。使用同一晶振頻率在選擇不同的通信速率時通信時鐘誤差會有很大差別。為了通信的穩定,我們應該盡量選擇時鐘誤差最小的頻率進行通信。??? 下面舉例說明波特率選擇過程:假設系統要求的通信頻率在20000bit/s以下,晶振頻率為12MHz,設置SMOD=1(即波特率倍增)。TH1=256-62500/波特率???? 根據波特率取值表,我們知道可以選取的波特率有:1200,2400,4800,9600,19200。列計數器重載值,通信誤差如下表: 因此,在通信中,最好選用波特率為1200,2400,4800中的一個。 3.3通信協議的使用通信協議是通信設備在通信前的約定。單片機、計算機有了協議這種約定,通信雙方才能明白對方的意圖,以進行下一步動作。假定我們需要在PC機與單片機之間進行通信,在雙方程式設計過程中,有如下約定: 0xA1:單片機讀取P0端口數據,并將讀取數據返回PC機; 0xA2:單片機從PC機接收一段控制數據; 0xA3:單片機操作成功信息。 在系統工作過程中,單片機接收到PC機數據信息后,便查找協議,完成相應的操作。當單片機接收到0xA1時,讀取P0端口數據,并將讀取數據返回PC機;當單片機接收到0xA2時,單片機等待從PC機接收一段控制數據;當PC接收到0xA3時,就表明單片機操作已經成功。 AT89C51是一種帶4K字節閃存可編程可擦除只讀存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機。AT89C2051是一種帶2K字節閃存可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。外形及引腳排列如圖所示: 管腳說明:VCC:供電電壓。GND:接地。P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P0口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數據存儲器,它可以被定義為數據/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。 P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 P3口也可作為AT89C51的一些特殊功能口,如下表所示:口管腳 備選功能 P3.0 RXD(串行輸入口) P3.1 TXD(串行輸出口) P3.2 /INT0(外部中斷0) P3.3 /INT1(外部中斷1) P3.4 T0(記時器0外部輸入) P3.5 T1(記時器1外部輸入) P3.6 /WR(外部數據存儲器寫選通) P3.7 /RD(外部數據存儲器讀選通) P3口同時為閃爍編程和編程校驗接收一些控制信號。 RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。 ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ALE禁止,置位無效。 /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。/EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 XTAL1:反向振蕩放大器的輸入及內部時鐘工作電路的輸入。XTAL2:來自反向振蕩器的輸出。 振蕩器特性: XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時鐘源驅動器件,XTAL2應不接。有余輸入至內部時鐘信號要通過一個二分頻觸發器,因此對外部時鐘信號的脈寬無任何要求,但必須保證電平要求的。
四 、硬件設計 4.1單片機串行通信功能
1.001.jpg (23.72 KB, 下載次數: 53)
下載附件
2017-6-5 00:26 上傳
圖4.1AT89C51 計算機與外界的信息交換稱為通信,常用的通信方式有兩種:并行通信和串行通信。51單片機用4個接口與外界進行數據輸入與數據輸出就是并行通信,并行通信的特點是傳輸信號的速度快,但所用的信號線較多,成本高,傳輸的距離較近。串行通信的特點是只用兩條信號線(一條信號線,再加一條地線作為信號回路)即可完成通信,成本低,傳輸的距離較遠。 51單片機的串行接口是一個全雙工的接口,它可以作為UART(通用異步接受和發送器)用,也可以作為同步移位寄存器用。51單片機串行接口的結構如下: (1)數據緩沖器(SBUF) 接受或發送的數據都要先送到SBUF緩存。有兩個,一個緩存,另一個接受,用同一直接地址99H,發送時用指令將數據送到SBUF即可啟動發送;接收時用指令將SBUF中接收到的數據取出。 (2)串行控制寄存器(PCON) SCON用于串行通信方式的選擇,收發控制及狀態指示,各位含義如下:
SM0,SM1:串行接口工作方式選擇位,這兩位組合成00,01,10,11對應于工作方式0、1、2、3。串行接口工作方式特點見下表 SM2:多機通信控制位。 REN:接收允許控制位。軟件置1允許接收;軟件置0禁止接收。 TB8:方式2或3時,TB8為要發送的第9位數據,根據需要由軟件置1或清0。 RB9:在方式2或3時,RB8位接收到的第9位數據,實際為主機發送的第9位數據TB8,使從機根據這一位來判斷主機發送的時呼叫地址還是要傳送的數據。 TI:發送中斷標志。發送完一幀數據后由硬件自動置位,并申請中斷。必須要軟件清零后才能繼續發送。 RI:接收中斷標志。接收完一幀數據后由硬件自動置位,并申請中斷。必須要軟件清零后才能繼續接收。 (3)輸入移位寄存器 接收的數據先串行進入輸入移位寄存器,8位數據全移入后,再并行送入接收SBUF中。 (4)波特率發生器 波特率發生器用來控制串行通信的數據傳輸速率的,51系列單片機用定時器T1作為波特率發生器,T1設置在定時方式。波特率時用來表示串行通信數據傳輸快慢程度的物理量,定義為每秒鐘傳送的數據位數。 (5)電源控制寄存器PCON 其最高位為SMOD。 (6)波特率計算 當定時器T1工作在定時方式的時候,定時器T1溢出率=(T1計數率)/(產生溢出所需機器周期)。由于是定時方式,T1計數率= fORC/12。產生溢出所需機器周期數=模M-計數初值X。 4.2 MAX232芯片用8051串行接口通信,如果兩臺8051單片機之間的距離很近(不超過1.5m),可以采用直接將兩臺8051單片機的串行接口直接相連,利用其自身的TTL電平(0-5V)直接傳輸數據信息。如果傳輸距離較遠(超過1.5m),由于傳輸線的阻抗與分布電容,會產生電平損耗和波形畸變,以至于檢測不出數據或數據出錯。此時可利用 RS232標準總線接口,將單片機輸出的TTL電平轉換為RS232標準電平(邏輯1為-15—-5V;邏輯0為+5-—+15V)。用RS232可將傳輸距離提高到15m,如果想遠距離傳輸,可以采用RS422或者RS485。 電平轉換芯片MAX232是美信公司(MAXIM)生產,專用于進行將TTL電平轉換為RS232電平的芯片,MAX232內部有泵電源,能將+5V電源電壓在芯片內提高到RS232電平所需的+10V或者-10V電平。
1.002.jpg (18.59 KB, 下載次數: 46)
下載附件
2017-6-5 00:26 上傳
圖4.2.電平轉換芯片MAX232
4.3整體電路設計最終設計電路如下圖3所示,發送方的數據由串行口TXD段輸出,經過電平轉換芯片MAX232將TTL電平轉換為RS232電平輸出,經過傳輸線將信號傳送到接收端。接收方也使用MAX232芯片進行電平轉換后,信號到達接收方串行口的接收端。接受方接收后,通過P1口在數碼管上顯示接收的信息。
1.003.jpg (76.03 KB, 下載次數: 62)
下載附件
2017-6-5 00:26 上傳
圖4.3.串行通信電路
五、軟件設計通過通信協議進行發送接收,主機先送AAH給從機,當從機接收到AAH后,向主機回答BBH。主機收到BBH后就把數碼表TAB[16]中的10個數據送給從機,并發送檢驗和。從機收到16個數據并計算接收到數據的檢驗和,與主機發送來的檢驗和進行比較,若檢驗和相同則發送00H給主機;否則發送FFH給主機,重新接受。從機收到16個正確數據后送到一個數碼管顯示。 5.1串行通信軟件實現(1)串行口工作于方式1;用定時器1產生9600bit/s的波特率,工作于方式2。 (2)功能:將本機ROM中數碼表TAB[16]中的16個數發送到從機,并保存在從機內部ROM中,從機收到這16個數據后送到一個數碼管循環顯示。 (3)通信協議:主機首先發送連絡信號(AAH),從機接收到之后返回一個連絡信號(BBH)表示從機已準備好接收。 (4)通信過程使用第九位發送奇偶校驗位。 (5)從機接收到一個數據后,立即進行奇偶校驗,若數據沒有錯誤,則返回00H,否則返回FFH。 (6)主機發送一個數據后,等待從機返回數據;若為00H,則繼續發送下一個數據,若為FFH,則重新發送數據。 5.2程序流程圖(1)發送端程序流程圖
1.004.jpg (25.54 KB, 下載次數: 65)
下載附件
2017-6-5 00:26 上傳
接收方程序流程圖
1.005.jpg (29.47 KB, 下載次數: 52)
下載附件
2017-6-5 00:26 上傳
六.聯合調試在protues上進行仿真實驗。首先使用KeilC將編寫完成的程序編譯生成HEX文件,將HEX文件燒錄到兩片單片機中,進行仿真實驗,結果如下圖所示,可以看到,接收端已將接受到的數據完整的顯示了出來。
1.006.jpg (71.25 KB, 下載次數: 60)
下載附件
2017-6-5 00:26 上傳
圖6.1.仿真圖 總結
本次設計是通過兩塊簡單的89C51單片機實現信息的串口通信。設計過程中,從雙機通信背景的了解,到89C51單片機具體功能的了解,與89C51單片機的區別;從串口通信的原理的熟悉,到掌握具體串口通信在雙機之間的實現;從硬件電路設計到程序編寫;從硬件調試到軟件模擬實現等過程在自己的努力和老師的親切指導下,都是有條不紊地進行。 設計中,收獲不少東西,也遇到了不少的問題。首先,在完成單片機課程學習任務后,對內容的掌握不夠,缺乏靈活運用的能力,對于知識的擴展也存在一定的問題,因此,初面對設計課題,無法系統地進行設計思路的擬定。其次,一個學期的學習,在鞏固和學習硬件知識的同時,用軟件控制協調硬件實現現實功能,通過硬件完成軟件的功能等方面的融會貫通,取得了一定的效果。再者,硬件設計過程中,I/O口的擴展,外部ROM的擴展,對于芯片的選擇,軟件編寫時,對于某些指令的功能,功能模塊的連接,芯片地址選擇等都遇到了很大的障礙,不過在老師幫助和自己查閱資料得到了解決,與此同時,了解了不少的問題。另外,設計中犯一些常識性的錯誤,對設計進程造成了一定的影響。例如,程序調試時,由于粗心錄入程序時,將程序敲錯,比如將0(零)和字母O混淆,還有中文標點符號和英文標點符號混淆等。這樣的錯誤很難發現,以至于花費了很多時間。 通過本次課程設計,不僅使理論知識得到了實踐,有效鞏固了知識。同時對于單片機發展歷史、強大功能、應用領域以及系列知識得到了大概的系統認識,同時也初步了解了一個完整的系統開發的過程,對于創造思維的培養和開發能力的鍛煉,本次設計,為此提供了一個很好的平臺。 當然,同學之間的相互討論學習,互相提高,老師知識的幫助,經驗的傳授,也是本次設計的一道美麗的風景線,真正起到了拋磚引玉的目的。在此,感謝老師給我們這樣好的學習機會。
參考文獻 [1] 胡偉. 單片機C程序設計及應用實例. 北京:人民郵電出版社,2003 [2] 韓毅剛.計算機通信技術. 北京市:北京航空航天大學出版社,2007 [3] 李朝青. 單片機與PC機網絡通信技術.北京:北京航空航天大學出版社,2007 [4] 郭惠 吳訊著 單片機C語言程序設計.北京:電子工業出版社,2008 [5] 陳濤著 單片機應用及C51程序設計.北京:機械工業出版社,2011 [6] 孫近平 張大鵬著 51系列單片機原理、開發與應用實例.北京:中國電力出版社,2009
附錄: 主機發送程
- #include
- #define uchar unsigned char
- void init();
- void send();
- ucharTAB[16] ={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- uchar i,sum;
- int j;
- main()
- { init();
- send();
- }
- void init(void)
- { EA=1;
- ES=1;
- TMOD=0x20;
- TH1=0xfd;
- TL1=0xfd;
- PCON=0x00;
- SCON=0x50;
- TR1=1;
- }
- void send(void)
- {do
- { SBUF=0xaa;
- while(!TI);
- TI=0;
- while(!RI);
- RI=0;
- }
- while((SBUF^0xbb)!=0);
- do
- { sum=0;
- for(i=0;i<=15;i++)
- { SBUF=TAB[i];
- sum+=TAB[i];
- while(!TI);
- TI=0;
- }
- SBUF=sum;
- while(!TI);
- TI=0;
- while(!RI);
- RI=0;
- }
- while(SBUF!=0);
- }
復制代碼
從機接受程序:- #include
- #define uchar unsigned char
- #define uint unsigned int
- void delay(int );
- void receive(void) ;
- void init(void);
- uchar i,sum;
- int j;
- ucharTAB[16] ={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- void main()
- { init();
- receive();
- }
- void init(void)
- { EA=1;
- ES=1;
- TMOD=0x20;
- TH1=0xfd;
- TL1=0xfd;
- PCON=0x00;
- SCON=0x50;
- TR1=1;
- }
- void delay(int x)
- { int i,j;
- for(i=0;i<x;i++)
- for(j=1;j<=150;j++ );
- }
- void receive(void)
- { uchar TABS[16];
- do
- { while(!RI);RI=0; }
- while((SBUF^0xaa)!=0);
- SBUF=0xbb;
- while(!TI);TI=0;
- while(1)
- { sum=0;
- for(i=0;i<=15;i++)
- { while(!RI);RI=0;
- TABS[i]=SBUF;
- sum+=TABS[i];
- }
- while(!RI);RI=0;
- if((SBUF^sum)==0)
- { SBUF=0x00;
- while(!TI);
- TI=0;
- break;
- }
- else
- { SBUF=0xff;
- while(!TI);
- TI=0;
- }
- }
- while(1)
- { for(i=0;i<=15;i++)
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整論文下載(word格式 可編輯):
http://www.zg4o1577.cn/bbs/dpj-86873-1.html
|