1. 實習目的與要求
1.1 實習目的通過本次實習的實施,增進對單片機的感性認識,加深對單片機理論方面的理解,掌握單片機的內部功能模塊的應用,如定時器/計數器、中斷、片內外存貯器、I/O口、串行口通訊等,了解和掌握單片機應用系統的軟硬件設計過程、方法及實現,為以后設計和實現單片機應用系統打下良好基礎。通過簡單課題的設計練習,以此達到鞏固、充實和綜合運用所學知識解決實際問題的目的。
1.2 實習要求結合課題體系的實際需求及學生的實踐能力、實驗條件,進行實習。學生具體應該完成以下內容:
(1)繪制系統原理圖;
(2)編制軟件框圖;
(3)完成詳細完整的程序清單和注釋;
(4)寫出設計小結,對在完成以上文件過程中所進行的有關步驟、設計思想、指標論證、方案確定、元器件選擇、原理分析等作出說明,并對所完成的設計作出評價,對自己整個設計工作中經驗教訓,總結收獲和今后的研修方向。
1.3 設計課題選題及任務要求
1.3.1 設計課題選題 主從式串行通信
1.3.2 任務要求 1、從機采集電壓(多個從機),主機顯示;
2、主機可以設置從機的工作狀態;
3、主機輪流顯示從機電壓。
2.系統設計2.1 系統電路結構
圖1系統的總體方案
簡單介紹該系統的功能:
1、主機通過獨立按鍵來控制從機的兩種工作模式:自動采集模式和手動采集模式。
2、當從機處于自動模式的時候,主機會循環發送指令,并且可以通過矩陣鍵盤來修改發送指令的間隔時間,從機收到指令后會返回電壓數據。主機將得到的電壓數據輪流顯示在液晶屏幕上。
3、當從機處于手動模式的時候,主機通過矩陣鍵盤來控制當前你想得到那個從機的電壓數據,按下鍵盤之后,主機就會給相應的從機發指令,從而得到從機的電壓數據,并且顯示在液晶上面。
2.2 具體功能模塊電路設計2.2.1 單片機最小系統的設計本系統共用三塊單片機,每塊單片機均選用AT89C51,最小系統也都一樣。
1、選用AT89C51的引腳功能
XTAL1:單芯片系統時鐘的反向放大器輸入端。
XTAL2:系統時鐘的反向放大器輸出端,一般在設計上只要在XTAL1和XTAL2上接上一只石英震蕩晶體系統就可以工作了,此外可以在兩引腳與地之間加入33PF的小電容,可以使系統更穩定,避免噪音干擾而死機。
RST:重置引腳,高電平工作,當要對晶體重置時,只要對此引腳電平提升至高電平并保持兩個及其以上周期的時間便能完成系統重置的各項工作,使得內部特殊功能寄存器內容均被設成已知狀態。
2、時鐘電路
時鐘電路用于產生單片機工作所需要的時鐘信號,單片機本身就是一個復雜的同步時序電路,為了保證同步工作方式的實現,電路應在唯一的時鐘信號控制下嚴格地按時序進行工作。在AT89C51芯片內部有一個高增益反相放大器,其輸入端為芯片引腳XTAL1,輸出端為引腳XTAL2,在芯片的外部跨接晶體振蕩器和微調電容,形成反饋電路,就構成了一個穩定的自激振蕩器。
由于三塊單片機的主要任務是通信,為了得到準確的波特率,采用振蕩頻率為12MHz的晶振,再接兩個33pF的瓷片電容即可構成單片機的時鐘電路。
3、復位電路
復位電路的原理是單片機RST引腳接收到2US以上的電平信號,只要保證電容的充放電時間大于2US,即可實現復位。當按下按鍵時,就能完成整個系統的復位,使得程序重新運行。
單片機最小系統電路如下:
圖2單片機最小系統電路
2.2.2 液晶顯示電路設計LM016L:
引腳 符號 功能說明
1 VSS 一般接地
2 VDD 接電源(+5V)
3 VEE 液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會產生“鬼影”,使用時可以通過一個10K的電位器調整對比度)。
4 RS RS為寄存器選擇,高電平時選擇數據寄存器,低電平時選擇指令寄存器。
5 R/W R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。
6 E E(或EN)端為使能(enable)端,下降沿使能。
7 DB0 底4位三態、雙向數據總線0位(最低位)
8 DB1 底4位三態、雙向數據總線1位
9 DB2 底4位三態、雙向數據總線2位
10 DB3 底4位三態、雙向數據總線3位
11 DB4 高4位三態、雙向數據總線4位
12 DB5 高4位三態、雙向數據總線5位
13 DB6 高4位三態、雙向數據總線6位
14 DB7 高4位三態、雙向數據總線 7位(最高位)
圖3液晶LM016L顯示電路
電路接口說明:
AT89C51的P0口作為數據的輸出端,P2.5和P2.6,P2.7作為控制信號的輸出端。
2.2.3 矩陣鍵盤電路設計圖4矩陣鍵盤電路
主機P1口接4×4的矩陣鍵盤,共16個按鍵,分別為0~15鍵。P1.0~P1.3接矩陣鍵盤的行,P1.4~P1.7接矩陣鍵盤的列。
2.2.4 獨立按鍵電路設計圖5獨立按鍵電路
獨立按鍵由兩個按鍵分別接P2.0和P2.1口,另一端接地,通過按下時的低電平信號來控制從機的工作狀態。
2.2.5 AD轉換器模塊圖6 AD轉換器電路
芯片接口說明:
· CS_ 片選使能,低電平芯片使能。
· CH0 模擬輸入通道0,或作為IN+/-使用。
· CH1 模擬輸入通道1,或作為IN+/-使用。
· GND 芯片參考零電位(地)。
· DI 數據信號輸入,選擇通道控制。
· DO 數據信號輸出,轉換數據輸出。
· CLK 芯片時鐘輸入。
· Vcc/REF 電源輸入及參考電壓輸入(復用)
ADC0832的工作原理:
正常情況下ADC0832 與單片機的接口應為4條數據線,分別是CS、CLK、DO、DI。但由于DO端與DI端在通信時并未同時使用并與單片機的接口是雙向的,所以在I/O口資源緊張時可以將DO和DI并聯在一根數據線上使用。當ADC0832未工作時其CS輸入端應為高電平,此時芯片禁用,CLK 和DO/DI 的電平可任意。當要進行A/D轉換時,須先將CS使能端置于低電平并且保持低電平直到轉換完全結束。此時芯片開始轉換工作,同時由處理器向芯片時鐘(CLK)輸入端輸入時鐘脈沖,DO/DI端則使用DI端輸入通道功能選擇的數據信號。在第一個時鐘脈沖的下沉之前DI端必須是高電平,表示啟始信號。在第二、三個脈沖下沉之前DI端應輸入兩位數據用于選擇通道功能。
2.3 小結本文在研究單片機系統的基礎上,設計了一種基于單片機AT89C51 的多機通信系統。目前有三個單片機,其中一個被設置成了主機,其他兩塊單片機為從機。主機通過串口向從機發送指定格式的數據,從機收到數據并作出響應,主機通過液晶屏顯示通信信息,顯示從第幾個從機接收到的電壓數據。在此多機通信系統中,各個從機具有平等的機會握手。握手成功主機開始向從機發送數據,并在液晶上顯示,通過獨立按鍵控制從機是自動輪流采集電壓數據,還是再通過矩陣鍵盤手動獲取從機的電壓數據。只要主機單片機發送的地址也從機的地址相同時,從機才能跟主機進行握手否者就處于監聽狀態,此通信系統就為主從式多機通信系統。任何時刻,只要主機發送的地址信息可以與指定從機握手成功,其他各從機都是處于監聽狀態,主機與指定從機進行通訊。系統采用一臺主機和多臺從機,主機的RXD端與所有從機的TXD端連接,TXD端與所有從機的RXD端相連,主機發送的信息可被各從機接收,而各從機發送的信息只能由主機接收,各從機之間交換信息需通過主機。
3. 程序設計
3.1 程序結構本系統軟件程序部分包括通信模塊、鍵盤模塊、液晶顯示模塊、中斷服務和定時器等。3塊單片機的程序均用C語言編寫,采用Keil uVision5作為調試工具。
主機的程序流程圖如下:
圖7主機單片機程序流程圖
鍵盤模塊包括矩陣鍵盤按鍵掃描、獲取鍵值與按鍵處理。按鍵處理是根據鍵值進行散轉,又有多個函數用來實現不同的功能。通信子程序包括主機模式通信與從機模式通信。初始化模塊包括定時器、串口、發送數據區與LCD初始化。其外還有LCD顯示模塊。
A、B從機單片機程序流程圖如下:
圖8 從機單片機程序流程圖
3.2 具體功能程序設計
3.2.1 鍵盤程序設計主機的按鍵采用矩陣形式,4×4的行列矩陣,共16個按鍵,可以完成多種控制功能。獨立鍵盤分為兩個獨立的按鍵用來控制從機的自動采集和手動采集模式。鍵盤程序包括:按鍵掃描、獲取鍵值與按鍵處理幾部分。按鍵處理又包括實現各種功能的函數。由鍵盤程序負責調度。鍵盤控制流程如下:
圖9 按鍵控制流程圖
矩陣鍵盤工作原理:由于按鍵沒有接地,4行4列正好占用8個I/O如果4行我們送 P1.0到P1.3送入0 1 1 1 然后去讀取 4列的值,如果P3.0的按鍵按下那么P1.4---P1.7的值等于 0 1 1 1,假如是第2個鍵按下的話那么讀回來的值是 1 0 1 1 ,如果第3個鍵按下去讀回來的值是 1 1 0 1 ,如果第4個鍵按下去讀回來的值是 1 1 1 0,如果沒有鍵按下去讀回來就是1 1 1 1所以我們就根據讀回來的值來判斷按下去的是那個鍵。當然這是對P1.0這一行,因為矩陣鍵盤是掃描的,所以下次把P1.0 給P3.1 給0對第2行,陸續的第3 行第4行, 0111 1011 1101 1110而每次都去從新掃描一遍列值列有4個值,以確定是哪個鍵按下。無論何時任何一個時間有一個按鍵被按下就跳出循環。當然不可能有2個鍵剛好一起按下你的手沒有這么好的力度,就算有2個鍵一起按鍵,程序也有先后檢測的順序,只能檢測一個后面的檢測不到。
獨立按鍵工作原理:主機的P2.0口和P2.1口分別接控制手動和自動采集模式的獨立按鍵,當按下手動按鍵,主機執行sendData(1)函數,功能為當再次按下矩陣鍵盤上value值為1的按鍵時,主機發送指令給從機A執行一次發送采集的電壓數據給主機并在lcd液晶屏上顯示,從機B同理。當按下自動按鍵,主機執行sendData(2)函數,功能為每隔一段時間主機發送指令給從機A執行一次發送采集的電壓數據給主機并在lcd液晶屏上顯示,時間間隔可由矩陣鍵盤14,15按鍵控制,每按下14按鍵一次,顯示數據的間隔時間減少0.5秒,每按下15按鍵一次,顯示數據的間隔時間增加0.5秒,默認間隔時間為1秒,下限為0.5秒,上限為99秒。
3.2.2 系統初始化程序設計系統初始化程序包括定時器初始化、串口初始化、發送數據初始化和全局變量初始化。初始化步驟如下:
圖10系統初始化步驟
定時器初始化使定時器一工作在方式二,波特率設置為4800b/s,并開中斷。串口初始化使串口工作在方式1,8位數據位。發送數據初始化在發送數據區存放待發送的數據串,以發送完成信號作為發送結束標志。全局變量初始化只需根據需要設置即可。
3.2.3 主從機通信協議設計通信協議的設計是本課題的重點難點,本題通信協議主要是區別主機和從機。 經查找資料,實現此多機通信的功能的方式是通過單片內硬件實現,下面對這種方式進行簡單的介紹
多機通信協議:
由于串口的方式2、3發送和接收都是11位其第九為可編程置位可以此作為區分地址幀與數據幀從而實現主機與從機,從機與從機的區別。通信協議同樣要規定相同通信速率,編寫如下的通信協議:
1、數據傳輸的雙方均使用4800b/s的速率傳送數據,使用主從式通信,從機發送數據,,雙方在發送數據時使用查詢方式。主機接受數據使用中斷接收。
2、雙機開始數據傳輸時,從機發送地址幀呼叫主機。
3、各從機開始都處于發送地址幀狀態。發送地址幀后,主機將接收到的地址內容和本機地址比較,如果地址相同,則向從機返回本機地址作為確認信息,并開始接收數據;如果不同,則繼續等待。
4、主機在接收地址幀后等待,如果接收到的應答信息中的內容和所發地址幀的內容相同,就開始接收數據,如果不一致,從機將繼續發送地址幀。如多次應答仍無回應則認為出錯則主機跳出本次通信。
需要說明的是,從機通過ADC0832采集滑動變阻器的電壓,經由AD轉換后將8位電壓數據發送到從機,從機在接收到主機的請求指令之后,將采集到的電壓數據發送給主機,主機控制lcd液晶顯示屏顯示電壓數據。
3.3 小結在為時一周的軟件設計過程中,通過查閱資料和詢問老師同學,我們組的兩個人設計了這個主從式串行通信程序。下面總結一下本程序的核心思想。首先,本程序分為三個主要的部分,一是獨立鍵盤和矩陣鍵盤的控制程序,這部分程序主要由主機來實現,按鍵用來控制整個系統的運行狀態和模式。矩陣鍵盤中只用到了其中4個按鍵,其他按鍵可用于系統的拓展,比如通過RXD、TXD串口連接多個從機,同樣可以用矩陣鍵盤來控制多個從機;二是系統中各部分的初始化程序,比如定時器初始化,串口初始化,發送接收數據初始化,lcd液晶顯示屏初始化等;三是主從機通信協議的程序,這部分是主從機實現通信的關鍵所在,從機通過響應主機發送的指令來采集電壓數據,并返回數據給主機。指令的確認成功即為主從機握手成功,即主從機實現通信。在整個設計過程中雖然遇到了各種問題,比如,主機的按鍵在不加消抖延遲程序的條件下很難響應按鍵按下的操作;lcd顯示屏在沒有清屏的操作下,有時候會出現顯示錯的情況;不過通過不斷的修改和調試,最終把整個程序調試完成,做到了基本實現課題要求。
4. 系統運行或調試 采用Proteus Version 7.8作為運行和調試工具,過程如下:
1、開始仿真,從機默認狀態為手動模式,由于未手動按下對應從機的控制矩陣鍵盤,主機未發送指令給從機,所以顯示的電壓為0.00V。
圖11
2、當按下按鍵1(已設置按鍵1控制從機A),顯示屏顯示從機A采集的電壓數據。
圖12
3、當按下按鍵2(已設置按鍵2控制從機B),顯示屏顯示從機B采集的電壓數據。
圖13
4、這時改變滑動變阻器阻值,顯示屏上的電壓數據并沒有改變。
5、當再次按下按鍵1或2,顯示屏顯示從機的實時電壓數據。
圖14
6、按下自動模式按鍵,顯示屏上的“STOP”變為“START”, 從機切換到自動采集電壓模式。定時時間初始值為1.0s,顯示屏輪流顯示兩從機采集的電壓,每個從機采集的電壓數據每隔1.0s顯示。
圖15
7、按下按鍵14或者15(按鍵14已設置為將定時時間“-0.5”s,按鍵15已設置為將定時時間“+0.5”s),下圖為按下三次15鍵的結果,定時時間由“1.0s”變為“2.5s”。
圖16
8、改變滑動變阻器的阻值,顯示屏上的電壓數據隨之改變,即顯示屏顯示從機采集的實時電壓數據。

