當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]我們學(xué)習(xí)串口通信主要是要實(shí)現(xiàn)單片機(jī)和電腦之間的信息交互,可以用電腦控制單片機(jī)的一些信息,可以把單片機(jī)的一些信息狀況發(fā)給電腦上的軟件。下面我們就做一個(gè)簡(jiǎn)單的例程,實(shí)現(xiàn)單片機(jī)串口調(diào)試助手發(fā)送的數(shù)據(jù),在我們

我們學(xué)習(xí)串口通信主要是要實(shí)現(xiàn)單片機(jī)和電腦之間的信息交互,可以用電腦控制單片機(jī)的一些信息,可以把單片機(jī)的一些信息狀況發(fā)給電腦上的軟件。下面我們就做一個(gè)簡(jiǎn)單的例程,實(shí)現(xiàn)單片機(jī)串口調(diào)試助手發(fā)送的數(shù)據(jù),在我們開發(fā)板上的數(shù)碼管上顯示出來。

#include

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;

unsigned char code LedChar[] = { //數(shù)碼管顯示字符轉(zhuǎn)換表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};

unsigned char LedBuff[7] = { //數(shù)碼管+獨(dú)立 LED 顯示緩沖區(qū)

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

};

unsigned char T0RH = 0; //T0 重載值的高字節(jié)

unsigned char T0RL = 0; //T0 重載值的低字節(jié)

unsigned char RxdByte = 0; //串口接收到的字節(jié)

void ConfigTimer0(unsigned int ms);

void ConfigUART(unsigned int baud);

void main(){

EA = 1; //使能總中斷

ENLED = 0; //選擇數(shù)碼管和獨(dú)立 LED

ADDR3 = 1;

ConfigTimer0(1); //配置 T0 定時(shí) 1ms

ConfigUART(9600); //配置波特率為 9600

while (1){ //將接收字節(jié)在數(shù)碼管上以十六進(jìn)制形式顯示出來

LedBuff[0] = LedChar[RxdByte & 0x0F];

LedBuff[1] = LedChar[RxdByte >> 4];

}

}

/* 配置并啟動(dòng) T0,ms-T0 定時(shí)時(shí)間 */

void ConfigTimer0(unsigned int ms){

unsigned long tmp; //臨時(shí)變量

tmp = 11059200 / 12; //定時(shí)器計(jì)數(shù)頻率

tmp = (tmp * ms) / 1000; //計(jì)算所需的計(jì)數(shù)值

tmp = 65536 - tmp; //計(jì)算定時(shí)器重載值

tmp = tmp + 13; //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差

T0RH = (unsigned char)(tmp>>8); //定時(shí)器重載值拆分為高低字節(jié)

T0RL = (unsigned char)tmp;

TMOD &= 0xF0; //清零 T0 的控制位

TMOD |= 0x01; //配置 T0 為模式 1

TH0 = T0RH; //加載 T0 重載值

TL0 = T0RL;

ET0 = 1; //使能 T0 中斷

TR0 = 1; //啟動(dòng) T0

}

/* 串口配置函數(shù),baud-通信波特率 */

void ConfigUART(unsigned int baud){

SCON = 0x50; //配置串口為模式 1

TMOD &= 0x0F; //清零 T1 的控制位

TMOD |= 0x20; //配置 T1 為模式 2

TH1 = 256 - (11059200/12/32)/baud; //計(jì)算 T1 重載值

TL1 = TH1; //初值等于重載值

ET1 = 0; //禁止 T1 中斷

ES = 1; //使能串口中斷

TR1 = 1; //啟動(dòng) T1

}

/* LED 動(dòng)態(tài)掃描刷新函數(shù),需在定時(shí)中斷中調(diào)用 */

void LedScan(){

static unsigned char i = 0; //動(dòng)態(tài)掃描索引

P0 = 0xFF; //關(guān)閉所有段選位,顯示消隱

P1 = (P1 & 0xF8) | i; //位選索引值賦值到 P1 口低 3 位

P0 = LedBuff[i]; //緩沖區(qū)中索引位置的數(shù)據(jù)送到 P0 口

if (i < 6){ //索引遞增循環(huán),遍歷整個(gè)緩沖區(qū)

i++;

}else{

i = 0;

}

}

/* T0 中斷服務(wù)函數(shù),完成 LED 掃描 */

void InterruptTimer0() interrupt 1{

TH0 = T0RH; //重新加載重載值

TL0 = T0RL;

LedScan(); //LED 掃描顯示

}

/* UART 中斷服務(wù)函數(shù) */

void InterruptUART() interrupt 4{

if (RI){ //接收到字節(jié)

RI = 0; //手動(dòng)清零接收中斷標(biāo)志位

RxdByte = SBUF; //接收到的數(shù)據(jù)保存到接收字節(jié)變量中

//接收到的數(shù)據(jù)又直接發(fā)回,叫作-"echo",

//用以提示用戶輸入的信息是否已正確接收

SBUF = RxdByte;

}

if (TI){ //字節(jié)發(fā)送完畢

TI = 0; //手動(dòng)清零發(fā)送中斷標(biāo)志位

}

}

大家在做這個(gè)實(shí)驗(yàn)的時(shí)候,有個(gè)小問題要注意一下。因?yàn)?STC89C52 下載程序是使用了UART 串口下載,下載完程序后,程序運(yùn)行起來了,可是下載軟件最后還會(huì)通過串口發(fā)送一些額外的數(shù)據(jù),所以程序剛下載進(jìn)去不是顯示 00,而可能是其他數(shù)據(jù)。大家只要把電源開關(guān)關(guān)閉,重新打開一次就好了。


