一、任務(wù)簡介
實(shí)現(xiàn)單片機(jī)與單片機(jī)之間的串行通訊,要求:
(1)利用RS232串行芯片實(shí)現(xiàn)雙向通訊
(2)傳送的數(shù)據(jù)在數(shù)碼管上顯示出來
(3)可通過鍵盤選擇波特率1200、2400、4800和9600bit/s
(4)串行口工作方式為方式1的全雙工串行通信
二、具體功能
(1)首先要能夠通過鍵盤設(shè)定兩臺單片機(jī)的波特率,最好能將波特率顯示在數(shù)碼管(注意:兩臺單片機(jī)要想成功通信,必須選擇相同的波特率,否則無法正常通信)
(2)發(fā)送端的單片機(jī)選擇數(shù)據(jù)并通過按鍵進(jìn)行發(fā)送,在接收端的單片機(jī)可選擇要不要接受該數(shù)據(jù)(即按不按接收鍵),若接收成功則將數(shù)據(jù)在本機(jī)的數(shù)碼管上顯示出來。
(3)兩臺通信的單片機(jī)選擇的工作方式為全雙工通信方式,即兩臺單片機(jī)都可以選擇接收數(shù)據(jù)與發(fā)送數(shù)據(jù)。
三、實(shí)驗(yàn)設(shè)備及原理圖




四、控制程序設(shè)計(jì)
1、設(shè)計(jì)方案:
采用兩片89C52單片機(jī)來實(shí)現(xiàn)上位機(jī)對上位機(jī)的控制,由于是近距離的雙機(jī)通信,所以選擇接交叉相連的方式,上位機(jī)發(fā)送的數(shù)據(jù)由串行口TXD端發(fā)送,直接由下位機(jī)的串行口數(shù)據(jù)端RXD接收。需要注意的是一定要保證兩臺單片機(jī)以相同的波特率進(jìn)行通信,電路分為數(shù)碼管顯示模塊,指示模塊,以及單片機(jī)工作的基本復(fù)位,晶振模塊,甲機(jī)和乙機(jī)都需要用到1個數(shù)碼管,6個按鍵(2個收發(fā)數(shù)據(jù)按鍵+4個波特率選擇按鍵)
2、流程圖如下:
甲機(jī):


乙機(jī):


程序下載成功后,連接好線(P3.0連接P3.1,P3.1連接P3.0)兩機(jī)都按下S15鍵,選擇波特率4800bit/s,再按下K3鍵發(fā)送,甲機(jī)按下K4鍵接收乙機(jī)發(fā)送的數(shù)字7,并顯示在數(shù)碼管上,如下:(甲機(jī)在上,乙機(jī)在下)

接下來乙機(jī)按S4鍵接收,數(shù)碼管上顯示3

同理,兩機(jī)按下復(fù)位鍵后,再分別按下S14鍵選擇波特率2400bit/s,同時(shí)按下K3和K4,兩邊同時(shí)接收,甲機(jī)顯示6,乙機(jī)顯示2

若所選波特率不同,則兩邊都顯示8