圖 17
5. 總結兩周的單片機課程設計終于順利完成了,其中包含著快樂,也有辛酸。我們組選的設計題目是“主從式串行通信”,大家都覺得這個題目是比較簡單的。其實不然,做了之后,發現設計電路雖然簡單,但我認為它真正困難的地方是程序設計,不過在我們同心努力下最終完成了。
關于這次單片機實習,我花費了比較多的心思,既是對課程理論內容的一次復習和鞏固,還讓我豐富了更多與該專業相關的其他知識,比如軟件應用等,在摸索中學習,在摸索中成長,在學習的過程中帶著問題去學我發現效率很高,這是我做這次單片機課題設計的又一收獲,在真正設計之前我們做了相當豐富的準備,首先鞏固一下課程理論,再一遍熟悉課程知識的構架,然后結合加以理論分析、總結,有了一個清晰的思路和一個完整的的軟件流程圖之后才著手設計。在設計程序時,我們不能妄想一次就將整個程序設計好,反復修改、不斷改進是程序設計的必經之路;養成注釋程序的好習慣是非常必要的,一個程序的完美與否不僅僅是實現功能,而應該讓人一看就能明白你的思路,這樣也能為資料的保存和交流提供了方便;我覺得在設計課題過程中遇到問題是很正常,但我們應該將每次遇到的問題記錄下來,并分析清楚,以免下次再碰到同樣的問題的設計又出錯了。
在完成單片機課程設計后,我們發現我們還有許多不足,所學到的知識還遠遠不夠,以至于還有一些功能不能被動完成。如:矩陣鍵盤的工作原理和掃描程序,主從機通信協議采用什么樣的標準比較合適等;經過查找相關資料和科技文獻,和51黑電子論壇的同學們交流,一步步解決所遇到的困難。但是在解決這些問題的過程無疑是對自己自身專業素質的一種提高,同時也加深自己對專業技術的認識。通過單片機實習這一次的實踐,增強了我們的動手能力,提高和鞏固了單片機方面的知識,特別是軟件方面。從中也增強了我的團隊合作精神,并讓我認識到把理論應用到實踐中去是多么重要。