找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2717|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機串口通信筆記(中斷復(fù)習(xí))

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:424317 發(fā)表于 2020-2-22 13:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
        把單片機當做一個APP,中斷系統(tǒng)就是其中的一項功能。這個功能強不強大,是衡量一個APP的標準。
        這項功能的作用是幫助你處理突發(fā)事件的。我們做事都有個優(yōu)先級。你放在中斷系統(tǒng)里的事情肯定是要優(yōu)先處理的事情,所以當中斷觸發(fā)的時候,單片機要停下它當前做的事,來處理中斷中的事。也就是說,單片機要在中斷觸發(fā)時,停止運行主函數(shù)里的代碼,轉(zhuǎn)而運行中斷里的代碼。等到中斷的代碼運行完畢之后,再繼續(xù)運行主函數(shù)的代碼。
        中斷這一項功能是要手動打開的,所以在主函數(shù)的一開始就要先打開中斷系統(tǒng)的開關(guān)。也就是EA=1,
EA=0表示關(guān)掉所有的中斷,EA=1表示打開。
        中斷可以被6種方式觸發(fā),有以下六種。
        1.外部中斷0,當P3.2口輸入低電平時觸發(fā)
        2.外部中斷1,當P3.3口輸入低電平時觸發(fā)
        3.串行口中斷,當串口完成一幀數(shù)據(jù)的傳輸時
        剩下的自己看書或者數(shù)據(jù)手冊╮(╯▽╰)╭

        既然是六種觸發(fā)方式,那你就要在主函數(shù)一開始就要告訴單片機是那種。比如你想用P3.2口低電平觸發(fā),那么就要寫EX0=1,表示是外部中斷0,再寫IT0=1,表示低電平觸發(fā)。
        如果你想要用串行口中斷,你首先得把單片機串口這項功能打開。寫下:
        EA=1;//打開總中斷
        ES=1;//打開串口中斷
        REN=1;//允許串口接收
理論上就可以使用串口中斷。但是串口中斷的方式也不止一種。最常用的一種就是工作方式1。
        將串口設(shè)置成工作方式1的代碼是SM0=0; SM1=1; 這種方式下,單片機與計算機,或者單片機與單片機之間傳輸數(shù)據(jù)是一幀一幀的傳輸。一幀數(shù)據(jù)有十位,第一位和最后一位是標志位,用來告訴單片機發(fā)送的那一幀數(shù)據(jù)的開始和結(jié)束的,單片機會自動把這兩位剔除。每一幀數(shù)據(jù)發(fā)送完畢之后,一個叫TI的參數(shù)就會被置1,這時串行口中斷就會被觸發(fā);每一幀數(shù)據(jù)接收完畢之后,也會有一個參數(shù)被置1,叫RI,也會觸發(fā)中斷。
        下面看一段代碼:
void main()
{
        TMOD=0x20;                   //用定時器設(shè)置串口波特率           9600
        REN=1;          //串口初始化
        SM0=0;
        SM1=1;
        EA=1;           //開啟總中斷
        ES=1;
        while(1)
        {
                if(num==1)    //判斷是否有串口數(shù)據(jù)的傳送
                {
                        ES=0;
                        num=0;
                        SBUF=a;                         //發(fā)送數(shù)據(jù)a到SBUF,即將單片機的數(shù)據(jù)發(fā)送到計算機
                        while(!TI);
                        TI=0;
                        ES=1;
                }
        }        
}
void ser() interrupt 4
{
        RI=0;
        P2=SBUF;                        //接收數(shù)據(jù)SBUF,即將計算機的數(shù)據(jù)接收。
        a=SBUF;
        num=1;
}

        這段程序會先進行初始化,把該打開的打開,把串口中斷的模式設(shè)置好,然后進入while循環(huán)。while循環(huán)里的第一步,是計算機向單片機發(fā)送數(shù)據(jù),此時單片機已經(jīng)接收到了數(shù)據(jù),RI被置1,程序進入中斷,RI被清零,緩存在SBUF的數(shù)據(jù)賦值給a。然后跳出中斷,執(zhí)行if語句,關(guān)閉中斷,再將a賦值給發(fā)送緩存區(qū)。當數(shù)據(jù)從發(fā)送緩存區(qū)進入計算機時,TI會被置1,進而通過while循環(huán)。然后在清零TI,打開中斷,以便發(fā)送下一幀數(shù)據(jù)。

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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