單片機課程設計

課題:單片機與單片機之間的串行通訊
班級:
學號:
姓名:
指導老師:
目錄一、任務簡介--------------------------------1
二、具體功能--------------------------------1
三、實驗設備及原理圖-------------------1
四、控制程序設計--------------------------3
五、調試分析---------------------------------9 六、用戶使用說明--------------------------11
七、實驗小結--------------------------------12 八、附錄(源代碼)-----------------------13
一、任務簡介 實現單片機與單片機之間的串行通訊,要求: (1)利用RS232串行芯片實現雙向通訊 (2)傳送的數據在數碼管上顯示出來 (3)可通過鍵盤選擇波特率1200、2400、4800和9600bit/s (4)串行口工作方式為方式1的全雙工串行通信 二、具體功能 (1)首先要能夠通過鍵盤設定兩臺單片機的波特率,最好能將波特率顯示在數碼管(注意:兩臺單片機要想成功通信,必須選擇相同的波特率,否則無法正常通信) (2)發送端的單片機選擇數據并通過按鍵進行發送,在接收端的單片機可選擇要不要接受該數據(即按不按接收鍵),若接收成功則將數據在本機的數碼管上顯示出來。 (3)兩臺通信的單片機選擇的工作方式為全雙工通信方式,即兩臺單片機都可以選擇接收數據與發送數據。 三、實驗設備及原理圖 



四、控制程序設計 1、設計方案: 采用兩片89C52單片機來實現上位機對上位機的控制,由于是近距離的雙機通信,所以選擇接交叉相連的方式,上位機發送的數據由串行口TXD端發送,直接由下位機的串行口數據端RXD接收。需要注意的是一定要保證兩臺單片機以相同的波特率進行通信,電路分為數碼管顯示模塊,指示模塊,以及單片機工作的基本復位,晶振模塊,甲機和乙機都需要用到1個數碼管,6個按鍵(2個收發數據按鍵+4個波特率選擇按鍵) 2、流程圖如下: 甲機:  
乙機:  
程序下載成功后,連接好線(P3.0連接P3.1,P3.1連接P3.0)兩機都按下S15鍵,選擇波特率4800bit/s,再按下K3鍵發送,甲機按下K4鍵接收乙機發送的數字7,并顯示在數碼管上,如下:(甲機在上,乙機在下) 
接下來乙機按S4鍵接收,數碼管上顯示3 
同理,兩機按下復位鍵后,再分別按下S14鍵選擇波特率2400bit/s,同時按下K3和K4,兩邊同時接收,甲機顯示6,乙機顯示2 
若所選波特率不同,則兩邊都顯示8 
五、調試分析 (1)波特率設置調試 在開始進行波特率調試時,總是不能做到設置多種波特率,后來是設置了四個按鍵來對應四種不同的波特率,通過檢測按鍵的高低電平來設置波特率,設計波特率的原理就是給不同的按鍵觸發設置不同的TH1和TL1初值,這些初值對應著不同波特率的值。 (2)數碼管顯示程序調試 本次實驗設計要把接收到的數據顯示在數碼管上,一開始在設計顯示程序時,顯示的數據總是顯示不正確,有時候是亂碼顯示,有時候是顯示初始數據8,有時候是不能顯示出數據,經過調試發現是在循環掃描數碼管時的所設置的延時時間太長,并且自己所寫的字型表也存在一些錯誤,導致數據不能夠在數碼管上正常顯示,所以對數碼管的掃描以及字型表的正確與否,對于數碼管顯示正確與否至關重要。另外在之后的調試過程中我發現自己無法將波特率和傳送的數據同時顯示出來,最終便沒有顯示波特率,只是設置了不同的波特率傳送不同的數據。 (3)通信調試 系統采用的是RS232模塊進行通信,在開始進行通信調試時,每次都是在另一端不能正確接收,后來發現是連線不正確,我連接的時候將兩個發送端相連,兩個接收端相連,而正確的連線方法是甲機的RXD(P3.0)連接乙機的TXD(P3.1),然后同理甲機的TXD連接乙機的RXD。 在確定數碼管顯示程序調試正確后,我發現進行發送與接收數據調試時數碼管顯示出來的數據大部分時候都是不正確的,有時是上幾次發送的數據,有時候是系統中原有的其他數據。出現這些問題的主要原因是程序設計不夠規范致使收發數據不同步,經過老師的指導,我設置了兩個按鍵來控制發送與接收,并調用了合適的延時函數,這才使得數據接收與發送基本同步。 (5)調試心得 通過對程序的不斷調試,對于串行口通信有了更深的理解,在調試過程中要想調試出自己的想要的結果,必須要了解硬件的設計原理和電路原理,否則即使代碼沒有問題,也無法在硬件上調試成功。還有一點就是在調試過程中要有耐心,認真對待,不要浮躁,心態一旦消極了,只會事倍功半,簡單的問題也會變得復雜。
1、首先將MCU程序下載到兩臺89C52單片機上,兩臺單片機的代碼一樣,只是在選擇不同波特率時所傳送的數據不一樣,用戶可自行在設置波特率初值之后修改相應的傳送數據(本次實驗時是甲機傳送1,2,3,4給乙機,乙機傳送5,6,7,8給甲機) 2、給兩臺主機設置波特率,通過矩陣按鍵S13到S16選擇波特率,若選擇的波特率為1200,則按下k13確認該波特率;同樣的按下S14,則選擇的波特率為2400;按下S15,波特率為4800;按下S16,波特率為9600,每次選擇波特率時也傳送了相應的數據給另一臺機。另外需注意:要想進行正常通信,兩臺單片機要設置相同的波特率(按下相同的鍵),否則無法正常傳送數據。 3、設置完波特率之后就可以進行兩臺單片機之間的通信了,按下k3是選擇數據并發送,之后在另一臺機器上可以選擇是否接收數據,若需接收數據則按下k4,接收數據之后數據可以在接收方的數碼管上顯示(甲乙兩機收發可以同時進行,即同時按下K3鍵發送不同的數據,同時按下K4鍵接收,數碼管上分別顯示收到的數據) 4、若需要選擇另外一種波特率進行通信,則需要按下復位鍵,然后重新在矩陣鍵盤上選擇波特率,方法如上(若甲乙兩機選擇不同的波特率,則數碼管上將亂碼顯示)。 七、實驗小結 這次課程設計主要是實現單片機與單片機之間串行通信,通過本次實驗設計,我對單片機之間的串行通信有了更加深刻的理解與體會,對軟件與硬件的配合使用也有了新的了解,同時也懂得了一些分析電路及調試程序的方法。在這次程序設計過程中我也遇到了很多困難,例如開始時對題目的理解有偏差,所寫的程序與自己后來買的單片機也有些地方不適用等。經過與同學的討論、老師的指導、以及自己進一步查閱相關資料,回歸書本,問題才得以解決。雖然最后設計并沒有那么理想(比如波特率與傳輸數據不能同時顯示),但總體上來說實現了單片機間串行通信,基本上算完成了實驗要求。通過本次設計我明白了軟件與硬件相結合的重要性,二者缺一不可,在實現硬件連接的同時也要讀懂軟件所實現的功能;通過做實驗能夠加深我們對理論知識的理解,能夠及時地查漏補缺,實現了很好地互補;同時我也意識到做實驗時嚴謹認真的態度是非常重要的,在不斷地調試與分析過程中,我們才能真正的意識到自己存在的不足,能夠及時地改正,學到更多有用的知識。
八、附錄(源代碼) 當波特率是1200,2400,4800,9600時,甲機分別送乙機數據1,2,3,4 當波特率是1200,2400,4800,9600時,乙機分別送甲機數據5,6,7,8 以下是甲機源代碼:(乙機源代碼與甲機一樣,只需將1,2,3,4改成5,6,7,8)
- ORG 0000H
- LJMP MAIN
- ORG 0023H ;串行口中斷入口地址
- LJMP Seri_INT
- MAIN:MOV SP,#0EFH ;堆棧初始化
- MOV TMOD,#20H ;定時器T1方式2
- MOV SCON,#50H ;串口初始化方式1多機通信
- MOV R0,#30H ;發送數據區首址
- MOV R1,#40H ;接收數據區首址
- LCALL Switch ;選擇波特率
- SETB EA ;開總中斷控制位
- SETB TR1 ;啟動T1
- SETB ES ;允許串口中斷
-
- Seri_INT:
- LCALL DLY
- JNB P3.2,FSSSS1 ;K3按鍵發送
- SJMP Seri_INT
-
- FSSSS1:
- LCALL DLY ;延時20ms
- LCALL SEND ;調用發送子程序
-
- ACCCN2:
- LCALL DLY
- JNB P3.3,FSSSS2 ;K4按鍵接收
- SJMP ACCCN2
-
- FSSSS2:
- LCALL DLY
- LCALL RECE ;調用接收子程序
- INC R0 ;修改發送數據指針
- INC R1 ;修改接收數據指針
- LCALL Display ;將接收到的數據顯示出來
-
- SEND:
- MOV A,@R0 ;進入串口中斷
- MOV C,P ;C為進位標志位,P為奇偶標志位,把P中的內容傳輸給C
- MOV SBUF,A ;發送數據到緩沖區
- CLR TI ;發送中斷標志清零
- RET
-
-
- RECE:
- CLR RI ;接收中中斷標志清0
- MOV A,SBUF ;讀出接收緩沖區內容
- MOV @R1,A ;讀入接收緩沖區內容
- RET
-
-
- DELAY2ms: ;延時2ms
- MOV R6,#62
- DEL1: MOV R7,#8
- DEL2: NOP ; 晶振頻率12MHz,則執行一次所需時間為1微秒
- NOP ; 1微秒
- DJNZ R7,DEL2 ; 2微秒
- DJNZ R6,DEL1 ; 2微秒[(1+1+2)*62+2]*80=2ms
- RET
-
- DLY: ;延時20ms
- MOV R6,#62
- DLY3: MOV R7,#80
- DLY4: NOP ; 晶振頻率12MHz,則執行一次所需時間為1微秒
- NOP ; 1微秒
- DJNZ R7,DLY4 ; 2微秒
- DJNZ R6,DLY3 ; 2微秒[(1+1+2)*62+2]*80=20ms
- RET
-
-
- Display:
- MOV DPTR,#TAB ;字型表首址
- CLR P2.2
- CLR P2.3
- CLR P2.4 ;使傳送的數據在第0位數碼管顯示
- MOV A,40H
- MOVC A,@A+DPTR ;查字型表
- MOV P0,A ;將傳送的數據送到P0口顯示
- LCALL DELAY2mS
- SJMP Display
-
- Switch: ;選擇波特率
- LCALL DLY
- MOV P1,#0EFH ;選擇按鍵S13到S16,屏蔽S1到S12
- MOV R3,P1
- CJNE R3,#0EFH,CON1 ;判斷按下的鍵
- SJMP Switch
-
- CON1: CJNE R3,#0E7H,CON2 ;S13選擇波特率1200
- MOV TH1,#0E8H ;賦初值232
- MOV TL1,#0E8H
- MOV 30H,#1 ;當波特率是1200時,甲機發送數據1
- RET
-
- CON2: CJNE R3,#0EBH,CON3 ;S14選擇波特率2400
- MOV TH1,#0F4H ;初值244
- MOV TL1,#0F4H
- MOV 30H,#2 ;當波特率是2400時,甲機發送數據2
- RET
-
- CON3: CJNE R3,#0EDH,CON4 ;S15選擇波特率4800
- MOV TH1,#0FAH ;初值250
- MOV TL1,#0FAH
- MOV 30H,#3 ;當波特率是4800時,甲機發送數據3
- RET
-
- CON4: CJNE R3,#0EEH,CON5 ;S16選擇波特率9600
- MOV TH1,#0FDH ;初值253
- MOV TL1,#0FDH
- MOV 30H,#4 ;當波特率是9600時,甲機發送數據4
- CON5: RET
-
- TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0到f的字型表
- DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
- END
復制代碼
完整的Word格式文檔51黑下載地址:
單片機與單片機之間的串行通訊.doc
(1002.43 KB, 下載次數: 26)
2018-6-20 05:32 上傳
點擊文件名下載附件
|