細(xì)心的同學(xué)可能會(huì)發(fā)現(xiàn),在串口調(diào)試助手發(fā)送選項(xiàng)和接收選項(xiàng)處,還有個(gè)“字符格式發(fā)送”和“字符格式顯示”,這是什么意思呢?



先拋開我們使用的漢字不談,那么我們常用的字符就包含了 0~9 的數(shù)字、A~Z/a~z 的字母、還有各種標(biāo)點(diǎn)符號(hào)等。那么在單片機(jī)系統(tǒng)里面我們?cè)趺磥肀硎舅鼈兡兀?ASCII 碼(American Standard Code for Information Interchange,即美國(guó)信息互換標(biāo)準(zhǔn)代碼)可以完成這個(gè)使命:我們知道,在單片機(jī)中一個(gè)字節(jié)的數(shù)據(jù)可以有 0~255 共 256 個(gè)值,我們?nèi)∑渲械?0~127 共 128 個(gè)值賦予了它另外一層涵義,即讓它們分別來代表一個(gè)常用字符,其具體的對(duì)應(yīng)關(guān)系如表 11-3 所示。

表 11-3 ASCII 碼字符表ASC控制ASCII字符ASCII字符ASCII字符000
值NUL
字符032
值(space)064
值@096
值?001SOH033!065A097a002STX034"066B098b003ETX035#067C099c004EOT036$068D100d005END037%069E101e006ACK038&070F102f007BEL039'071G103g008BS040(072H104h009HT041)073I105i010LF042*074J106j011VT043+075K107k012FF044,076L108l013CR045-077M109m014SO046.078N110n015SI047/079O111o016DLE0480080P112p017DC10491081Q113q018DC20502082R114r019DC30513083S115s020DC40524084T116t021NAK0535085U117u022SYN0546086V118v023ETB0557087W119w024CAN0568088X120x025EM0579089Y121y026SUB058:090Z122z027ESC059;091[123{028FS060<092124|029GS061=093]125}030RS062>094^126~031US063?095_127DEL


這樣我們就在常用字符和字節(jié)數(shù)據(jù)之間建立了一一對(duì)應(yīng)的關(guān)系,那么現(xiàn)在一個(gè)字節(jié)就既可以代表一個(gè)整數(shù)又可以代表一個(gè)字符了,但它本質(zhì)上只是一個(gè)字節(jié)的數(shù)據(jù),而我們賦予了它不同的涵義,什么時(shí)候賦予它哪種涵義就看編程者的意圖了。ASCII 碼在單片機(jī)系統(tǒng)中應(yīng)用非常廣泛,我們后續(xù)的課程也會(huì)經(jīng)常使用到它,下面我們來對(duì)它做一個(gè)直觀的認(rèn)識(shí),同學(xué)們一定要深刻理解其本質(zhì)。

對(duì)照上述表格,我們就可以實(shí)現(xiàn)字符和數(shù)字之間的轉(zhuǎn)換了,比如還是這個(gè)程序,我們發(fā)送的時(shí)候改成字符格式發(fā)送,接收還是用十六進(jìn)制接收,這樣接收和數(shù)碼管好做一下對(duì)比。

