實驗7.4:RS232串口應用實例
設計要求:
通過串口發送接收數據(串口工作方式1)
實現思路:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
實現代碼:
1 #include 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 2 #include 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 2 #include 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 2 #include 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 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 2 #include 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 2 #include 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;
上一篇:STC89C52_51單片機_串口配置_UART串口通信
下一篇:單片機_指針讀取內容解析
推薦閱讀
史海拾趣
億佰特在技術創新的基礎上,積極拓展市場。公司憑借優質的產品和服務,成功打開了國內外市場的大門。產品遠銷美國、加拿大、德國等50多個國家和地區,覆蓋了物聯網、消費電子、工控醫療等多個行業。億佰特通過深入了解市場需求,不斷優化產品結構和市場策略,實現了市場的快速擴張。
隨著業務規模的不斷擴大,ABL公司開始面臨供應鏈管理的挑戰。為了應對這一挑戰,公司引入了先進的供應鏈管理系統,實現了從原材料采購、生產制造到產品銷售的全程監控。同時,ABL公司還與供應商建立了長期穩定的合作關系,確保了原材料的穩定供應和成本控制。通過優化供應鏈管理,ABL公司提高了生產效率和市場響應速度,進一步鞏固了市場地位。
作為一家半導體公司,技術突破和創新是ELANTEC發展的核心動力。在移動通信領域,ELANTEC不斷推出具有創新性的產品和技術,如低功耗、高性能的移動通信芯片等。此外,在汽車電子、工業控制等領域,ELANTEC也取得了多項技術突破,為客戶提供了更加優質的產品和服務。
近年來,隨著全球半導體市場的不斷變化和技術的快速發展,Renesas也面臨著一些挑戰。為了應對這些挑戰并保持競爭力,Renesas開始進行戰略轉型和結構調整。公司加強了與客戶的合作和溝通,深入了解市場需求和趨勢;同時,Renesas還加大了對新技術和新產品的研發投入,不斷提升自身的技術實力和創新能力。此外,Renesas還注重人才培養和引進,打造了一支高素質、專業化的團隊。這些措施的實施使Renesas在應對挑戰和轉型過程中取得了積極的成效。
Everbuild公司成立于2005年,創始人李明是一位對電子技術充滿熱情的年輕人。在創業初期,公司只有幾個員工和一間狹小的辦公室。李明帶領團隊日夜兼程地研發電子元器件,但由于資金短缺和市場競爭激烈,產品銷量并不理想。然而,他們并沒有放棄,通過不斷的技術創新和成本控制,終于在一年后推出了一款具有競爭力的電源管理芯片,贏得了市場的認可。
今天看到了一篇很好的東西,數控電源設計心得,所以轉載過來,與大家分享。 本人一直從事電源及檢測器,儀表設計工作,有幸被稱為天朝的電工。 因為天朝能說不會做的大師太多了,咱還是做好電工的本份吧。 (自為認可以接受)實驗電源的技術要求 ...… 查看全部問答∨ |
E:\\singlechip\\example\\Picture1.png 如上圖所示,如何在isis中打開cpu source code窗口 謝謝… 查看全部問答∨ |
在EVC 4模擬器上怎么安裝SQL CE 2.0?我將需要的文件傳到了模擬器上,單擊dllregister.exe注冊時提示dllregister不是有效WIN 我按網上別人說的方法做了: 1文件夾adocepb\\setup\\Data Access 3.1\\Program Files\\DataAccess31\\DEVICE\\ARM\\ARM720\\CE\\RETAIL下的所有DLL文件復制到開發板中的Windows文件夾下 2.將SQL server ce 2 的安裝目錄下的文件夾中. ...… 查看全部問答∨ |
|
從我進實驗室就跟著去做了軍品,到現在有兩年時間了。芯片要求很苛刻,很少有國產的芯片;大都是訂購從國外郵來,價格貴時間長都不說,問題是要看人家臉色,明明網站上有銷售的就說訂不到。 &nb ...… 查看全部問答∨ |
因工作需要,于半月前開始學習430,目前手頭上到是有倆本教材。分別是 《msp430系列超低功耗16位單片機原理與應用》 《msp430系列單片機c語言程序設計與開發》 但是現在效果不大,沒什么思路,連問題都提不出來。怎么看都很陌生。 不知道學430 ...… 查看全部問答∨ |
我現在有5組(每組參數若干個)參數要存。主存儲區只分了2段,只好再占用程序存儲區,F600(起始)段,F800段和FC00段。 這樣做太浪費了。但由于每組參數設置和存取要分開。而flash又要段擦除,我現在只好一段只存一組參數。而程序存儲區本壘就已經 ...… 查看全部問答∨ |
|
IAR MCS-51 7.30B升級到7.60出現問題,兼容性不好。 IAR MCS-51 7.30B升級到7.60出現問題,編譯不過。用CC2430的協議棧,在7.30編譯正常,但7.60編譯不了。那位用個,怎么處理的。… 查看全部問答∨ |
XC2000 ADC 模塊 的兩個 順序請求源的差別在于 用來保存序列的中間隊列級的個數不同。仲裁時隙0的請求源不提供 中間隊列級。仲裁時隙2的請求源提供 3級 中間隊列級。。。。這 ...… 查看全部問答∨ |