新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 52單片機(jī)串口中斷知識(shí)

52單片機(jī)串口中斷知識(shí)

作者: 時(shí)間:2016-11-13 來(lái)源:網(wǎng)絡(luò) 收藏
1、單片機(jī)每“次”的確只能接收1個(gè)字節(jié),但由于串口的速度實(shí)在太低,通常都在115200bps以下(即使用了同步方式也“只能”達(dá)到1Mbps)。注意,是bps,位/秒,而不是“字節(jié)/秒”,這就是“串”行通信,要至少8個(gè)“bps時(shí)間”才能接收一個(gè)完整的字符,事實(shí)上,加上起始位等,8個(gè)位往往傳送不了一個(gè)字節(jié)(不知道我的理解是不是有偏差),這就是說(shuō),速度至少還要再慢上8倍。


2、帶有USART的單片機(jī)里USART一般都是做為“外部設(shè)備”,獨(dú)立于MCU進(jìn)行收發(fā)工作,即其收發(fā)過(guò)程中的串-并和并-串轉(zhuǎn)換以及數(shù)據(jù)IO過(guò)程都是“自主”和“自動(dòng)”的,不需要CPU逐位進(jìn)行收發(fā)處理,因此,在CPU將數(shù)據(jù)送到SBUF后,便可以放手不管了,USART收發(fā)器會(huì)自動(dòng)將SBUF的內(nèi)容轉(zhuǎn)換成串行數(shù)據(jù)發(fā)送出去。接收時(shí)也是由USART將串行數(shù)據(jù)轉(zhuǎn)成并行數(shù)據(jù)并存放到SBUF后才會(huì)通知MCU(產(chǎn)生接收中斷)。MCU所需要做的只是往SBUF送數(shù)或從SBUF中取數(shù)(都只要1個(gè)指令周期)。

3、設(shè)置串口參數(shù)的時(shí)候應(yīng)該能看出,為了適應(yīng)串口的慢,不得不動(dòng)用定時(shí)器進(jìn)行延時(shí),以“產(chǎn)生”所需要的波特率,而這個(gè)“延時(shí)”通常都要給8位甚至16位定時(shí)器設(shè)置初值,定時(shí)器每一次計(jì)數(shù)都需要一個(gè)指令周期,即CPU可以執(zhí)行一條指令的時(shí)間,而定時(shí)器兩次串口溢出才僅僅接收或發(fā)送一個(gè)“位”,接收一個(gè)字節(jié)需要數(shù)倍于此的時(shí)間,那么這么長(zhǎng)的時(shí)間對(duì)CPU來(lái)說(shuō),足以從容地從SBUF里取出數(shù)據(jù)并對(duì)其進(jìn)行處理了。

4、即使CPU的任務(wù)相當(dāng)繁重,或?qū)邮盏降拿總€(gè)字節(jié)都需要進(jìn)行相當(dāng)復(fù)雜的處理,我們也完全可以通過(guò)建立接收緩沖區(qū)的方式將暫時(shí)來(lái)不及處理的數(shù)據(jù)暫存起來(lái),等CPU空閑時(shí)再做處理。而從SBUF取出數(shù)據(jù)并保存到緩沖區(qū)只需要很少的幾條指令就能完成,不會(huì)影響到串口繼續(xù)接收。

5、標(biāo)準(zhǔn)的RS-232協(xié)議并非只有TX、RX和GND三個(gè)引腳,即便是最簡(jiǎn)單的9針插口,也專門設(shè)計(jì)了檢測(cè)傳輸狀態(tài)和收發(fā)請(qǐng)求的針腳。如果單片機(jī)真的實(shí)在無(wú)法及時(shí)完成收發(fā)動(dòng)作,也完全可以利用一個(gè)口線作為狀態(tài)標(biāo)識(shí),使PC能夠知道單片機(jī)什么時(shí)候可以接收數(shù)據(jù),而不會(huì)任由數(shù)據(jù)丟失。

6、為了增加數(shù)據(jù)傳輸?shù)目煽啃裕罅繑?shù)據(jù)傳輸時(shí)通常都會(huì)采用CRC校驗(yàn)方式,并以“包”或“幀”的方式發(fā)送有格式約定的字節(jié)流,而非單個(gè)字符,這樣一來(lái),完全可以通過(guò)約定一些“通信協(xié)議”的方式,使收發(fā)雙方都能夠及時(shí)知道接收的數(shù)據(jù)是否完整,并及時(shí)重發(fā)新發(fā)送出錯(cuò)的數(shù)據(jù)。

本文引用地址:http://2s4d.com/article/201611/316316.htm

# include
#include
typedef unsigned char unchar ;
unsigned char ch;
bit read_flag= 0 ;

void init_serialcom( void ) //串口通信初始設(shè)定

{

SCON = 0x50 ; //UART為模式1,8位數(shù)據(jù),允許接收

TMOD = 0x20 ; //定時(shí)器1為模式2,8位自動(dòng)重裝

PCON = 0x80 ; //SMOD=1;

TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz

TL1 = 0xFD ;
IE = 0x90 ; //Enable Serial Interrupt

TR1 = 1 ; // timer 1 run

// TI=1;

}

//向串口發(fā)送一個(gè)字符

void send_char_com( unchar ch)

{

SBUF=ch;

while (TI== 0);

TI= 0 ;

}

//串口接收中斷函數(shù) 功能:串口中斷。如果有數(shù)據(jù)從串口發(fā)送過(guò)來(lái),首先從串口中讀出數(shù)據(jù),賦給串口緩沖數(shù)組,清中斷標(biāo)志(RI和TI中有一個(gè)為1就會(huì)馬上進(jìn)入中斷服務(wù)子程序)

void serial () interrupt 4 using 3

{

if (RI)

{

RI = 0 ;

ch=SBUF;

read_flag= 1 ; //就置位取數(shù)標(biāo)志

}

}

void main()

{

init_serialcom(); //初始化串口

while ( 1 )

{

if (read_flag) //如果取數(shù)標(biāo)志已置位,就將讀到的數(shù)從串口發(fā)出

{

read_flag= 0 ; //取數(shù)標(biāo)志清0

send_char_com(ch);

}

}

}



關(guān)鍵詞: 52單片機(jī)串口中

評(píng)論


技術(shù)專區(qū)

關(guān)閉