我們用字符格式發(fā)送一個(gè)小寫的 a,返回一個(gè)十六進(jìn)制的 0x61,數(shù)碼管上顯示的也是 61,ASCII 碼表里字符 a 對(duì)應(yīng)十進(jìn)制是 97,等于十六進(jìn)制的 0x61;我們?cè)儆米址袷桨l(fā)送一個(gè)數(shù)字 1,返回一個(gè)十六進(jìn)制的 0x31,數(shù)碼管上顯示的也是 31,ASCII 表里字符 1 對(duì)應(yīng)的十進(jìn)制是 49,等于十六進(jìn)制的 0x31。這下大家就該清楚了:所謂的十六進(jìn)制發(fā)送和十六進(jìn)制接收,都是按字節(jié)數(shù)據(jù)的真實(shí)值進(jìn)行的;而字符格式發(fā)送和字符格式接收,是按 ASCII 碼表中字符形式進(jìn)行的,但它實(shí)際上最終傳輸?shù)倪€是一個(gè)字節(jié)數(shù)據(jù)。這個(gè)表格,當(dāng)然不需要大家去記住,理解它,用的時(shí)候過來查就行了。

通信的學(xué)習(xí),不像前邊控制部分那么直觀了,通信部分我們的程序只能獲得一個(gè)結(jié)果,而其過程我們卻無法直接看到,所以慢慢的可能大家就會(huì)知道有示波器和邏輯分析儀這類測(cè)量?jī)x器。如果學(xué)校實(shí)驗(yàn)室或者公司里有示波器或者邏輯分析儀這類儀器,可以拿過來抓一下串口波形,直觀的了解一下。如果暫時(shí)還沒有這些儀器,先知道這么回事,有條件再說。因?yàn)楣ぞ哳愒O(shè)備有的比較昂貴,有條件可以盡量使用學(xué)?;蛘吖镜?。在這里我用一款簡(jiǎn)易的邏輯分析儀把串口通信的波形抓出來給大家看一下,大家了解一下即可,如圖 11-7 所示。


圖 11-7 邏輯分析儀串口數(shù)據(jù)示意圖


分析儀和示波器的作用,就是把通信過程的波形抓出來進(jìn)行分析。先大概說一下波形的意思。波形左邊是低位,右邊是高位,上邊這個(gè)波形是電腦發(fā)送給單片機(jī)的,下邊這個(gè)波形是單片機(jī)回發(fā)給電腦的。以上邊的波形為例,左邊第一位是起始位 0,從低位到高位依次是10001100,順序倒一下,就是數(shù)據(jù) 0x31,也就是 ASCII 碼表里的‘1’。大家可以注意到分析儀在每個(gè)數(shù)據(jù)位都給標(biāo)了一個(gè)白色的點(diǎn),表示是數(shù)據(jù),起始位和無數(shù)據(jù)的時(shí)候都沒有這個(gè)白點(diǎn)。時(shí)間標(biāo) T1 和 T2 的差值在右邊顯示出來是 0.102ms,大概是 9600 分之一,稍微有點(diǎn)偏差,在容許范圍內(nèi)即可。通過圖 11-7,我們可以清晰的了解了串口通信的收發(fā)的詳細(xì)過程。

那我們這里再來了解一下,如果我們使用串口調(diào)試助手,用字符格式直接發(fā)送一個(gè)“12”,我們?cè)谖覀兊臄?shù)碼管上應(yīng)該顯示什么呢?串口調(diào)試助手應(yīng)該返回什么呢?經(jīng)過試驗(yàn)發(fā)現(xiàn),我們數(shù)碼管顯示的是 32,而串口調(diào)試助手返回十六進(jìn)制顯示的是 31、32 兩個(gè)數(shù)據(jù),如圖 11-8所示。


圖 11-8 串口調(diào)試助手?jǐn)?shù)據(jù)顯示


我們?cè)儆眠壿嫹治鰞x把這個(gè)數(shù)據(jù)抓出來看一下,如圖 11-9 所示。


圖 11-9 邏輯分析儀抓取數(shù)據(jù)


對(duì)于 ASCII 碼表來說,數(shù)字本身是字符而非數(shù)據(jù),所以如果發(fā)送“12”的話,實(shí)際上是是分別發(fā)送了“1”和“2”兩個(gè)字符,單片機(jī)呢,先收到第一個(gè)字符“1”,在數(shù)碼管上會(huì)顯示出 31 這個(gè)對(duì)應(yīng)數(shù)字,但是馬上就又收到了“2”這個(gè)字符,數(shù)碼管瞬間從 31 變成了 32,而我們視覺上呢,是沒有辦法發(fā)現(xiàn)這種快速變化的,所以我們感覺數(shù)碼管直接顯示的是 32。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