51 單片機內部有一個全雙工串行接口。什么叫全雙工串口呢?一般來說,只能接受或只能發(fā)送的稱為單工串行;既可接收又可發(fā)送,但不能同時進行的稱為半雙工;能同時接收和發(fā)送的串行口稱為全雙工串行口。串行通信是指數據一位一位地按順序傳送的通信方式,其突出優(yōu)點是只需一根傳輸線,可大大降低硬件成本,適合遠距離通信。其缺點是傳輸速度較低。一.串行通信的原理
1.隨著多微機系統(tǒng)的廣泛應用和計算機網絡技術的普及,計算機的通信功能愈來愈顯得重 要。計算機通信是指計算機與外部設備或計算機與計算機之間的信息交換。
2.通信有并行通信和串行通信兩種方式。在多微機系統(tǒng)以及現代測控系統(tǒng)中信息的交換多采用串行通信方式。
3.計算機通信是將計算機技術和通信技術的相結合,完成計算機與外部設備或計算機與計算機之間的信息交換。可以分為兩大類:并行通信與串行通信。
4.并行通信 通常是將數據字節(jié)的各位用多條數據線同時進行傳送 。
STC51單片機一般帶有1個串口,有的帶有2個串口,串口一般用于下載程序和串口通信。串口通信特別適合控制設備,所以工控機的電腦上一般都帶有串口。
51單片機的串口引腳為P3.0引腳與P3.1引腳,分別是RXD和TXD引腳。串口通信可以用于單片機和其它芯片通信或者單片機之間通信或者單片機與電腦通信。串口通信一般都是交叉連接。標準的串口有9個引腳,我們一般情況下,只用RXD TXD GND,剩下的引腳都是通信控制引腳,在以前用于控制電話機,現在已經基本上不用了。所以我們的51單片機上只保留了RXD和TXD。
串口通信的協(xié)議非常簡單。如果單片機上的串口不夠用,還可以用任意兩個引腳模擬串口通信。
一般情況,我們用帶有起始位的8位串口協(xié)議。波特率常用9600,此外還有1200 2400 4800 115200等。
打開串口的程序如下:
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
SCON=0X50;
TR1=1;
程序涉及到5個寄存器的配置。
TMOD是定時器控制寄存器
TH1和TL1是定時器1的初值寄存器
SCON是串行口控制寄存器
TR1是TCON寄存器中的bit4,因為該寄存器可以位操作
串口發(fā)送數據的程序如下所示:
SBUF=55; // 發(fā)送數據55
while(!TI);
TI=0;
程序涉及到2個寄存器
SBUF是串口數據寄存器
TI是SCON寄存器中的bit1,位操作
串口接收數據的程序如下所示:
if(RI)
{
recebuf=SBUF;
RI=0;
}
程序涉及到2個寄存器
SBUF是串口數據寄存器
RI是SCON寄存器中的bit0,位操作
SBUF既是發(fā)送數據寄存器,又是接收數據寄存器。
可以把上面的功能模塊封裝成函數,在使用的時候,直接調用。
串口通信的基本認識
通信分為并行通信和串行通信,并行通信時的數據各個位同時傳送,可以實現字節(jié)為單位通信,但通信線多占用資源,成本高。以前用到的的P1=0x55,一次給P1口的8個管腳分別賦值,同時進行信號輸出,類似于8個車道可以過去8輛車,這樣的形式是并行的,一般稱P0,P1,P2,P3為51單片機的4組并行總線。
串行通信,就是一個車道,一個只能通過一輛車,如果一個0x55這樣一個字節(jié)的數據要傳輸過去的話,假如低位在前,高位在后的話,那發(fā)送方式是:0-1-0-1-0-1-0-1,一位一位的進行傳輸,要發(fā)送8次才能發(fā)送完一個字節(jié)
STC89C52有兩個引腳是專門用來做串口通信的,一個是P3.0(RXD),一個是P3.1(TXD),他們組成的通信接口就是串行接口,簡稱串口。用于兩個單片機進行UART通信。兩單片機通信接口連接方式:RXD——TXD,TXD——RXD。
單片機1的TXD發(fā)送通道接到單片機2的RXD接收通道,單片機的1的RXD接收通道接到單片機2的TXD發(fā)送通道,從而實現相互通信。
當單片機1想給單片機2發(fā)送數據,比如發(fā)送了0xCE,用二進制表示就是11001110,在串口通信過程中,是低位先發(fā),高位后發(fā)的原則,那么就是讓TXD首先拉低電平,持續(xù)一段時間,發(fā)送一位0,然后拉高電平,持續(xù)一段時間,發(fā)送一位1,繼續(xù)拉高,在持續(xù)一段時間,發(fā)送一位1,一直把8位二進制數11001110全部發(fā)送完畢,這里涉及到一個問題,就是持續(xù)的一個時間段時間“到底是多少”。因而便引入通信中非常重要的一個概念波特率,也叫做比特率。
波特率
波特率就是發(fā)送二進制數據位的速率,習慣用baud表示,即我們發(fā)送一位二進制數據持續(xù)的時間=1/baud。在通信之前,單片機1和單片機2首先都要明確約定好他們之間的通信波特率,必須保持一致,收發(fā)雙方才能正常通信。
約定好速度之后,我們還要考慮第二個問題,數據什么時候是起始,什么時候是結束?提前和延遲結束都會接收錯誤。在uart通信的時候,一個字節(jié)是8位,規(guī)定當沒有通信信號發(fā)生時,通信線路保持高電平,當數據發(fā)送前,先發(fā)一位0表示起始位,然后發(fā)送8位數據位,數據位是先低再高,數位位發(fā)送完后才呢個后再發(fā)送一位1表示停止位,這樣我們要發(fā)送的8位數據,實際上我們發(fā)送了10位,多出來兩位其中一個是起始位,一個是停止位。而接受方一直保持的高電平,一旦檢測到一位低電平,準備開始接受數據,接受8位數據后,然后檢測停止位,再準備下一個數據接收。
串口數據發(fā)送示意圖,實際上是一個時域示意圖,就是信號隨著時間變化的對應關系。比如在單片機的發(fā)送引腳上,左邊的是先發(fā)生的,右邊的是后發(fā)生的,數據位的切換時間就是波特率分之一秒,如果能夠理解時域的概念,后邊很多通信的時序圖就很容易理解了。
RS232
在我們電腦上,一般都會有一個9針的串行接口,這個串行接口叫做RS232接口,它和UART通信有關聯(lián),但是由于現在筆記本電腦不帶9針串口,所以和單片機通信越來越趨于使用USB虛擬串口。
九針串口分工頭和母頭
公頭上5下4,上5從左到右為1.2.3.4.5;下4從左到右為6.7.8.9;
母頭上5下4,上5從左到右為5.4.3.2.1;下4從左到右為9.8.7.6;
RS232接口一共有9個引腳,分別定義是:1、載波檢測DCD;2、接收數據RXD;3、發(fā)送數據TXD;4、數據終端準備好DTR;5、信號地線SG;6、數據準備好DSR;7、請求發(fā)送RTS;8、清除發(fā)送CTS;9、振鈴提示RI。我們要讓這個串口和我們單片機進行通信,我們只需要關心其中的2腳RXD、3腳TXD和5腳GND即可。
雖然這三個引腳的名字和我們單片機上的串口名字一樣,但是卻不能直接和單片機對連通信,這是為什么呢?隨著我們了解的內容越來越多,我們得慢慢知道,不是所有的電路都是5V代表高電平而0V代表低電平的。對于RS232標準來說,它是個反邏輯,也叫做負邏輯。為何叫負邏輯?它的TXD和RXD的電壓,-3V~-15V電壓代表是1,+3~+15V電壓代表是0。低電平代表的是1,而高電平代表的是0,所以稱之為負邏輯。因此電腦的9針RS232串口是不能和單片機直接連接的,需要用一個電平轉換芯片MAX232來完成。
這個芯片就可以實現把標準RS232串口電平轉換成我們單片機能夠識別和承受的UART 0V/5V電平。從這里大家似乎慢慢有點明白了,其實RS232串口和UART串口,它們的協(xié)議類型是一樣的,只是電平標準不同而已,而MAX232這個芯片起到的就是中間人的作用,它把UART電平轉換成RS232電平,也把RS232電平轉換成UART電平,從而實現標準RS232接口和單片機UART之間的通信連接。
USB轉串口通信
隨著技術的發(fā)展,工業(yè)上還有RS232串口通信的大量使用,但是商業(yè)技術的應用上,已經慢慢的使用USB轉UART技術取代了RS232串口,絕大多數筆記本電腦已經沒有串口這個東西了,那我們要實現單片機和電腦之間的通信該怎么辦呢?
我們只需要在電路上添加一個USB轉串口芯片,就可以成功實現USB通信協(xié)議和標準UART串行通信協(xié)議的轉換,在我們的開發(fā)板上,我們使用的是CH340T這個芯片。
我們需要用跳線帽把中間和下邊的針短接在一起。右側的CH340T這個電路很簡單,把電源、晶振接好后,6腳和7腳的DP和DM分別接USB口的2個數據引腳上去,3腳和4腳通過跳線接到了我們單片機的TXD和RXD上去。
CH340T的電路里3腳位置加了個4148的二極管,是一個小技巧。因為STC89C52這個單片機下載程序時需要冷啟動,就是先點下載后上電,上電瞬間單片機會先檢測需要不需要下載程序。雖然單片機的VCC是由開關來控制,但是由于CH340T的3腳是輸出引腳,如果沒有此二極管,開關后級單片機在斷電的情況下,CH340T的3腳和單片機的P3.0(即RXD)引腳連在一起,有電流會通過這個引腳流入后級電路并且給后級的電容充電,造成后級有一定幅度的電壓,這個電壓值雖然只有兩三伏左右,但是可能會影響到正常的冷啟動。加了二極管后,一方面不影響通信,另外一個方面還可以消除這種不良影響。這個地方可以暫時作為了解,大家如果自己做這類電路,可以參考一下。
IO口模擬UART串口通信
UART串口波特率,常用的值是300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200等速率。IO口模擬UART串行通信程序是一個簡單的演示程序,我們使用串口調試助手下發(fā)一個數據,數據加1后,再自動返回。
串口調試助手,這里我們直接使用STC-ISP軟件自帶的串口調試助手,先把串口調試助手的使用給大家說一下,如圖11-6所示。第一步要選擇串口助手菜單,第二步選擇十六進制顯示,第三步選擇十六進制發(fā)送,第四步選擇COM口,這個COM口要和自己電腦設備管理器里的那個COM口一致,波特率按我們程序設定好的選擇,我們程序中讓一個數據位持續(xù)時間是1/9600秒,那這個地方選擇波特率就是選9600,校驗位選N,數據位8,停止位1。
串口調試助手的實質就是利用電腦上的UART通信接口,發(fā)送數據給我們的單片機,也可以把我們的單片機發(fā)送的數據接收到這個調試助手界面上。
因為初次接觸通信方面的技術,所以我把后面的IO模擬串口通信程序進行一下解釋,大家可以邊看我的解釋邊看程序,把底層原理先徹底弄懂。
變量定義部分就不用說了,直接看main主函數。首先是對通信的波特率的設定,在這里我們配置的波特率是9600,那么串口調試助手也得是9600。配置波特率的時候,我們用的是定時器T0的模式2。模式2中,不再是TH0代表高8位,TL0代表低8位了,而只有TL0在進行計數,當TL0溢出后,不僅僅會讓TF0變1,而且還會將TH0中的內容重新自動裝到TL0中。這樣有一個好處,就是我們可以把想要的定時器初值提前存在TH0中,當TL0溢出后,TH0自動把初值就重新送入TL0了,全自動的,不需要程序中再給TL0重新賦值了,配置方式很簡單,大家可以自己看下程序并且計算一下初值。