MCS-51學習小結之RS232通訊[轉載]
MCS-51學習小結之RS232通訊
原文:http://blog.ednchina.com/ZHOUNACHU/1603473/message.aspx
隨著多微機系統的廣泛使用和計算機網路技術的普及,計算機的通訊功能越來越顯得重要,一般來說,可以採用序列通訊和並行通訊兩種方式,由於序列通訊方式使用線路少、成本低,特別是在遠端傳輸時,可以避免多條線路的不一致而被廣泛使用,其中,RS232通訊是比較常用的,操作起來也簡單,對於一般的全雙工通訊,只需要3根訊號線就可以了,即一條TXD線、一條RXD線和一條地線。
我手裡用的是9針D型串列埠,它的引腳分佈為2:RXD、3:TXD和5:邏輯地。
MCS-51的序列傳送和序列接收利用了P3口的第二功能,P3.0作為序列資料的接收線RXD,P3.1作為序列資料線的傳送線TXD。序列通訊的控制暫存器佔據了26個SFR中的3個,其中,PCON和SCON用於設定序列口工作方式以及確定資料的傳送和接收波特率,SBUF實際上由兩個8位暫存器組成,一個用於存放將要傳送的資料,另一個用於存放接收到的資料,起著資料的緩衝作用。
記得還是大二暑假的時候開始接觸RS232通訊,當時對這3個SFR的概念非常模糊,那個時候的數位電路是自學的,基礎不紮實,現在回頭好好理解一下,發現這種通訊操作起來還是比較簡單的,關鍵是要把這3個SFR的Functional Block Diagram理解清楚,這涉及到一些數位電路方面的知識,一點體會就是電路基礎一定要過硬,否則控制程式將無從寫起。
序列口通訊有4種工作方式可供選擇,我這次除錯的是方式1,即10位非同步收發方式,這種方式比較常用。波特率的設定這裡就不多說了,有專門的表可以直接查詢,可以按照自己的需求選擇其中一種就OK了。需要注意的是,這裡資料的傳送有兩種途徑可供選擇,分別為:
(1)查詢式:CPU通過查詢通訊埠TXD和RXD的狀態進行資料的傳送,它的優點是硬體連線和查詢程式十分簡單,但是CPU在查詢等待過程中會降低效率。
(2)中斷法:中斷傳送是利用CPU本身的中斷功能來實現對終端的資料傳送,這種方式可以提高CPU的工作效率。
下面是我修改好的程式,我儘量把它寫的清楚、簡單、易懂、格式標準:
(1)查詢法:
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar temp;
//************************************************
void send_back() //資料返回子程式
{
SBUF="P1";
while(!TI); //等待資料傳送完畢
TI="0"; //將傳送標誌位清零
}
//************************************************
void main()
{
TMOD="0x20"; //定時器1,工作方式2
TH1=0xFD;
TL1=0xFD; //給定時器1裝初值,設定波特率為9600bps
PCON="0x00"; //波特率不進行加倍
SM0=0;
SM1=1; //序列工作方式1
REN="1"; //允許接收資料
TR1=1; //啟動定時器1
while(1)
{
if(RI==1) //接收到資料時該位自動置為1。
{
RI="0"; //將接收標誌位清零,否則上位機會一直不停地傳送資料
temp="SBUF";
P1=temp;
send_back(); //把接收到的資料返回PC機
}
}
}
(2)中斷法:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//************************************************
void send_back() //資料返回子程式
{
SBUF="P1";
while(!TI); //等待資料傳送完畢
TI=0; //將傳送標誌位清零
}
//************************************************
void main()
{
TMOD="0x20"; //定時器1,工作方式2
TH1 =0xfd;
TL1 =0xfd; //給定時器1裝初值,設定波特率為9600bps
PCON="0x00"; //波特率不進行加倍
SM0 =0;
SM1 =1; //序列工作方式1
REN =1; //允許接收資料
ES =1; //開啟串列埠中斷4
TR1 =1; //啟動定時器1
EA =1; //開啟總中斷
while(1);
}
//************************************************
void UART() interrupt 4
{
if(RI==1) //接收到資料時該位自動置為1。
{
RI="0"; //將接收標誌位清零,否則上位機會一直不停地傳送資料
P1=SBUF;
send_back();//把接收到的資料返回PC機
}
}
除錯這個通訊程式時,發現使用串列埠除錯傳送資料時必須使用16進位制模式傳送,否則微控制器收不到資料,以後得記住這一點.
相關文章
- STM32學習之SPI序列通訊
- 轉載 hessian學習總結
- Android學習之 WebView使用小結AndroidWebView
- 【C#學習之辨析小總結】C#
- java web中jsp和action之間通訊小結JavaWebJS
- Android學習筆記之藍芽通訊...Android筆記藍芽
- 學習小結
- 【轉載】IEEE754 學習總結
- Vue父子元件通訊小總結Vue元件
- Flutter外掛學習之Native通訊詳解Flutter
- vue 學習小結Vue
- JavaScript學習小結JavaScript
- NFS學習小結NFS
- linux程式間通訊(IPC)小結Linux
- 由轉載開始—通訊—Mathworks
- 【轉載】Java非同步通訊收藏Java非同步
- 前端學習(2370):元件之間的通訊方式前端元件
- 前端學習(2371):元件之間的通訊方式前端元件
- RS232轉SR485轉換器的小問題
- 009 通過連結串列學習Rust之IntoIterRust
- 小程式學習總結
- git學習小總結Git
- CommonsChunkPlugin學習小結Plugin
- 整合學習原理小結
- Spring 學習小結Spring
- qDebug 學習小結
- Java-執行緒間通訊小結Java執行緒
- Web【轉載學習】Web
- 整合學習之Adaboost演算法原理小結演算法
- Linux學習/TCP Socket通訊LinuxTCP
- mysql學習之-小技巧MySql
- 學術休假之通訊錄管理
- 010 通過連結串列學習Rust之IterRust
- 011 通過連結串列學習Rust之IterMutRust
- 【轉載】高效能MySQL小結MySql
- Docker學習總結(四)——容器間的通訊和資料卷Docker
- “Linux程式設計”小結(程式間通訊)Linux程式設計
- Android 即時通訊開發小結(二)Android