找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2860|回復(fù): 7
收起左側(cè)

關(guān)于51單片機(jī)串口中斷,為什么中斷函數(shù)中還要判斷RI==1

[復(fù)制鏈接]
ID:1004408 發(fā)表于 2022-2-9 21:16 | 顯示全部樓層 |閱讀模式
初學(xué)51,學(xué)到串口通信,了解了串口中斷進(jìn)入中斷程序是接收到數(shù)據(jù)RI置1,但是既然只有RI置1才能進(jìn)入中斷,為什么中斷函數(shù)中還要判斷RI==1
既然存在,必有其合理之處,煩請(qǐng)各位大佬解釋一下!謝謝!

單片機(jī)源程序如下:
#include <REGX52.H>
#include <intrins.h>

void UART_Init()
{
        SCON=0x50;//8位
        PCON &= 0x7F;//
        TMOD &= 0x0F;//高四位清零
        TMOD |= 0x20;//高四位賦值
        TH1=0xFD;
        TL1=0xFD;
        ET1=0;//禁止定時(shí)器1中斷
        TR1=1;//開啟計(jì)時(shí)
        
        EA=1;
        ES=1;//串口中斷允許
        /*因?yàn)椴恢朗裁磿r(shí)候會(huì)收到信息,但也不能一直等待
        所以就用了串口中斷!
        */
}

void main()
{
        UART_Init();
        while(1)
        {
               
        }
}
void js() interrupt 4//串口中斷---進(jìn)入中斷的條件就是TI/RI置1(串口發(fā)送或接收完成TI和RI中斷),并且需要軟件置零
{
//        P2=0x00;       //此時(shí)不管你發(fā)送什么,他都會(huì)亮,因?yàn)橹灰邮盏叫盘?hào),他就會(huì)進(jìn)入中斷
        if(RI==1)       //RI---receive就是收到數(shù)據(jù)
                {              
                P2=~SBUF;
                RI=0;//軟件置零
        }
}
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-2-9 22:33 | 顯示全部樓層
除了 RI==1  ,
TI == 1  也能進(jìn)入中斷,所以,不僅僅要判斷RI,還要判斷TI。
當(dāng)然,你也可以認(rèn)為 RI == 0 的時(shí)候,是因?yàn)門I ==1 進(jìn)入的中斷。
回復(fù)

使用道具 舉報(bào)

ID:878061 發(fā)表于 2022-2-9 23:23 | 顯示全部樓層
是的,在你這個(gè)程序里面也許可以省略,但是串口中斷可以是接收中斷也可以是發(fā)送中斷,所以要進(jìn)行判斷
回復(fù)

使用道具 舉報(bào)

ID:514254 發(fā)表于 2022-2-10 00:20 | 顯示全部樓層
interrupt 4是串行的中斷號(hào),但是包含了發(fā)送TI和接收RI串行中斷,因此進(jìn)入到中斷里面不一定是由接收RI引起的,因此需要判斷下,不過(guò)一般發(fā)送用子程序,是主動(dòng)過(guò)程,接收進(jìn)中斷,但是需要簡(jiǎn)單判斷下。
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-2-10 00:43 | 顯示全部樓層
//串口中斷---進(jìn)入中斷的條件就是TI/RI置1(串口發(fā)送或接收完成TI和RI中斷),并且需要軟件置零
/*----------------------------
STC-ISP 范例
----------------------------*/
void Uart_Isr() interrupt 4
{
    if (RI)
    {
        RI = 0;             //Clear receive interrupt flag
        P0 = SBUF;          //P0 show UART data
    }
    if (TI)
    {
        TI = 0;             //Clear transmit interrupt flag
        busy = 0;           //Clear transmit busy flag
    }
}
回復(fù)

使用道具 舉報(bào)

ID:1004408 發(fā)表于 2022-2-10 17:07 | 顯示全部樓層
lkc8210 發(fā)表于 2022-2-10 00:43
//串口中斷---進(jìn)入中斷的條件就是TI/RI置1(串口發(fā)送或接收完成TI和RI中斷),并且需要軟件置零
/*------- ...

懂了,謝謝大佬
回復(fù)

使用道具 舉報(bào)

ID:1004408 發(fā)表于 2022-2-10 17:08 | 顯示全部樓層
188610329 發(fā)表于 2022-2-9 22:33
除了 RI==1  ,
TI == 1  也能進(jìn)入中斷,所以,不僅僅要判斷RI,還要判斷TI。
當(dāng)然,你也可以認(rèn)為 RI ==  ...

好滴,謝謝大佬
回復(fù)

使用道具 舉報(bào)

ID:1004408 發(fā)表于 2022-2-10 17:08 | 顯示全部樓層
huashanhui20 發(fā)表于 2022-2-9 23:23
是的,在你這個(gè)程序里面也許可以省略,但是串口中斷可以是接收中斷也可以是發(fā)送中斷,所以要進(jìn)行判斷

謝謝大佬
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表