亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 單片機(jī)串口通信筆記(中斷復(fù)習(xí)) [打印本頁]

作者: 鋼鐵俠mark-50    時(shí)間: 2020-2-22 13:59
標(biāo)題: 單片機(jī)串口通信筆記(中斷復(fù)習(xí))
        把單片機(jī)當(dāng)做一個(gè)APP,中斷系統(tǒng)就是其中的一項(xiàng)功能。這個(gè)功能強(qiáng)不強(qiáng)大,是衡量一個(gè)APP的標(biāo)準(zhǔn)。
        這項(xiàng)功能的作用是幫助你處理突發(fā)事件的。我們做事都有個(gè)優(yōu)先級(jí)。你放在中斷系統(tǒng)里的事情肯定是要優(yōu)先處理的事情,所以當(dāng)中斷觸發(fā)的時(shí)候,單片機(jī)要停下它當(dāng)前做的事,來處理中斷中的事。也就是說,單片機(jī)要在中斷觸發(fā)時(shí),停止運(yùn)行主函數(shù)里的代碼,轉(zhuǎn)而運(yùn)行中斷里的代碼。等到中斷的代碼運(yùn)行完畢之后,再繼續(xù)運(yùn)行主函數(shù)的代碼。
        中斷這一項(xiàng)功能是要手動(dòng)打開的,所以在主函數(shù)的一開始就要先打開中斷系統(tǒng)的開關(guān)。也就是EA=1,
EA=0表示關(guān)掉所有的中斷,EA=1表示打開。
        中斷可以被6種方式觸發(fā),有以下六種。
        1.外部中斷0,當(dāng)P3.2口輸入低電平時(shí)觸發(fā)
        2.外部中斷1,當(dāng)P3.3口輸入低電平時(shí)觸發(fā)
        3.串行口中斷,當(dāng)串口完成一幀數(shù)據(jù)的傳輸時(shí)
        剩下的自己看書或者數(shù)據(jù)手冊(cè)╮(╯▽╰)╭

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

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






歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1