———————————————————————————————————————————— 實驗7.4:RS232串口應用實例 設計要求: 通過串口發送接收數據(串口工作方式1) 實現思路: 定時器設置 串口設置 工作方式 波特率 開啟定時/計數器 串口執行 接收數據 發送數據 串口設置 工作方式 波 ...
————————————————————————————————————————————
實驗7.4:RS232串口應用實例
設計要求:
通過串口發送接收數據(串口工作方式1)
實現思路:
- 定時器設置
-
串口設置
- 工作方式
- 波特率
- 開啟定時/計數器
-
串口執行
- 接收數據
- 發送數據
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
實現代碼:
1 #include <reg51.h> 2 main() 3 { 4 TMOD = 0x20; 5 SM0 = 0; 6 SM1 = 1; 7 REN = 1; 8 PCON = 0; 9 TH1 = 0xFD; //253=256-(1*11.0592*10^6)/(384*9600) 10 TL1 = 0xFD; 11 TR1 = 1; 12 P1 = SBUF; 13 while(!RI); 14 RI = 0; 15 SBUF = P1; 16 while(!TI); 17 TI = 0; 18 }
————————————————————————————————————————————
實驗7.5:MAX487多機通信應用實例
設計要求:
在主從3個單片機中進行雙機通信,當從機顯示的數字和主機相同,則表示該主機和從機正在通信。按下主機按鍵切換當前對象。
實現思路:
-
主機端
在主機中設置定時器和串口參數,並一直保持發送數據的狀態。
通過MAX487晶元將3個單片機連接,並通過設置/RE、DE管腳控制單片機輸入輸出狀態。
需要按下主機按鍵時檢測按鍵狀態,切換當前對象,設置中斷,並標記此時狀態是從機1或從機2。
//中斷發生時按照中斷優先順序,主機先執行cort++併發送信息,主機中斷結束後才進入從機中斷。
如果是從機1,輸出狀態下發送對應數字,輸入狀態下設置單片機通信(非多機通信)接收並顯示對應數字,重置輸出狀態。從機2同理。
-
從機端
設置與主機相同的串口參數和定時器和預設顯示值。允許接收中斷
當按鍵被按下,判斷主機要通信的是否是自己,是則顯示對應數字並向主機發送數字,否則重置狀態。
執行流程:(多機通信模式)
- 主機
- 從機
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
實現代碼:SM2=1,多機通信模式!
-
主機
1 #include <reg51.h> 2 #include <intrins.h> 3 unsigned char cort = 0; 4 sbit P3_5 = P3 ^ 5; 5 key_serial() interrupt 0 using 1 6 { 7 ++cort; 8 if (cort == 3) 9 cort = 1; 10 } 11 void main() 12 { 13 P2 = 0xff; 14 TMOD = 0x20; 15 TH1 = 0xFD; 16 TL1 = 0xFD; 17 PCON = 0x00; 18 TR1 = 1; 19 SCON = 0xF8; 20 EA = 1; 21 EX0 = 1; 22 IT0 = 1; 23 P3_5 = 1; 24 while(1) 25 { 26 if (cort == 1) 27 { 28 SBUF = 0x01; 29 while(TI != 1); 30 TI = 0; 31 P3_5 = 0; 32 RB8 = 1; 33 while(RI != 1); 34 RI = 0; 35 P2 = SBUF; 36 P3_5 = 1; 37 } 38 if(cort == 2) 39 { 40 SBUF = 0x02; 41 while(TI != 1); 42 TI = 0; 43 P3_5 = 0; 44 RB8 = 1; 45 while(RI != 1); 46 RI = 0; 47 P2 = SBUF; 48 SM2 = 1; 49 P3_5 = 1; 50 } 51 52 } 53 }
-
從機1
1 #include <reg51.h> 2 #include <intrins.h> 3 sbit P3_5 = P3 ^ 5; 4 void serial(void) interrupt 4 using 1 5 { 6 ES = 0; 7 RI = 0; 8 if (SBUF == 0x01) 9 { 10 P3_5 = 1; 11 RI = 0; 12 TB8 = 1; 13 P1 = 0x10; 14 SBUF = 0x10; 15 while(!TI); 16 TI = 0; 17 } 18 else P1 = 0; 19 P3_5 = 0; 20 ES = 1; 21 } 22 void main() 23 { 24 P1 = 0x00; 25 TMOD = 0x20; 26 TH1 = 0xFD; 27 TL1 = 0xFD; 28 PCON = 0x00; 29 TR1 = 1; 30 SCON = 0xF0; 31 EA = 1; 32 ES = 1; 33 P3_5 = 0; 34 while(1) 35 _nop_(); 36 }
-
從機2
1 #include <reg51.h> 2 #include <intrins.h> 3 sbit P3_5 = P3 ^ 5; 4 void serial() interrupt 4 using 1 5 { 6 ES = 0; 7 RI = 0; 8 if (SBUF == 0x02) 9 { 10 P3_5 = 1; 11 RI = 0; 12 TB8 = 1; 13 P1 = 0x20; 14 SBUF = 0x20; 15 while(!TI); 16 TI = 0; 17 } 18 else P1 = 0; 19 P3_5 = 0; 20 ES = 1; 21 } 22 void main() 23 { 24 P1 = 0x00; 25 TMOD = 0x20; 26 TH1 = 0xFD; 27 TL1 = 0xFD; 28 PCON = 0x00; 29 TR1 = 1; 30 SCON = 0xF0; 31 EA = 1; 32 ES = 1; 33 P3_5 = 0; 34 while(1) 35 _nop_(); 36 }
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
實現代碼:SM2=0,單機通信模式!
-
主機
1 #include <reg52.h> 2 unsigned char cort = 0; 3 sbit P3_5 = P3 ^ 5; 4 void key_serial() interrupt 0 using 1 5 { 6 ++cort; 7 } 8 void main() 9 { 10 P2 = 0x0f; 11 TMOD = 0x20; 12 TH1 = 0xFD; 13 TL1 = 0xFD; 14 PCON = 0x00; 15 TR1 = 1; 16 SCON = 0xD0; 17 EA = 1; 18 EX0 = 1; 19 IT0 = 1; 20 P3_5 = 1; 21 while(1) 22 { 23 if (cort == 1) 24 { 25 SBUF = 0x01; 26 while(!TI); 27 TI = 0; 28 P3_5 = 0; 29 while(!RI); 30 RI = 0; 31 P2 = SBUF; 32 P3_5 = 1; 33 } 34 if(cort == 2) 35 { 36 SBUF = 0x02; 37 while(!TI); 38 TI = 0; 39 P3_5 = 0; 40 while(!RI); 41 RI = 0; 42 P2 = SBUF; 43 P3_5 = 1; 44 } 45 if (cort == 3) 46 cort = 1; 47 } 48 }
-
從機1
1 #include <reg51.h> 2 #include <intrins.h> 3 sbit P3_5 = P3 ^ 5; 4 void serial(void) interrupt 4 using 1 5 { 6 ES = 0; 7 RI = 0; 8 P2 = SBUF; 9 if (SBUF == 0x01) 10 { 11 P3_5 = 1; 12 P1 = 0x10; 13 SBUF = 0x30; 14 while(!TI); 15 TI = 0; 16 } 17 else P1 = 0; 18 P3_5 = 0; 19 ES = 1; 20 } 21 void main() 22 { 23 P1 = 0x00; 24 TMOD = 0x20; 25 TH1 = 0xFD; 26 TL1 = 0xFD; 27 PCON = 0x00; 28 TR1 = 1; 29 SCON = 0xD0; 30 EA = 1; 31 ES = 1; 32 P3_5 = 0; 33 while(1) 34 _nop_(); 35 }
- 從機2:略
————————————————————————————————————————————
關於該實驗在多機通信和單機通信下不同情況的討論
-
在單機通信模式下,SM2 == 0,
初始化:SCON = D0;
發送完畢:TI=0;
接收完畢:RI=0;
中斷觸發條件:RI=0且SM2=0,RI置位
此情況下,發送和接收信息結束後需要對RI和TI手動置為0即可。
-
在多機通信模式下,SM2在0和1之間調整
初始化:主機:SCON = F8;從機:SCON = F0;
中斷觸發條件:接收到的第九位RB9==1,RI置位(如果RB8=0,RI就會等於0,就不能進入接收中斷,自然丟失信息了。)
-
51單片機原理及應用(陳海宴)書P129案例是在主機發送狀態下使用多機通信,接收狀態下使用單機通信,在理解上容易出現錯誤,過程分析及代碼如下:
實現代碼:
-
主機:
1 #include <reg51.h> 2 #include <intrins.h> 3 unsigned char cort = 0; 4 sbit P3_5 = P3 ^ 5; 5 key_serial() interrupt 0 using 1 6 { 7 ++cort; 8 } 9 void main() 10 { 11 P2 = 0xff; 12 TMOD = 0x20; 13 TH1 = 0xFD; 14 TL1 = 0xFD; 15 PCON = 0x00; 16 TR1 = 1; 17 SCON = 0xF8; 18 EA = 1; 19 EX0 = 1; 20 IT0 = 1; 21 P3_5 = 1; 22 while(1) 23 { 24 if (cort == 1) 25 { 26 SBUF = 0x01; 27 while(TI != 1); 28 TI = 0; 29 P3_5 = 0; 30 SM2 = 0; 31 while(RI != 1); 32 RI = 0; 33 P2 = SBUF; 34 SM2 = 1; 35 P3_5 = 1; 36 } 37 if(cort == 2) 38 { 39 SBUF = 0x02; 40 while(TI != 1); 41 TI = 0; 42 P3_5 = 0; 43 SM2 = 0; 44 while(RI != 1); 45 RI = 0; 46 P2 = SBUF; 47 SM2 = 1; 48 P3_5 = 1; 49 } 50 if (cort == 3) 51 cort = 1; 52 SM2 = 1; 53 } 54 }
-
從機1:
1 #include <reg51.h> 2 #include <intrins.h> 3 sbit P3_5 = P3 ^ 5; 4 void serial(void) interrupt 4 using 1 5 { 6 ES = 0; 7 RI = 0; 8 if (SBUF == 0x01) 9 { 10 P3_5 = 1; 11 SM2 = 0; 12 P1 = 0x10; 13 SBUF = 0x10; 14 while(!TI); 15 TI = 0; 16 } 17 else P1 = 0; 18 SM2 = 1; 19 P3_5 = 0; 20 ES = 1; 21 } 22 void main() 23 { 24 P1 = 0x00; 25 TMOD = 0x20; 26 TH1 = 0xFD; 27 TL1 = 0xFD; 28 PCON = 0x00; 29 TR1 = 1; 30 SCON = 0xF0; 31 EA = 1; 32 ES = 1; 33 P3_5 = 0; 34 while(1) 35 _nop_(); 36 }
- 從機2:略
-
主機: