本講我們主要通過實驗操作來熟悉ASCII碼與通信數(shù)據(jù)之間的關(guān)系。
我們現(xiàn)在實現(xiàn)這樣的功能,在電腦端上發(fā)送“十六進(jìn)制”模式或“字符格式”模式的字節(jié)給單片機,數(shù)碼管則顯示出這些數(shù)據(jù)的十進(jìn)制值,然后觀察數(shù)碼管上顯示的數(shù)值與發(fā)送數(shù)據(jù)的關(guān)系。
1.代碼
#include <reg52.h> #include <function.h>//詳見第六章第8講 #include <timer.h> //詳見第八章第11講 u8 RXDBUF;//緩存接收到的數(shù)據(jù) 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; //閉合總中斷開關(guān) ConfigUART(9600); TIM0_Init(1000,0); //定時1ms,用來刷新數(shù)碼管顯示,定時精度要求不高可不微調(diào) while(1) { ShowNumber(RXDBUF); } } void TIM0_IRQHandler() interrupt 1 { TH0 = T0RH; //重新加載重載值 TL0 = T0RL; SEG_Scan(); } void InterruptUART() interrupt 4 { if (RI) //RI等于1就滿足if條件語句,意為接收到字節(jié) { RI = 0; //手動清零接收中斷標(biāo)志位 RXDBUF = SBUF; //接收到的數(shù)據(jù)保存到接收緩存變量中 SBUF = RXDBUF; //接收到的數(shù)據(jù)又直接發(fā)回,叫作-"echo", //用以提示用戶輸入的信息是否已正確接收 } if (TI) //TI等于1滿足if條件語句,意為字節(jié)發(fā)送完畢 { TI = 0; //手動清零發(fā)送中斷標(biāo)志位 } }
2.實驗觀察分析
在發(fā)送窗口和接收窗口都選“十六進(jìn)制”模式,電腦端發(fā)送一個8的數(shù)據(jù)(也就是0x08)的字節(jié)給單片機,然后單片機會發(fā)送回來這個數(shù)據(jù)給電腦端顯示在窗口中。
此時開發(fā)板上的數(shù)碼管顯示的是8。
接著我們在電腦端發(fā)送的是10,這是0x10,不要與十進(jìn)制的10混淆。
數(shù)碼管顯示的是16,所以發(fā)送的數(shù)據(jù)用十進(jìn)制顯示在數(shù)碼管上是正確的。
接著我們切換到“字符格式”模式下發(fā)送字符“A”。
數(shù)碼管顯示的是65,電腦端接收到單片機發(fā)送回來的數(shù)據(jù)是0x41,也就是十進(jìn)制下的65。
找到ASCII表,字符“A”對應(yīng)的數(shù)剛好是65。
如果把電腦端接收窗口改為“字符格式”顯示,那么顯示的內(nèi)容就跟發(fā)送窗口的字符一樣了。
剩下的留給大家自己思考。
3.注意
如果我們在電腦端發(fā)送窗口輸入一串字符比如“ABCD123”點擊發(fā)送給單片機,如果我們看到的是下面這個現(xiàn)象
那么結(jié)合以下的程序代碼分析
RXDBUF = SBUF;
SBUF = RXDBUF;
也就是電腦端先發(fā)送字符“A”給單片機,單片機馬上發(fā)送回字符“A”給電腦端,接著電腦端又發(fā)送字符“B”,如此執(zhí)行下去,直到發(fā)送完最后一個字符“3”。
這些發(fā)送和接收過程是非常快的,因為單片機接收緩存區(qū)SBUF每次只能暫存一個字節(jié),所以前面6個字節(jié)都會很快被替換,導(dǎo)致數(shù)碼管在一瞬間里只顯示字符“3”的ASCII碼值51。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程