五、調(diào)試分析
(1)波特率設(shè)置調(diào)試
在開始進(jìn)行波特率調(diào)試時(shí),總是不能做到設(shè)置多種波特率,后來是設(shè)置了四個按鍵來對應(yīng)四種不同的波特率,通過檢測按鍵的高低電平來設(shè)置波特率,設(shè)計(jì)波特率的原理就是給不同的按鍵觸發(fā)設(shè)置不同的TH1和TL1初值,這些初值對應(yīng)著不同波特率的值。
(2)數(shù)碼管顯示程序調(diào)試
本次實(shí)驗(yàn)設(shè)計(jì)要把接收到的數(shù)據(jù)顯示在數(shù)碼管上,一開始在設(shè)計(jì)顯示程序時(shí),顯示的數(shù)據(jù)總是顯示不正確,有時(shí)候是亂碼顯示,有時(shí)候是顯示初始數(shù)據(jù)8,有時(shí)候是不能顯示出數(shù)據(jù),經(jīng)過調(diào)試發(fā)現(xiàn)是在循環(huán)掃描數(shù)碼管時(shí)的所設(shè)置的延時(shí)時(shí)間太長,并且自己所寫的字型表也存在一些錯誤,導(dǎo)致數(shù)據(jù)不能夠在數(shù)碼管上正常顯示,所以對數(shù)碼管的掃描以及字型表的正確與否,對于數(shù)碼管顯示正確與否至關(guān)重要。另外在之后的調(diào)試過程中我發(fā)現(xiàn)自己無法將波特率和傳送的數(shù)據(jù)同時(shí)顯示出來,最終便沒有顯示波特率,只是設(shè)置了不同的波特率傳送不同的數(shù)據(jù)。
(3)通信調(diào)試
系統(tǒng)采用的是RS232模塊進(jìn)行通信,在開始進(jìn)行通信調(diào)試時(shí),每次都是在另一端不能正確接收,后來發(fā)現(xiàn)是連線不正確,我連接的時(shí)候?qū)蓚發(fā)送端相連,兩個接收端相連,而正確的連線方法是甲機(jī)的RXD(P3.0)連接乙機(jī)的TXD(P3.1),然后同理甲機(jī)的TXD連接乙機(jī)的RXD。
- 發(fā)送與接收數(shù)據(jù)調(diào)試
在確定數(shù)碼管顯示程序調(diào)試正確后,我發(fā)現(xiàn)進(jìn)行發(fā)送與接收數(shù)據(jù)調(diào)試時(shí)數(shù)碼管顯示出來的數(shù)據(jù)大部分時(shí)候都是不正確的,有時(shí)是上幾次發(fā)送的數(shù)據(jù),有時(shí)候是系統(tǒng)中原有的其他數(shù)據(jù)。出現(xiàn)這些問題的主要原因是程序設(shè)計(jì)不夠規(guī)范致使收發(fā)數(shù)據(jù)不同步,經(jīng)過老師的指導(dǎo),我設(shè)置了兩個按鍵來控制發(fā)送與接收,并調(diào)用了合適的延時(shí)函數(shù),這才使得數(shù)據(jù)接收與發(fā)送基本同步。
(5)調(diào)試心得
通過對程序的不斷調(diào)試,對于串行口通信有了更深的理解,在調(diào)試過程中要想調(diào)試出自己的想要的結(jié)果,必須要了解硬件的設(shè)計(jì)原理和電路原理,否則即使代碼沒有問題,也無法在硬件上調(diào)試成功。還有一點(diǎn)就是在調(diào)試過程中要有耐心,認(rèn)真對待,不要浮躁,心態(tài)一旦消極了,只會事倍功半,簡單的問題也會變得復(fù)雜。
1、首先將MCU程序下載到兩臺89C52單片機(jī)上,兩臺單片機(jī)的代碼一樣,只是在選擇不同波特率時(shí)所傳送的數(shù)據(jù)不一樣,用戶可自行在設(shè)置波特率初值之后修改相應(yīng)的傳送數(shù)據(jù)(本次實(shí)驗(yàn)時(shí)是甲機(jī)傳送1,2,3,4給乙機(jī),乙機(jī)傳送5,6,7,8給甲機(jī))
2、給兩臺主機(jī)設(shè)置波特率,通過矩陣按鍵S13到S16選擇波特率,若選擇的波特率為1200,則按下k13確認(rèn)該波特率;同樣的按下S14,則選擇的波特率為2400;按下S15,波特率為4800;按下S16,波特率為9600,每次選擇波特率時(shí)也傳送了相應(yīng)的數(shù)據(jù)給另一臺機(jī)。另外需注意:要想進(jìn)行正常通信,兩臺單片機(jī)要設(shè)置相同的波特率(按下相同的鍵),否則無法正常傳送數(shù)據(jù)。
3、設(shè)置完波特率之后就可以進(jìn)行兩臺單片機(jī)之間的通信了,按下k3是選擇數(shù)據(jù)并發(fā)送,之后在另一臺機(jī)器上可以選擇是否接收數(shù)據(jù),若需接收數(shù)據(jù)則按下k4,接收數(shù)據(jù)之后數(shù)據(jù)可以在接收方的數(shù)碼管上顯示(甲乙兩機(jī)收發(fā)可以同時(shí)進(jìn)行,即同時(shí)按下K3鍵發(fā)送不同的數(shù)據(jù),同時(shí)按下K4鍵接收,數(shù)碼管上分別顯示收到的數(shù)據(jù))
4、若需要選擇另外一種波特率進(jìn)行通信,則需要按下復(fù)位鍵,然后重新在矩陣鍵盤上選擇波特率,方法如上(若甲乙兩機(jī)選擇不同的波特率,則數(shù)碼管上將亂碼顯示)。
七、實(shí)驗(yàn)小結(jié)
這次課程設(shè)計(jì)主要是實(shí)現(xiàn)單片機(jī)與單片機(jī)之間串行通信,通過本次實(shí)驗(yàn)設(shè)計(jì),我對單片機(jī)之間的串行通信有了更加深刻的理解與體會,對軟件與硬件的配合使用也有了新的了解,同時(shí)也懂得了一些分析電路及調(diào)試程序的方法。在這次程序設(shè)計(jì)過程中我也遇到了很多困難,例如開始時(shí)對題目的理解有偏差,所寫的程序與自己后來買的單片機(jī)也有些地方不適用等。經(jīng)過與同學(xué)的討論、老師的指導(dǎo)、以及自己進(jìn)一步查閱相關(guān)資料,回歸書本,問題才得以解決。雖然最后設(shè)計(jì)并沒有那么理想(比如波特率與傳輸數(shù)據(jù)不能同時(shí)顯示),但總體上來說實(shí)現(xiàn)了單片機(jī)間串行通信,基本上算完成了實(shí)驗(yàn)要求。通過本次設(shè)計(jì)我明白了軟件與硬件相結(jié)合的重要性,二者缺一不可,在實(shí)現(xiàn)硬件連接的同時(shí)也要讀懂軟件所實(shí)現(xiàn)的功能;通過做實(shí)驗(yàn)?zāi)軌蚣由钗覀儗碚撝R的理解,能夠及時(shí)地查漏補(bǔ)缺,實(shí)現(xiàn)了很好地互補(bǔ);同時(shí)我也意識到做實(shí)驗(yàn)時(shí)嚴(yán)謹(jǐn)認(rèn)真的態(tài)度是非常重要的,在不斷地調(diào)試與分析過程中,我們才能真正的意識到自己存在的不足,能夠及時(shí)地改正,學(xué)到更多有用的知識。
八、附錄(源代碼)
當(dāng)波特率是1200,2400,4800,9600時(shí),甲機(jī)分別送乙機(jī)數(shù)據(jù)1,2,3,4
當(dāng)波特率是1200,2400,4800,9600時(shí),乙機(jī)分別送甲機(jī)數(shù)據(jù)5,6,7,8
以下是甲機(jī)源代碼:(乙機(jī)源代碼與甲機(jī)一樣,只需將1,2,3,4改成5,6,7,8)