1.串口配置函數
上一講的講解是讓大家對《手把手教你學51單片機》文檔的第十一章的第一個例程的輔助理解,我們沒有寫單片機接收電腦端發(fā)送回來的數據字節(jié)做處理的代碼。因為這些都是IO端口模擬的串口通信,由于51單片機本身集成有串口模塊,所以我們使用其硬件資源即可,無需在軟件方面做過多的細節(jié)描寫,如有興趣了解串口更多細節(jié),請反復閱讀《手把手教你學51單片機》文檔的第十一章。
那么宋老師已經很詳細地把串口的相關知識講解清楚,我們直接模仿他的編程思想來實現(xiàn)我們想實現(xiàn)的功能即可。
串口配置函數我們直接運用宋老師的代碼,這里講解一兩處配置的知識。
首先“SCON=0x50;”是讓SCON寄存器的第4位和第6位都置1,其他位置0,在文檔的表11-2已有講解。
“TH1 = 256 - (11059200/12/32)/baud;”是波特率設置的計算公式,可不用深究,由于串口的使用要占用定時器1,那么定時器1的定時中斷將不能使用,所以必須使“ET1=0;”禁止其產生定時中斷,也就是使用了串口,那么“void TIM1_IRQHandler() interrupt 3”將不能再出現(xiàn)在程序書寫中。
不過呢,串口也有相應的中斷函數,像ET0,ET1一樣,這些都是子開關,串口中斷的子開關為ES,“ES=1;”和“EA=1;”就開啟了串口的中斷函數。我們串口發(fā)送數據的時候會產生中斷,接收到數據的時候也會產生中斷,這兩個瞬間我們在中斷函數里需要執(zhí)行相關任務。
要知道串口有動作的時候,總會有RI或者TI被置1,前者意為接收到完整的8位的數據,也就是接收到一個字節(jié)然后RI就被置1。后者意為單片機發(fā)送完一個完整的字節(jié)了,TI被置1。這些瞬間都需要我們在串口中斷函數中讓其清0,以備下次它們能再次被置1。
我們現(xiàn)在要實現(xiàn)的功能很簡單,就是電腦端通過串口發(fā)送一個數據給單片機,這個數據被單片機接收到之后,讓這個數據再加1,然后單片機再通過串口把加1后的數據發(fā)送回去給電腦端讓它在窗口上顯示。
2.代碼
#include <reg52.h> #include <function.h>//詳見第六章第8講 #include <timer.h> //詳見第八章第11講 u8 RXDBUF;//緩存接收到的數據 void ConfigUART(u16 baud) { SCON = 0x50; //配置串口為模式1 TMOD &= 0x0F; //清零T1的控制位 TMOD |= 0x20; //配置T1為模式2 TH1 = 256 - (11059200/12/32)/baud;//計算T1重載值 TL1 = TH1; //初值等于重載值 ET1 = 0; //禁止T1中斷 ES = 1; //使能串口中斷 TR1 = 1; //啟動T1 } void main() { LED_Init(); //初始化LED硬件模塊 EA = 1; //閉合總中斷開關 ConfigUART(9600);//串口波特率設置為9600 while(1); } void InterruptUART() interrupt 4 { if (RI) //RI等于1就滿足if條件語句,意為接收到字節(jié) { RI = 0; //手動清零接收中斷標志位 RXDBUF = SBUF; //接收到的數據保存到接收緩存變量中 SBUF = RXDBUF+1; //發(fā)送回去給電腦端的數據 } if (TI) //TI等于1滿足if條件語句,意為字節(jié)發(fā)送完畢 { TI = 0; //手動清零發(fā)送中斷標志位 } }
這里講解一下串口中斷函數,像“if(RI){RI=0;}”和“if(TI){TI=0;}”這些都是在串口中斷函數中必須要去執(zhí)行的任務,當然如果在其他函數里有清0這兩個位,可不用在串口中斷函數中書寫,但一定要保證每次都要清0。
SBUF是名字相同作用卻不同的緩沖區(qū)。
“RXDBUF = SBUF;”SBUF在等于號后面意為這個是單片機接收電腦端數據的緩存區(qū)。
“SBUF = RXDBUF+1;”SBUF在等于號前面意為這個是單片機發(fā)送給電腦端數據的緩存區(qū),一旦出現(xiàn)“SBUF = xxxx”這樣的語句,那就是單片機開始通過串口發(fā)送數據出去了。
實驗現(xiàn)象如下,與上一講不同,我們這次選用的是“十六進制顯示”模式,我們電腦端發(fā)送給單片機的數據也是在“十六進制發(fā)送”模式,打上7點擊發(fā)送,電腦端發(fā)送的數據其實是0x07,單片機接收到電腦端發(fā)來的數據之后加1:0x07+1=0x08。
0x08這個數據再通過單片機發(fā)送回去給電腦端,這樣電腦端就顯示“08”了。
C語言網提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程