c51微控制器上的傳送中斷標誌位
阿新 • • 發佈:2019-01-09
對於一些大多數微控制器,他有一個專門的標誌位來給串列埠的傳送或接受資料做判斷。
比如c51中,TIx和RIx。
TIx標識資料緩衝區的資料是否傳送完畢,TIx = 1,表示傳送完畢,TIx= 0,表示還沒傳送結束。
所以一個很簡單的傳送程式:
for(i=0;i<len;i++)
{
while(!TI0);
TI0=0;
SBUF0 = s_data[i];
}
像上面程式這樣來發送資料。
但是,上面程式有可能出現問題,有時你會發現微控制器一直髮送不了資料,或傳送的資料有些問題。
斷點除錯下你就會發現,微控制器不傳送資料的原因就是一直停留在while(!TI0)語句中。還好只是這樣,如果是複雜的應用,導致資料錯位或其他的,要找到原因還真麻煩啊。
問題原因很簡單,就是如果程式在這之前沒通過串列埠傳送過資料呢?
比如下面的初始化:
看起來都沒問題,但是,TI呢?void UART0_Init() { unsigned char SFRPAGE_SAVE = SFRPAGE; SFRPAGE = UART0_PAGE; SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX SSTA0 = 0x15; SFRPAGE = TMR2_PAGE; TMR2CN = 0x00; TMR2CF = 0x08; RCAP2L = (-((unsigned int)(SYSCLK / BAUDRATE) >> 4 )); RCAP2H = (-((unsigned int)(SYSCLK / BAUDRATE) >> 4 )>>8); TMR2L = RCAP2L; TMR2H = RCAP2H; TR2 = 1; SFRPAGE = SFRPAGE_SAVE; }
TI預設0,沒錯,因為壓根沒傳送資料,哪有傳送完成。可巧好我們需要的條件是傳送完成...
於是,很簡單:
for(i=0;i<len;i++)
{
while(!TI0);
TI0=0;
SBUF0 = s_data[i];
}