51单片机之串口通讯应用实例(逻辑分析仪调试)
- 硬件:STC89C52RC
- 開發(fā)工具:Keil uVision4
前言:8051是一款很經(jīng)典的、歷史悠久的單片機,作為一款入門級的單片機8051受到很多初學者的歡迎。89c52是8051系列的成員之一,擁有8K字節(jié)程序存儲空間,512字節(jié)隨機數(shù)據(jù)存儲空間;I/O口控制端口、中斷功能、定時器及串行接口。下面詳細講述串行接口功能的使用。
不管你用的芯片是不是STC89C52RC,只要你看完這篇文章,就能自行運用到不同的芯片上;因為一種串口通信協(xié)議的傳輸原理在任何芯片上都是統(tǒng)一的;所以它可以作為不同芯片一起協(xié)作的通信媒介。
目前普遍的單片機都有串行通信的接口,因為它依賴的硬件比較簡單,一條串行數(shù)據(jù)輸出線(TX)、一條串行數(shù)據(jù)接收線(RX)、一條用于電壓參考的共地線。由此看出,芯片可以同時接受和發(fā)送數(shù)據(jù),也實現(xiàn)了所說的全雙工;而且,數(shù)據(jù)的傳輸時異步進行的,也就是說當芯片發(fā)送數(shù)據(jù)的時候,不需要對方應答,甚至不接目標器件也能成功發(fā)送;與之相反的同步通訊,就是需要對方應答或者通過時鐘線控制傳輸?shù)倪^程。
波特率:每秒鐘可以傳送幾位的數(shù)據(jù)成為波特率,單位是BPS(Bit Per Second)。典型的波特率有9600bps、115200bps,以9600bps為例,使用8個數(shù)據(jù)位,沒有檢驗位,1個停止位,起始位一直會存在。那么發(fā)送一個字節(jié)共需要發(fā)送10位,9600/10=960字節(jié),也就是說一秒最多能發(fā)960字節(jié)的數(shù)據(jù),波特率越高,傳送的時間越短。我們所說的4M寬帶的4M指的也是波特率,是一秒可以發(fā)4M位,而不是一秒可以發(fā)4M字節(jié)。
串行異步通信時的數(shù)據(jù)格式:
⑴ 起始位:起始位必須是持續(xù)一個比特時間的邏輯“0”電平,標志傳送一個字符的開始。
⑵ 數(shù)據(jù)位:數(shù)據(jù)位為5-8位,它緊跟在起始位之后,是被傳送字符的有效數(shù)據(jù)位。傳送時先傳送字符的低位,后傳送字符的高位。數(shù)據(jù)位究竟是幾位,可由硬件或軟件來設定。
⑶ 奇偶位:奇偶檢驗為僅占一位,用于進行奇校驗或偶校驗,也可以不設奇偶位。
⑷ 停止位:停止位為1位、1.5位或2位,可有軟件設定。它一定是邏輯“1”電平,標志著傳送一個字符的結束。
⑸ 空閑位:空閑位表示線路處于空閑狀態(tài),此時線路上為邏輯“1”電平。空閑位可以沒有,此時異步傳送的效率為最高。
下面是利用邏輯分析儀抓取信號得到的波形圖,對照著上面所說的數(shù)據(jù)格式去解讀:
圖的上方是信號的波形圖,下方是描述該串口信號的信息,只有告訴邏輯分析儀這些信息,才能讓它從該信號中正確地讀取數(shù)據(jù),所以在應用的時候以上所顯示的信息需要通信雙方配置為一樣。我們截取了一幀的數(shù)據(jù),可以看到正在發(fā)送的值是0b10101010,也就是0xaa;首先,上面每一個點對應數(shù)據(jù)的一個bit位的值,總共8個點;可以看到第一個數(shù)據(jù)前有一個起始位,最后一個數(shù)據(jù)后面有一個停止位“1”,當然發(fā)完了之后是空閑狀態(tài)也是處于邏輯“1”狀態(tài)。數(shù)據(jù)位的低bit位先發(fā),對于0b10101010來說就是先發(fā)0,所以起始位后面緊接著發(fā)0。?
下面介紹如何使用單片機的串行通信,首先是相關寄存器介紹:
SCON特殊功能寄存器
下圖是SCON寄存器的每一位,每一個位均可位尋址,可分別設定或清除。
- SM0、SM1
??? SM0=0&SM1=0:模式0,移位寄存器控制I/O,波特率固定為工作頻率/12。
??? SM0=0&SM1=1:模式1,8位串行數(shù)據(jù)傳送,波特率由計時器1來控制。
??? SM0=1&SM1=0:模式2,9位串行數(shù)據(jù)傳送,波特率可分為2種,工作頻率/32或工作頻率/64。
??? SM0=1&SM1=1:模式3,9位串行數(shù)據(jù)傳送,波特率可用計時器1控制。 - SM2: 在串行傳輸工作模式2或模式3時,用于多處理機控制功能。
- REN:串行接口接收位,當REN=1時表示允許接收。
- TB8:在模式2或模式3時,所送出的第9個數(shù)據(jù)位,可以由軟件指令來做控制設定或清除。
- RB8:在模式2或模式3時,所接收的第9位數(shù)據(jù)位,存放在此位上。
- TI:串行傳輸數(shù)據(jù)發(fā)送中斷產(chǎn)生標志,最后一個數(shù)據(jù)發(fā)送出去后,TI會被設置為1,此位必需由軟件清除。
- RI :串行傳輸數(shù)據(jù)接收中斷產(chǎn)生標志,當接收到最后一個數(shù)據(jù)時,RI會被設置為1,此位必需由軟件清除。
從上面可知,這款單片機并沒有配置停止位和校驗方法的,默認是一個停止位和無校驗方法。所以它可以做到:
波特率:在合適范圍內(nèi)自行配置
數(shù)據(jù)位:8位或9位
校驗位:不可選,默認沒有校驗位
停止位:不可選,默認1個停止位
其實我們可以做到有校驗位的,就是將就第9個數(shù)據(jù)為作為校驗位,當然該位的值需要軟件計算出來。下面說一下各模式下波特率的計算:
模式0的波特率設定:
該模式下波特率固定的,為工作頻率的1/12。如果使用12M的晶振,工作頻率即為12M,波特率為12M/12=1Mbps。
模式2的波特率設定:
當SMOD=1時,波特率=(工作頻率)/32
當SMOD=0時,波特率=(工作頻率)/64
模式1和模式3的波特率設定:
模式1和模式3下的波特率有內(nèi)部計數(shù)器1來控制,計數(shù)器的工作模式也有很多種,但必須要使用模式2,自動重新載入計時模式。如果對定時器不是很了解可參考鏈接。設定波特率的關鍵是計算出計數(shù)器TH1(自動載入計時值)的值,計算公式為:
由上面的公式,只要把波特率定下來,就可以算出TH1的值了,整理得:
假如單片機使用的晶振頻率為11.0592MHz,各串行通信的波特率定為9600bps,SMOD設為0,則可求得TH1如下:
由上面公式,我們可以計算常用的波特率所對應的計時器自動載入值(寫入TH1中),如下:
下面是一個例子,實現(xiàn)電腦端給單片機發(fā)送字符時,單片機將字符返回給電腦,波特率位9600bps,8個數(shù)據(jù)位,無校驗位,1個停止位,單片機使用的晶振是11.0592MHz。
#include<reg52.h> void InitUART (void) //初始化串口通信 { #if 1 //方法一SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重裝TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz TR1 = 1; // TR1: timer 1 打開 EA = 1; //打開總中斷ES = 1; //打開串口中斷 #else //方法二TMOD=0x20; //設置定時器1工作模式:模式二TH1=0xfd; //設定定時器重載值TL1=0xfd; //初值TR1=1; //打開定時器REN=1; //使能串口接收數(shù)據(jù)SM0=0; //串行通訊模式1SM1=1; //串行通訊模式1EA=1; //打開總中斷ES=1; //打開串口中斷 #endif }void SendString(unsigned char *s) //發(fā)送字符串的函數(shù) {while(*s!='\0'){// \0 表示字符串結束標志,通過檢測是否字符串末尾SBUF = *s;while(!TI);TI = 0;s++;} }void Delay(unsigned int t) //簡單的延時函數(shù) {while(--t); }void main (void) {InitUART();while (1) //主循環(huán) {//Delay(0xffff);//SendString("runing"); //如果去掉注釋電腦端就會一直收到”runing“字符串} }void UART_SER (void) interrupt 4 //串行中斷服務程序(接收完成或者發(fā)送完成都會進入該中斷) {unsigned char Temp; //定義臨時變量 if(RI){ //判斷是接收中斷產(chǎn)生RI=0; //標志位清零Temp=SBUF; //讀入緩沖區(qū)的值P0=Temp; //把值輸出到P1口,用于觀察 可去掉SBUF=Temp; //把接收到的值再發(fā)回電腦端} }編譯程序下載到單片機上,將P3.1接到串口轉(zhuǎn)USB模塊的RX,P3.0接到串口轉(zhuǎn)USB模塊的TX,然后將串口轉(zhuǎn)USB模塊接到電腦,電腦端打開串口助手,將串口參數(shù)配置跟單片機一樣(9600bsp,8個數(shù)據(jù)位,無校驗位,一個停止位)。打開串口,往單片機發(fā)送一個在字符,那么在串口助手的接收框里就能看到剛發(fā)送出去的字符。
一般來說,我們下載程序就是用串口下載,下載的時候是需要選擇串口號的,下載完成后就是用該串口號進行驗證,可能在下載軟件里面就有串口助手,用起來非常方便,如下圖所示。
僅供參考,錯誤之處以及不足之處還望多多指教。
<<不積跬步,無以致千里;不積小流,無以成江河。>>
總結
以上是生活随笔為你收集整理的51单片机之串口通讯应用实例(逻辑分析仪调试)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32之USB应用实例(官方例程资料
- 下一篇: 嵌入式系统存储(RAM、ROM、Flas