版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 摘 要</b></p><p> 隨著電子技術(shù)的發(fā)展和微處理器技術(shù)的應用,帶有單片機的智能型測控系統(tǒng)的應用越來越廣泛,多個單片機系統(tǒng)之間數(shù)據(jù)傳輸已經(jīng)應用于工業(yè)、科研、農(nóng)業(yè)等領(lǐng)域,而單片機之間的數(shù)據(jù)通信最常用的就是串口通信方式,串口通信可以在使用一根線發(fā)送數(shù)據(jù)的同時利用另一根線接收數(shù)據(jù),使用簡單且能實現(xiàn)遠距離通信。</p><p>
2、 本文介紹了一種單片機多機通信的設計方法,主機與從機之間通過串口實現(xiàn)通信,主機通過按鍵來選擇要進行通信的從機,然后通過數(shù)字矩陣鍵盤控制從機的數(shù)碼管顯示數(shù)字0-9,同時該從機返回自己的地址,實現(xiàn)全雙工通信。</p><p> 本文介紹的方法簡單易懂,通過仿真基本上實現(xiàn)了上述功能,操作簡單,性能穩(wěn)定,可廣泛應用于各種多機通信系統(tǒng)中。</p><p> 關(guān)鍵詞:單片機;串口通信;C語言;矩
3、陣鍵盤</p><p><b> 目 錄</b></p><p><b> 1設計任務1</b></p><p><b> 2設計方案1</b></p><p><b> 2.1設計任務1</b></p><p>
4、 2.2串行通信簡介2</p><p> 3.系統(tǒng)硬件設計2</p><p><b> 3.1接口設計2</b></p><p> 3..2主機電路模塊設計3</p><p> 3.3從機電路模塊5</p><p> 3.4矩陣鍵盤電路6</p><p&g
5、t;<b> 4系統(tǒng)軟件設計6</b></p><p> 4.1軟件設計應用環(huán)境6</p><p> 4.2軟件設計流程7</p><p> 4.3按鍵程序設計8</p><p><b> 4.4串口通信8</b></p><p> 4.5從機數(shù)碼管顯示
6、程序設計10</p><p> 5仿真與性能分析10</p><p> 5.1系統(tǒng)仿真過程10</p><p> 5.2仿真結(jié)果10</p><p><b> 6心得體會11</b></p><p><b> 參考文獻12</b></p>
7、<p> 附錄1系統(tǒng)原理圖12</p><p> 附錄2程序清單13</p><p><b> 1設計任務</b></p><p> 多機串行通信的設計基本任務</p><p> 1. 設計三個單片機實現(xiàn)主從式串行通信的系統(tǒng),主機發(fā)送數(shù)據(jù)到從機,并在LED數(shù)碼管上顯示。</p>&l
8、t;p> 2. 可通過接在主機上的鍵盤輸入數(shù)據(jù),通過主機發(fā)送到從機。 </p><p><b> 選做</b></p><p> 3. 通信協(xié)議遵從modbus。</p><p> 4.其他功能(創(chuàng)新部分)</p><p><b> 仿真模塊例</b></p>&
9、lt;p><b> 2設計方案</b></p><p><b> 2.1設計任務</b></p><p> 本文在研究傳統(tǒng)的多機通信系統(tǒng)的基礎(chǔ)上,設計了一種基于MCS-51系列單片機AT89C51的多機通信系統(tǒng)。打開proteus仿真電路圖,按下軟件下方的“開始”圖標,啟動系統(tǒng),按下“1號機”按鍵,主機與從機1接通,通過主機外接的4*
10、4矩陣鍵盤控制從機1的數(shù)碼管,按下標號為0-9的按鍵時,對應從機1的數(shù)碼管顯示0-9,按下“2號機”按鍵,主機與從機2接通,通過主機外接的4*4矩陣鍵盤控制從機2的數(shù)碼管,按下標號為0-9的按鍵時,對應從機2的數(shù)碼管顯示0-9。</p><p><b> 系統(tǒng)分析</b></p><p><b> 2.2串行通信簡介</b></p>
11、;<p> 串行通信可以分為同步通信和異步通信兩類。</p><p> 同步通信是一種連續(xù)串行傳送數(shù)據(jù)的通信方式,一次通信只傳送一幀信息。這里的信息幀與異步通信中的字符幀不同,通常含有若干個數(shù)據(jù)字符。它們均由同步字符、數(shù)據(jù)字符和校驗字符(CRC)組成。其中同步字符位于幀開頭,用于確認數(shù)據(jù)字符的開始。數(shù)據(jù)字符在同步字符之后,個數(shù)沒有限制,由所需傳輸?shù)臄?shù)據(jù)塊長度來決定;校驗字符有1到2個,用于接收端
12、對接收到的字符序列進行正確性的校驗。同步通信的缺點是要求發(fā)送時鐘和接收時鐘保持嚴格的同步。</p><p> 異步通信中,在異步通行中有兩個比較重要的指標:字符幀格式和波特率。數(shù)據(jù)通常以字符或者字節(jié)為單位組成字符幀傳送。字符幀由發(fā)送端逐幀發(fā)送,通過傳輸線被接收設備逐幀接收。發(fā)送端和接收端可以由各自的時鐘來控制數(shù)據(jù)的發(fā)送和接收,這兩個時鐘源彼此獨立,互不同步。接收端檢測到傳輸線上發(fā)送過來的低電平邏輯"0
13、"(即字符幀起始位)時,確定發(fā)送端已開始發(fā)送數(shù)據(jù),每當接收端收到字符幀中的停止位時,就知道一幀字符已經(jīng)發(fā)送完畢。</p><p> 串口通信最重要的參數(shù)是波特率、起始位、數(shù)據(jù)位、停止位和奇偶校驗。</p><p> 波特率:是一個衡量通信速度的參數(shù),表示每秒鐘傳送的bit的個數(shù)。</p><p> 起始位:當通信線上沒有數(shù)據(jù)被傳送時處于邏輯“1”狀態(tài)
14、,當發(fā)送設備要發(fā)送一個數(shù)據(jù)時,先發(fā)送一個邏輯“0”信號,這個低電平就是起始位,起始位通過通信線傳向接收設備,接收端檢測到這個低電平后,就確認開始接收數(shù)據(jù)了。起始位的作用是使通信雙方在傳送數(shù)據(jù)前協(xié)調(diào)同步。</p><p> 數(shù)據(jù)位:是衡量通信中實際數(shù)據(jù)位的參數(shù),當計算機發(fā)送一個信息包,實際的數(shù)據(jù)不會是8位的,標準的值是5、7或8位,如何設置取決于要傳送的信息。每個包是指一個字節(jié),包括開始/停止位、數(shù)據(jù)位和奇偶校驗
15、位,由于實際數(shù)據(jù)位取決于通信協(xié)議的選取,術(shù)語“包”指任何通信的情況。</p><p> 停止位:用于表示單個包的最后一位。典型的值為1、1.5和2位,它是一個數(shù)據(jù)的結(jié)束標志,接收端接收到停止位后,通信線路上會回復邏輯“1”的狀態(tài),知道下一個起始位的到來。</p><p> 奇偶校驗位:在串行通信中一種簡單的檢錯方式,有四種方式:偶、奇、高和低。對于偶和檢驗的情況,串口會設置檢驗位,用一
16、個值確保傳輸?shù)臄?shù)據(jù)有偶個或者奇?zhèn)€邏輯高位。高位和低位不真正的檢查數(shù)據(jù),簡單置位邏輯高或者邏輯低校驗,這樣使得接收設備能夠知道一個位的狀態(tài),有機會判斷是否有噪聲干擾了通信或者是否傳輸和接收數(shù)據(jù)是否不同步。</p><p><b> 3.系統(tǒng)硬件設計</b></p><p><b> 3.1接口設計</b></p><p>
17、; MCS-51單片機具有多機通信功能,利用它可以構(gòu)成分布式系統(tǒng),電路結(jié)構(gòu)如圖3.1所示</p><p><b> 圖3.1電路結(jié)構(gòu)</b></p><p> 本設計單片機之間通過串口進行通信,主機通過按鍵來選擇要進行通信的從機,進而通過按鍵控制從機的數(shù)碼管顯示數(shù)字。 數(shù)碼管與單片機的連接方式采用并行連接方式。系統(tǒng)設計框圖如圖3.2所示:</p>
18、<p> 圖3.2系統(tǒng)設計框圖</p><p> 3..2主機電路模塊設計</p><p> 3.2.1 單片機簡介</p><p> AT89C51單片機內(nèi)部主要由9個部件組成:1個8位中央處理器;4KBFlash存儲器;128B的數(shù)據(jù)存儲器;32條I/O口線;2個定時器/計數(shù)器;1個具有6個中斷源、4個優(yōu)先級的中斷嵌套結(jié)構(gòu);用于多處理機通信、I
19、/O擴展或全雙工UART的串行口;特殊功能寄存器;1個片內(nèi)振蕩器和時鐘電路。AT89S51系列單片機完全繼承了MCS-51的指令系統(tǒng),共有111條指令,按其功能可分為五大類:數(shù)據(jù)傳送類指令、算術(shù)運算類指令、邏輯運算類指令、控制轉(zhuǎn)移類指令、布爾操作。AT89C51單片機引腳如圖3.3所示。</p><p> 圖3.3AT89C51單片機引腳圖</p><p><b> 管腳說明
20、:</b></p><p> P0口:8位、漏極開路的雙向I/O口。P0能夠用于外部程序數(shù)據(jù)存儲器。它可以被定義為數(shù)據(jù)/地址的第八位。P0口在應用時必須外接上拉電阻,作為輸入時,首先應將引腳置1。</p><p> P1口:8位雙向I/O口,內(nèi)部含上拉電阻。作為輸入時,應先將引腳置高;若負載為低電平,則通過內(nèi)部上拉電阻向外輸出電流。</p><p>
21、 P2口:8位雙向I/O口,內(nèi)部含上拉電阻。作為輸入時,應先將引腳置高;若負載為低電平,則通過內(nèi)部上拉電阻向外輸出電流。</p><p> P3口:8位雙向I/O口,內(nèi)部含上拉電阻。作為輸入時,應先將引腳置高;若負載為低電平,則通過內(nèi)部上拉電阻向外輸出電流。P3口除了通用I/O口功能外,還有第二功能。P3口的第二功能定義如表3.4所示。</p><p> 表3.4 P3口第二功能定義
22、</p><p> RST:復位輸入,低電平有效。</p><p> ALE/PROG:地址鎖存允許信號輸出。在正常操作狀態(tài)下,該引腳端口輸出恒定頻率的脈沖。其頻率為晶振頻率的1/6,可用作外部定時或其他觸發(fā)信號。如果需要,可通過SFR的第0位置禁止ALE操作,但ALE的禁止位不影響對外部存儲器的訪問。</p><p> ?。浩獬绦虼鎯ζ鬟x通信號,低電平有效。
23、當AT89S51執(zhí)行來自外部程序存儲器的指令代碼時,PSEN/每個機器周期兩次有效。在訪問外部數(shù)據(jù)存儲器時,PSEN/無效。</p><p> ?。浩獬绦虼鎯ζ髟L問允許信號,低電平有效。</p><p> XTAL1:外接晶振。在單片機內(nèi)部是反相放大器的輸入及端。</p><p> XTAL2:外接晶振。在單片機內(nèi)部是反相放大器的輸出端,輸入到內(nèi)部時鐘發(fā)生器。
24、</p><p> 3.2.2 主機控制電路</p><p> 該部分電路設計如圖3.5所示。單片機的時鐘的頻率直接影響著單片機的速度和系統(tǒng)的穩(wěn)定性。AT89S51片內(nèi)由一個反相放大器構(gòu)成振蕩器,可以通過XTAL1和XTAL2產(chǎn)生時鐘。常用的單片機產(chǎn)生時鐘的方法有兩種:內(nèi)部時鐘方式和外部時鐘方式。本設計選用外部時鐘方式,單片機內(nèi)部XTAL1引腳為高增益反向放大器的輸入端,XTAL2為輸
25、出端,在這2個引腳之間接石英晶振和電容,就可以構(gòu)成一個穩(wěn)定的自激振蕩器。本設計選用的11.05926MHz的晶振。</p><p> 復位是單片機的初始化操作,復位信號是高電平有效,復位操作有上電自動復位、按鍵電平復位、外部脈沖復位和自動復位四種方式。在本設計中復位電路采用按鍵電平方式,使RST引腳經(jīng)過10u電解電容與VCC電源接通,同時經(jīng)過電阻與地連接而實現(xiàn),按下按鍵時,RST引腳置高,實現(xiàn)復位功能。<
26、/p><p> 單片機的P1口控制矩陣鍵盤電路,P0口控制數(shù)碼管段碼,P3.4 P3.5分別控制兩個數(shù)碼管的位選。</p><p> 圖3.5主機控制電路</p><p><b> 3.3從機電路模塊</b></p><p> 本設計共設置2路從機,2路從機的電路設計和實現(xiàn)的功能是一樣的,所以這里只介紹其中一路從機的
27、電路設計。</p><p> 從機電路如圖3.6所示。P0口控制數(shù)碼管顯示。半導體數(shù)碼管的每個線段都是一個發(fā)光二極管(Light Emitting Diode,簡稱LED),因而也把它叫做LED數(shù)碼管或LED七段顯示器。半導體數(shù)碼管不僅具有工作電壓低、體積小、壽命長、可靠性高等優(yōu)點,而且響應時間短(一般不超過0.1us),亮度也比較高。LED數(shù)碼管由八只發(fā)光二極管組成,編號是a、b、c、d、e、f、g、h,分別
28、和同名管腳相連,當發(fā)光二極管導通時發(fā)光。每個二極管就是一個筆劃,若干個二極管發(fā)光時,就構(gòu)成一個顯示字符。若將單片機的I/O口與數(shù)碼管的a-g和h相連,高電平(對應共陰極數(shù)碼管)或低電平(對應共陽極數(shù)碼管)的位對應的發(fā)光二極管就會亮,這樣,I/O口輸出不同的代碼就可以控制數(shù)碼管顯示不同的字符。由于本設計只用了一個數(shù)碼管顯示數(shù)字0-9,所以直接將數(shù)碼管的8個段碼引腳連接至單片機的引腳上,利用單片機的引腳輸出要顯示的數(shù)字的代碼,P2.0 P2
29、.1控制數(shù)碼段位選。</p><p><b> 圖3.6從機電路</b></p><p><b> 3.4矩陣鍵盤電路</b></p><p> 矩陣鍵盤電路如圖3.7所示。單片機的P1口控制矩陣鍵盤。本設計采用4*4矩陣鍵盤。矩陣鍵盤的行線接P1.0-P1.3引腳,列線接P1.4-P1.7引腳。將P1.0-P1.3
30、引腳置為高電平,P1.4-P1.7引腳依次置為低電平,當按鍵沒有按下時,P1.0-P1.3口各引腳狀態(tài)不變,一旦有按鍵按下,則P1.0-P1.3就會有引腳變?yōu)榈碗娖剑@樣,通過讀入P1.0-P1.3的狀態(tài)就可得知是哪一個按鍵按下了,然后單片機根據(jù)該按鍵代表的功能執(zhí)行相應的程序。</p><p> 圖3.7矩陣鍵盤電路</p><p><b> 4系統(tǒng)軟件設計</b>
31、;</p><p> 4.1軟件設計應用環(huán)境</p><p> 本設計軟件的設計是在Keil C51的環(huán)境下編譯的。Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng),軟件提供豐富的庫函數(shù)和功能強大的集成開發(fā)調(diào)試工具,全Windows界面。Keil C51標準C編譯器為8051微控制器的軟件開發(fā)提供了C語言環(huán)境,同時保留了匯編代碼高效、快速的
32、特點。C51編譯器的功能不斷增強,使你可以更加貼近CPU本身,及其它的衍生產(chǎn)品。C51已被完全繼承到μVsion2的集成開發(fā)環(huán)境中,這個集成開發(fā)環(huán)境包含:編譯器、匯編器、實時操作系統(tǒng)、項目管理器、調(diào)試器。μVsion2 IDE可為它們提供單一而靈活的開發(fā)環(huán)境。C51 V7版本是目前最高效、靈活的8051開發(fā)平臺。它可以支持所有8051的衍生產(chǎn)品,也可以支持所有兼容的仿真器,同時支持其它第三方開發(fā)工具。因此,C51 V7版本無疑是8051
33、開發(fā)用戶的最佳選擇。Keil C51編譯器在遵循ANSI標準的同時,為8051微控制器系列特別設計,語言上的擴展能讓用戶使用應用中的所有資源。</p><p> ?。?)存儲器和特殊功能寄存器的存取。C51編譯器可以實現(xiàn)對8051系列所有資源的操作。SFR的存取由sfr和sbit兩個關(guān)鍵字來提供。變量可旋轉(zhuǎn)到任一個地址空間。用關(guān)鍵字-at-還能把變量放入固定的存儲器。存儲模式?jīng)Q定了變量的存儲類型。</p&g
34、t;<p> 連接定位器支持的代碼區(qū)可達32個,這就允許用戶在原有64K ROM的8051基礎(chǔ)上擴展程序。在V2的編譯器和許多高性能仿真器中,可以支持應用程序的調(diào)試。</p><p> ?。?)中斷功能。C51允許用戶使用C語言編寫中斷服務程序,快速進、出代碼和寄存器區(qū)的轉(zhuǎn)換功能使C語言中斷功能更加高效??稍偃牍δ苁怯藐P(guān)鍵字來定義呃。多任務、中斷或非中斷的代碼要求必須具備可再入功能。</p&
35、gt;<p> ?。?)靈活的指針。C51提供了靈活高效的指針。通用指針用3個字節(jié)來存儲存儲器類型及目標地址,可以在8051的任意存儲區(qū)內(nèi)存取任何變量。特殊指針在聲明的同時已制定了存儲器類型,指向某一特定的存儲區(qū)域。由于地址的存儲只需1-2字節(jié),因此,指針存取非常迅速。</p><p><b> 4.2軟件設計流程</b></p><p> 系統(tǒng)軟件
36、分為兩個部分,主機軟件設計和從機軟件設計。主機軟件設計流程圖如圖4.1所示。</p><p> 圖4.1 主機軟件設計流程圖</p><p> 從機軟件設計流程圖如圖4-2所示。</p><p> 圖4.2 從機軟件設計流程圖</p><p><b> 4.3按鍵程序設計</b></p><p
37、> 單片機讀取按鍵值的方法有兩種:查詢方式和中斷方式。查詢方式是利用鍵盤程序不斷查詢是否有按鍵按下,有按下則進入相應按鍵的子程序進行數(shù)據(jù)處理,沒有則一直循環(huán)查詢;中斷方式是將按鍵動作與單片機的中斷系統(tǒng)聯(lián)系起來,有按鍵按下時,就引起單片機中斷,使系統(tǒng)進入中斷處理程序。本設計采用查詢方式來處理讀取按鍵值程序。程序如附錄。</p><p><b> 4.4串口通信</b></p&g
38、t;<p> AT89S51的串行口是一個全雙工的異步串行通信口,可以同時進行接收數(shù)據(jù)和發(fā)送數(shù)據(jù),因為口內(nèi)的接受緩沖器和發(fā)送緩沖器在物理上是隔離的,即是完全獨立的??梢酝ㄟ^訪問特殊功能寄存器SBUF,來訪問接收緩沖器和發(fā)送緩沖器。接收緩沖器還具有雙緩沖的功能,即它在接收第一個數(shù)據(jù)字節(jié)后,能接受第二個數(shù)據(jù)字節(jié),但是,在它完成接收第二個數(shù)據(jù)字節(jié)之后,若第一個字節(jié)仍未取走,那么該字節(jié)數(shù)據(jù)將丟失。對串行口的控制主要包括對狀態(tài)控制
39、寄存器SCON、控制寄存器PCON、和串行數(shù)據(jù)寄存器SBUF的設置。</p><p> 1、狀態(tài)控制寄存器SCON:SCON是一個逐位定義的8位寄存器,由它控制串行通信的方式選擇、接收和發(fā)送,指示串行口的狀態(tài)。寄存器SCON既可字節(jié)尋址也可位尋址,字節(jié)地址為98H,位地址為98H-9FH。其格式如下表4-1所示:</p><p> 表4.3 SCON地址格式</p>&
40、lt;p> SM0,SM1:串行口工作方式選擇位;</p><p> SM2:允許方式2、3中的多處理機通信位;</p><p> REN:允許串行接收位,置位時,允許串行接收,清除時,禁止串行接收,可用軟件置位/清除;</p><p> TB8:方式2和方式3中要發(fā)送的第9位數(shù)據(jù),可用軟件置位/清除;</p><p> RB
41、8:方式3和方式3中接收的第9位數(shù)據(jù)。方式1中接收的是停止位,方式0中不使用這一位。</p><p> TI:發(fā)送中斷標志位,硬件置位,軟件清除。方式0中,在發(fā)送第8位末尾置位,在其他方式時,在發(fā)送停止位開始時設置;</p><p> RI:接收中斷標志位。硬件置位,軟件清除。方式0中,在接收第8位末尾置位,在其他方式時,在接收停止位中間設置。</p><p>
42、 2、控制寄存器PCON:PCON是一個逐位定義的8位寄存器,目前僅有幾位有定義,其中僅最高位SMOD與串行口控制有關(guān),其他位與掉電方式有關(guān),其格式如表4-2所示。</p><p> 表4.4 PCON地址格式</p><p> SMOD:串行通信波特率系數(shù)控制位,當SMOD=1時,使波特率加倍。寄存器PCON的地址為87H,只能字節(jié)尋址。</p><p>
43、 3、串行數(shù)據(jù)寄存器SBUF:SBUF包含在物理上隔離的兩個8位寄存器:發(fā)送數(shù)據(jù)寄存器和接受數(shù)據(jù)寄存器,但是它們共用一個地址99H,其格式如下表4-3所示。</p><p> 表4.5 數(shù)據(jù)寄存器格式</p><p> 串行口控制寄存器SCON中的SM2為方式2或方式3的多機通信控制位,當串行口以方式2或方式3工作時,若SM2程控位為1,此時只有當串行口就收到的第9位數(shù)據(jù)RB8=1時
44、,才置1中斷標志RI,若接收到的RB8=0,則不產(chǎn)生中斷標志,應用MCS-51串行口的這個標志,便可實現(xiàn)多機通信。</p><p> 在一個多機系統(tǒng)中有一個主機和二個從機組成的多機系統(tǒng),從機的地址分別為00H,01H,從機系統(tǒng)由初始化程序?qū)⒋锌诰幊虨榉绞?或方式3接收,即9位異步通信方式,且置“1”SM2和REN,允許串行口中斷。在主機和某一個從機通信之前,先將從機地址發(fā)送給各個從機系統(tǒng)。接著才傳送數(shù)據(jù)或命令
45、,主機發(fā)出的地址信息的第9位為1,數(shù)據(jù)(包括命令)信息的第9位為0,當主機向各從機發(fā)送地址時,各從機的串行口接收到的第9位的信息RB8為1,置“1”RI中斷標志位,各從機80C51響應中斷,執(zhí)行中斷服務程序。在中斷服務程序中,判斷主機送來的地址是否和本機地址相符合,若為本機的地址,則清“0”SM2位,準備接收主機的數(shù)據(jù)或命令;若地址不相符,則保持SM2=1狀態(tài)。接著主機發(fā)送數(shù)據(jù),此時各個從機串行口接收到的RB8=0;只有與前面地址相符合
46、的從機系統(tǒng)(即已清“0”SM2位的從機)才能激活中斷標志位RI,從而進入中斷服務程序,在中斷服務程序中接收主機的數(shù)據(jù)或執(zhí)行主機的命令,實現(xiàn)和主機的信息傳送;其他的從機因SM2保持為1,又RB8=0不激活中斷標志RI,所接收的數(shù)據(jù)丟失不作處理,從而保證了主機和從機間通信的正確性。</p><p> 本次設計多機系統(tǒng)為主從式,由主機控制多機之間的通信,從機和從機之間的通信只能經(jīng)主機才能實現(xiàn)。串口發(fā)送數(shù)據(jù)程序如程序如
47、附錄。</p><p> 4.5從機數(shù)碼管顯示程序設計</p><p> 根據(jù)數(shù)碼管的驅(qū)動方式不同,數(shù)碼管送顯方式有兩種:靜態(tài)送顯和動態(tài)送顯。靜態(tài)顯示驅(qū)動:靜態(tài)驅(qū)動也稱直流驅(qū)動,在靜態(tài)顯示驅(qū)動方式下,數(shù)碼管的共陰極或共陽極共同接地或接電源,每個數(shù)碼管的段選線與8位的單片機并口連接。靜態(tài)顯示驅(qū)動方式占用的單片機I/O端口比較多,一般在實用中不采用。</p><p>
48、; 動態(tài)顯示驅(qū)動:數(shù)碼管動態(tài)顯示方式是將所有的段選線并聯(lián)在一起,由一個8位I/O口來控制,再利用單片機的其他I/O口來作為數(shù)碼管的位選線。當單片機輸出顯示數(shù)字的譯碼時,哪個數(shù)碼管顯示由單片機對位選通電路的控制來選擇,所以將欲顯示的數(shù)碼管的位選通端選通,該數(shù)碼管就會顯示,其它數(shù)碼管均不會亮。通過輪流控制各個數(shù)碼管的選通端使數(shù)碼管輪流顯示。在顯示過程中,每個數(shù)碼管的顯示時間為1-2ms,由于人們的視覺暫留現(xiàn)象及發(fā)光二極管的余暉效應,只要掃
49、描的速度夠快,給人的印象就是同時點亮的,而且不會有閃爍感。</p><p> 本設計中需要2位數(shù)碼管顯示,采用動態(tài)顯示方式。程序如附錄。</p><p><b> 5仿真與性能分析</b></p><p><b> 5.1系統(tǒng)仿真過程</b></p><p> 首先根據(jù)電路原理圖利用Prot
50、ues軟件畫出仿真圖。打開proteus軟件,將所需要用到的元器件添加到左側(cè)的元器件列表DEVICE中。單擊按鈕“P”,即可彈出元器件庫對話框,可以從中選擇元器件。輸入元器件名稱,可以選擇所用元器件,選中后,單擊“OK”即可。選完元器件后,在元器件列表里回顯示出來。按照電路原理圖將仿真圖畫好,如圖5.1所示。</p><p><b> 圖5.1仿真圖</b></p><
51、p><b> 5.2仿真結(jié)果</b></p><p> 運行后,按下主機1號鍵,開始主機與1號從機通信。再按下數(shù)字2,從機數(shù)碼管顯示12。效果如圖5.2,5.3所示。</p><p> 圖5.2主機數(shù)碼顯示</p><p> 圖5.3從機數(shù)碼顯示</p><p><b> 6心得體會</b
52、></p><p> 在本次畢業(yè)設計,我通過基于典型單片機AT89C51的設計和應用,對于單片機工作原理、功能有了宏觀的了解,并對單片機匯編程序的應用有了新的、進一步的認識。</p><p> 在本次設計的過程中,我發(fā)現(xiàn)很多的問題,給我的感覺就是下手很難,很不順手,看似很簡單的電路,要動手把它給設計出來,是很難的一件事,主要原因是我們沒有經(jīng)常動手設計過電路。另外單片機系統(tǒng)的知識似
53、懂非懂,而且很多知識當時弄明白了,現(xiàn)在要用的時候又不記得,造成我用了大量的時間去查閱各種資料和程序命令,因此整個過程時間安排不合理。由于設計的計劃沒有安排好,設計的時間極為倉促,尤其是在硬件調(diào)試的過程中出現(xiàn)了很大的問題。另外資料的查找也是一大難題,這就要求我們在以后的學習中,應該注意到這一點,更重要的是我們要學會把從書本中學到的知識和實際的電路聯(lián)系起來,這不論是對我們以后的就業(yè)還是學習,都會起到很大的促進和幫助。</p>
54、<p> 本文介紹了一種基于單片機的多機通信的設計方法,論文首先介紹了多機通信的應用及研究現(xiàn)狀、串口通信的概念,主要是串口通信的方式和重要的數(shù)據(jù)位說明,接著提出了利用串口通信實現(xiàn)多機通信的可行的設計方案,并從硬件電路設計和軟件程序設計兩個方面詳細介紹了整個設計的原理及設計過程,最后完成了系統(tǒng)的仿真調(diào)試,可成功運行,從而驗證了方案的可行性。</p><p> 當然,本設計還有很多不足之處,功能上還不夠
55、完善,在此基礎(chǔ)上還可以進行系統(tǒng)擴展,以使整個設計的功能更加完善</p><p><b> 參考文獻</b></p><p> [1] 謝沅清,解月珍.電子技術(shù)基礎(chǔ).人民郵電出版社,1999.</p><p> [2] 何立民. 單片機應用技術(shù)選編. 北京航空航天大學出版社,2006.</p><p> [3] 譚
56、浩強.C程序設計(第二版).清華大學出版社,2001.1.</p><p> [4] 張毅剛,彭喜源.MCS-51單片機應用設計.哈爾濱工業(yè)大學出版社,1997.</p><p> [5] 胡漢才.單片機原理及接口技術(shù).清華大學出版社,1996.</p><p> [6] 孫江宏等. Protel 99 電路設計與應用.機械工業(yè)出版社,2001.2.</
57、p><p> [7] 黃亮.基于AT89C51單片機的串口通信程序的設計.電子制作,2006年07期.</p><p> [8] 劉錫東,黃麗民.用C語言實現(xiàn)串口通信技術(shù).山東商業(yè)職業(yè)技術(shù)學院學報,2007年02期.</p><p> [9] 栗小寬,韓東起,李霞.51系列單片機中模擬串行口的C語言實現(xiàn).科技咨詢導報,2007年17期. </p>&
58、lt;p> [10] 禹言春,張麗麗,王賀濤.單片機的多機通信.安徽農(nóng)學通報,2007年09期.</p><p> [11] 郭天祥.新概念51單片機C語言教程:入門、提高、開發(fā)、拓展全攻略.北京:電子工業(yè)出版社,2009</p><p> [12]彭偉.單片機C語言程序設計實訓100例.電子工業(yè)出版社,2011</p><p> [13]杜洋.愛上單
59、片機.人民郵電出版社,2012</p><p> [14]于永.51單片機C語言常用模塊與綜合系統(tǒng)設計.電子工業(yè)出版社,2012</p><p> [15]高衛(wèi)東.51單片機原理與實踐.北京航空航天大學出版社,2011</p><p> [16]潘永雄.新編單片機原理及應用.西安電子科技大學出版社,20</p><p><b>
60、; 附錄1系統(tǒng)原理圖</b></p><p><b> 附錄2程序清單</b></p><p><b> 主機程序:</b></p><p> #include<reg52.h></p><p> #define uchar unsigned char</p&
61、gt;<p> #define uint unsigned int</p><p> sbit LED1=P3^4;</p><p> sbit LED2=P3^5;</p><p> sbit MCU1=P2^2;</p><p> sbit MCU2=P2^3;</p><p> ucha
62、r tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};</p><p> uchar keyscan(void);</p><p> void delayms(uchar t);</p><p> void init_serial(void);</p><
63、p> void SBUFSend(uchar key);</p><p> void senddat(uchar addr,uchar dat);</p><p> void display(uchar addr,uchar dat);</p><p> uchar keyscan()</p><p><b> {&
64、lt;/b></p><p> uchar temp,key;</p><p><b> P1=0xfe;</b></p><p><b> temp=P1;</b></p><p> temp=temp&0xf0;</p><p> if(temp!
65、=0xf0)</p><p><b> {</b></p><p> delayms(10);</p><p> if(temp!=0xf0)</p><p><b> {</b></p><p><b> temp=P1;</b></p
66、><p> switch(temp)</p><p><b> {</b></p><p> case 0xee:key=0;break;</p><p> case 0xde:key=1;break;</p><p> case 0xbe:key=2;break;</p>&
67、lt;p> case 0x7e:key=3;break;</p><p><b> }</b></p><p> while(temp!=0xf0)</p><p><b> {</b></p><p><b> temp=P1;</b></p>
68、<p> temp=temp&0xf0;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> P1=0xfd;</b></p>
69、<p><b> temp=P1;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></p><p> delayms(10);</p><p> i
70、f(temp!=0xf0)</p><p><b> {</b></p><p><b> temp=P1;</b></p><p> switch(temp)</p><p><b> {</b></p><p> case 0xed:key
71、=4;break;</p><p> case 0xdd:key=5;break;</p><p> case 0xbd:key=6;break;</p><p> case 0x7d:key=7;break;</p><p><b> }</b></p><p> while(temp
72、!=0xf0)</p><p><b> {</b></p><p><b> temp=P1;</b></p><p> temp=temp&0xf0;</p><p><b> }</b></p><p><b> }&l
73、t;/b></p><p><b> }</b></p><p><b> P1=0xfb;</b></p><p><b> temp=P1;</b></p><p> temp=temp&0xf0;</p><p> if(t
74、emp!=0xf0)</p><p><b> {</b></p><p> delayms(10);</p><p> if(temp!=0xf0)</p><p><b> {</b></p><p><b> temp=P1;</b>&l
75、t;/p><p> switch(temp)</p><p><b> {</b></p><p> case 0xeb:key=8;break;</p><p> case 0xdb:key=9;break;</p><p> case 0xbb:key=10;break;</p&g
76、t;<p> case 0x7b:key=11;break;</p><p><b> }</b></p><p> while(temp!=0xf0)</p><p><b> {</b></p><p><b> temp=P1;</b></p
77、><p> temp=temp&0xf0;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> P1=0xf7;</b></
78、p><p><b> temp=P1;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></p><p> delayms(10);</p><p&
79、gt; if(temp!=0xf0)</p><p><b> {</b></p><p><b> temp=P1;</b></p><p> switch(temp)</p><p><b> {</b></p><p> case 0x
80、e7:key=12;break;</p><p> case 0xd7:key=13;break;</p><p> case 0xb7:key=14;break;</p><p> case 0x77:key=15;break;</p><p><b> }</b></p><p>
81、while(temp!=0xf0)</p><p><b> {</b></p><p><b> temp=P1;</b></p><p> temp=temp&0xf0;</p><p><b> }</b></p><p><
82、b> }</b></p><p><b> }</b></p><p> return key;</p><p><b> }</b></p><p> void delayms(uchar t)</p><p><b> {
83、</b></p><p> uchar i,j;</p><p> for(i=0;i<t;i++)</p><p> for(j=0;j<110;j++);</p><p><b> }</b></p><p> void init_serial(void)&
84、lt;/p><p><b> {</b></p><p> TMOD=0X20;</p><p><b> TH1=0XFA;</b></p><p><b> TL1=0XFA;</b></p><p> PCON=0X80;</p>
85、<p> SCON=0X50;</p><p><b> TR1=1;</b></p><p><b> ES=1;</b></p><p><b> EA=1;</b></p><p><b> }</b></p>
86、<p> void SBUFSend(uchar key)</p><p><b> {</b></p><p><b> SBUF=key;</b></p><p> while(TI==0);</p><p><b> TI=0;</b></p&g
87、t;<p><b> }</b></p><p> void senddat(uchar addr,uchar dat)</p><p><b> {</b></p><p><b> TB8=1;</b></p><p> SBUFSend(add
88、r);</p><p><b> TB8=0;</b></p><p> SBUFSend(dat);</p><p><b> }</b></p><p> void display(uchar addr,uchar dat)</p><p><b>
89、 {</b></p><p> P0=tab[addr];</p><p><b> LED1=0;</b></p><p><b> LED2=1;</b></p><p> delayms(1);</p><p><b> P0=0x00;
90、</b></p><p> P0=tab[dat];</p><p><b> LED1=1;</b></p><p><b> LED2=0;</b></p><p> delayms(1);</p><p><b> P0=0X00;<
91、;/b></p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> char addr,dat;</p><p> init_serial();</p><p&g
92、t; dat=keyscan();</p><p><b> while(1){</b></p><p> if(MCU1==0)</p><p><b> {</b></p><p><b> addr=1;</b></p><p> da
93、t=keyscan();</p><p> senddat(1,dat);</p><p> display(1,dat);</p><p><b> }</b></p><p> if(MCU2==0)</p><p><b> {</b></p>
94、;<p><b> addr=2;</b></p><p> dat=keyscan();</p><p> senddat(2,dat);</p><p> display(2,dat); </p><p><b> }</b></p><p>&
95、lt;b> } </b></p><p><b> }</b></p><p> void serial_int() interrupt 4</p><p><b> {</b></p><p><b> if(RI==1)</b></p&g
96、t;<p><b> {</b></p><p><b> RI=0;</b></p><p><b> } </b></p><p> else TI=0; </p><p><b> } </b></p>
97、;<p><b> 從機1程序:</b></p><p> #include <reg52.h></p><p> #define uchar unsigned char</p><p> sbit LED1=P2^0;</p><p> sbit LED2=P2^1;</p&g
98、t;<p> uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};</p><p> //---------------------------------</p><p> void SerialInit()</p><p><b> {&l
99、t;/b></p><p> SCON=0xf0; //方式3 允許接收,SM2=1</p><p> PCON=0x00; //串口波特率不加倍</p><p> TMOD=0x20; //定時器1,方式2</p><p> TH1=0xfd; //波特率為9600 </p><p><
100、b> TL1=0xfd;</b></p><p> TR1=1; //啟動定時器</p><p><b> ES=1;</b></p><p><b> EA=1;</b></p><p><b> }</b></p><
101、;p> //-------------------------------</p><p> void SBUFSend(uchar Ch)</p><p><b> {</b></p><p><b> SBUF=Ch;</b></p><p> while(TI==0)</
102、p><p><b> {</b></p><p><b> }</b></p><p><b> TI=0;</b></p><p><b> }</b></p><p> //------------------------
103、--------</p><p> void main()</p><p><b> {</b></p><p> SerialInit();</p><p><b> while(1)</b></p><p><b> {</b></p
104、><p><b> }</b></p><p><b> }</b></p><p> //--------------------------------</p><p> void SerialServer() interrupt 4</p><p><b>
105、; {</b></p><p><b> uchar Ch;</b></p><p><b> if(RI==1)</b></p><p> {uchar i;</p><p><b> RI=0;</b></p><p><
106、;b> Ch=SBUF;</b></p><p> if(RB8==1) </p><p><b> {</b></p><p><b> if(Ch==1)</b></p><p><b> {</b></p><p>&l
107、t;b> SM2=0; </b></p><p> SBUFSend(1);</p><p><b> LED1=0;</b></p><p><b> LED2=1;</b></p><p> for(i=500;i>0;i--)</p>&l
108、t;p> P0=DispCode[Ch];</p><p><b> }</b></p><p><b> else </b></p><p><b> {</b></p><p><b> SM2=1;</b></p>&l
109、t;p><b> }</b></p><p><b> }</b></p><p> if(RB8==0)</p><p> { P0=0x00;</p><p><b> LED1=1;</b></p><p><b>
110、LED2=0;</b></p><p> for(i=500;i>0;i--)</p><p> P0=DispCode[Ch];</p><p><b> SM2=1;</b></p><p><b> }</b></p><p><b&
111、gt; }</b></p><p><b> }</b></p><p><b> 從機2程序:</b></p><p> #include <reg52.h></p><p> #define uchar unsigned char</p><
112、p> sbit LED1=P2^0;</p><p> sbit LED2=P2^1;</p><p> uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};</p><p> //---------------------------------</p&
113、gt;<p> void SerialInit()</p><p><b> {</b></p><p> SCON=0xf0; //方式3 允許接收,SM2=1</p><p> PCON=0x00; //串口波特率不加倍</p><p> TMOD=0x20; //定時器1,方式2<
114、;/p><p> TH1=0xfd; //波特率為9600 </p><p><b> TL1=0xfd;</b></p><p> TR1=1; //啟動定時器</p><p><b> ES=1;</b></p><p><b> EA=1;
115、</b></p><p><b> }</b></p><p> //-------------------------------</p><p> void SBUFSend(uchar Ch)</p><p><b> {</b></p><p>&
116、lt;b> SBUF=Ch;</b></p><p> while(TI==0)</p><p><b> {</b></p><p><b> }</b></p><p><b> TI=0;</b></p><p><
117、;b> }</b></p><p> //--------------------------------</p><p> void main()</p><p><b> {</b></p><p> SerialInit();</p><p><b>
118、 while(1)</b></p><p><b> {</b></p><p><b> }</b></p><p><b> }</b></p><p> //--------------------------------</p><
119、;p> void SerialServer() interrupt 4</p><p><b> {</b></p><p><b> uchar Ch;</b></p><p><b> if(RI==1)</b></p><p> {uchar i;<
120、;/p><p><b> RI=0;</b></p><p><b> Ch=SBUF;</b></p><p> if(RB8==1) </p><p><b> {</b></p><p><b> if(Ch==2)</b&g
121、t;</p><p><b> {</b></p><p><b> SM2=0; </b></p><p> SBUFSend(2);</p><p><b> LED1=0;</b></p><p><b> LED2=1;&l
122、t;/b></p><p> for(i=500;i>0;i--)</p><p> P0=DispCode[Ch];</p><p><b> }</b></p><p><b> else </b></p><p><b> {<
123、/b></p><p><b> SM2=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> if(RB8==0)</p><p> { P0=0x00;</p>&
124、lt;p><b> LED1=1;</b></p><p><b> LED2=0;</b></p><p> for(i=500;i>0;i--)</p><p> P0=DispCode[Ch];</p><p><b> SM2=1;</b><
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機多機通信課程設計
- 51單片機多機通信課程設計
- 單片機單片機課程設計-雙機串行通信
- 單片機單片機課程設計-雙機串行通信e
- pc機與單片機串行通信課程設計
- 課程設計--單片機雙機通信系統(tǒng)
- 單片機雙機通信系統(tǒng)-課程設計
- 雙機通信系統(tǒng)單片機課程設計
- 單片機雙機通信課程設計報告
- 單片機課程設計-- 單片機之間的雙向通信演示
- 單片機串口通信課程設計-- pc和單片機的串行雙工通信
- 單片機課程設計-單片機課程設計---電子時鐘
- 單片機課程設計--單片機串行通訊
- 單片機秒表單片機課程設計
- 單片機課程設計---單片機數(shù)字時鐘
- 單片機課程設計
- 單片機課程設計
- 單片機課程設計
- 單片機課程設計
- 單片機的雙機串口通信-課程設計
評論
0/150
提交評論