新聞中心

        中斷法串口通信

        作者: 時(shí)間:2012-08-06 來源:網(wǎng)絡(luò) 收藏

        第一個(gè)例子:

        避免,一直發(fā)數(shù)據(jù)(用自設(shè)接收數(shù)據(jù)標(biāo)志位法,不用關(guān)串口中斷ES方法)flag必須放if語句中的最后位置,否則

        #includereg52.h>#define uchar unsigned char#define uint  unsigned intuchar flag=0,temp; void init(){TMOD=0X20;//定時(shí)器1方式2作為波特率發(fā)生器TH1=0XF3;//裝初值 波特率為4800bps的初值TL1=0XF3;TR1=1;//啟動(dòng)定時(shí)器1SCON=0X50;//設(shè)置串口工作方式為方式1PCON=0X80;//加倍波特率后為4800EA=1;//開總中斷ES=1;//允許串口中斷TI=0;//清發(fā)送中斷標(biāo)志位RI=0;//清接收中斷標(biāo)志位}void main(){init();while(1){if(flag==1){//ES=0;//flag為1說明接收完引起中斷//flag=0;//清中斷標(biāo)志RI=0;//對(duì)接收中斷標(biāo)志清零,為下一幀數(shù)據(jù)接收作準(zhǔn)備temp=SBUF;//讀入接收數(shù)據(jù),在不關(guān)中斷ES前提下,CPU讀入接收數(shù)據(jù)也不會(huì)引起中斷,
        接收數(shù)據(jù)由接收SBUF接收緩存器自動(dòng)執(zhí)行P0=temp;  //讀入數(shù)據(jù)送P0口SBUF=temp; //向發(fā)送方返回接收數(shù)據(jù)//TI=0;    //要等待發(fā)送完,否則數(shù)據(jù)沒發(fā)送完TI=0,flag=0已經(jīng)執(zhí)行//flag=0;  //發(fā)送完后引起中斷,flag又置1,進(jìn)入,一直發(fā)數(shù)據(jù)while(!TI);//等待發(fā)送完,!!要等待!!TI=0;//數(shù)據(jù)發(fā)送完對(duì)發(fā)送中斷標(biāo)志清零,為下一幀數(shù)據(jù)發(fā)送作準(zhǔn)備flag=0; //必須有否則進(jìn)入死循環(huán),放最后//ES=1;//允許串口中斷繼續(xù)接收數(shù)據(jù)}}}void serial() interrupt 4{flag=1;}

        ----------------------第2個(gè)例子:-----------------------------------------------

        /***********************************************(用關(guān)串口中斷ES方法)推薦不丟幀***********************************************/#includereg52.h>#define uchar unsigned char#define uint  unsigned intuchar flag=0,temp; void init(){TMOD=0X20;//定時(shí)器1方式2作為波特率發(fā)生器TH1=0XF3;//裝初值 波特率為4800bps的初值TL1=0XF3;TR1=1;//啟動(dòng)定時(shí)器1SCON=0X50;//設(shè)置串口工作方式為方式1PCON=0X80;//加倍波特率后為4800EA=1;//開總中斷ES=1;//允許串口中斷TI=0;//清發(fā)送中斷標(biāo)志位RI=0;//清接收中斷標(biāo)志位}void main(){init();while(1){if(flag==1){ES=0;//flag為1說明接收完引起中斷,關(guān)串口中斷,處理當(dāng)前幀flag=0;//清中斷標(biāo)志RI=0;//對(duì)接收中斷標(biāo)志清零,為下一幀數(shù)據(jù)接收作準(zhǔn)備,此處清零不丟幀temp=SBUF;//讀入接收數(shù)據(jù),在不關(guān)中斷ES前擔(dān)下,CPU讀入接收數(shù)據(jù)也不會(huì)引起中斷,
        接收數(shù)據(jù)由接收SBUF接收緩存器自動(dòng)執(zhí)行P0=temp;  //讀入數(shù)據(jù)送P0口SBUF=temp; //向發(fā)送方返回接收數(shù)據(jù)//TI=0;    //要等待發(fā)送完,否則數(shù)據(jù)沒發(fā)送完TI=0,flag=0已經(jīng)執(zhí)行//flag=0;  //發(fā)送完后引起中斷,flag又置1,進(jìn)入死循環(huán),一直發(fā)數(shù)據(jù)while(!TI);//等待發(fā)送完,!!要等待!!TI=0;//數(shù)據(jù)發(fā)送完對(duì)發(fā)送中斷標(biāo)志清零,為下一幀數(shù)據(jù)發(fā)送作準(zhǔn)備//flag=0; //必須有否則進(jìn)入死循環(huán),放最后ES=1;//允許串口中斷繼續(xù)接收數(shù)據(jù)}}}void serial() interrupt 4//執(zhí)行此句,即產(chǎn)生中斷表示數(shù)據(jù)已接收完{//RI=0;//不在此清零接收中斷標(biāo)志,否則接收SUBF處于一直接收狀態(tài),
        中斷一直進(jìn)行影響其它指令進(jìn)行,造成返回丟幀現(xiàn)象實(shí)驗(yàn)得出flag=1;}


        評(píng)論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 马龙县| 砀山县| 江门市| 逊克县| 卢龙县| 衡南县| 弥勒县| 蓬安县| 沙坪坝区| 木里| 壶关县| 故城县| 赣榆县| 萍乡市| 中阳县| 镶黄旗| 金昌市| 剑河县| 衡山县| 双辽市| 阿勒泰市| 鄯善县| 平南县| 定南县| 边坝县| 获嘉县| 井陉县| 红安县| 青铜峡市| 西华县| 宁强县| 保德县| 石城县| 桂阳县| 旅游| 靖江市| 保康县| 巴南区| 蓬安县| 营山县| 青岛市|