第一個(gè)例子:
避免死循環(huán),一直發(fā)數(shù)據(jù)(用自設(shè)接收數(shù)據(jù)標(biāo)志位法,不用關(guān)串口中斷ES方法)flag必須放if語(yǔ)句中的最后位置,否則死循環(huán)
#include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar flag=0,temp; void init() { TMOD=0X20;//定時(shí)器1方式2作為波特率發(fā)生器 TH1=0XF3;//裝初值 波特率為4800bps的初值 TL1=0XF3; TR1=1;//啟動(dòng)定時(shí)器1 SCON=0X50;//設(shè)置串口工作方式為方式1 PCON=0X80;//加倍波特率后為4800 EA=1;//開(kāi)總中斷 ES=1;//允許串口中斷 TI=0;//清發(fā)送中斷標(biāo)志位 RI=0;//清接收中斷標(biāo)志位 } void main() { init(); while(1) { if(flag==1) { //ES=0;//flag為1說(shuō)明接收完引起中斷 //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ù)沒(méi)發(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 { flag=1; }
----------------------第2個(gè)例子:-----------------------------------------------
/*********************************************** 中斷法串口通信(用關(guān)串口中斷ES方法)推薦不丟幀 ***********************************************/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar flag=0,temp; void init() { TMOD=0X20;//定時(shí)器1方式2作為波特率發(fā)生器 TH1=0XF3;//裝初值 波特率為4800bps的初值 TL1=0XF3; TR1=1;//啟動(dòng)定時(shí)器1 SCON=0X50;//設(shè)置串口工作方式為方式1 PCON=0X80;//加倍波特率后為4800 EA=1;//開(kāi)總中斷 ES=1;//允許串口中斷 TI=0;//清發(fā)送中斷標(biāo)志位 RI=0;//清接收中斷標(biāo)志位 } void main() { init(); while(1) { if(flag==1) { ES=0;//flag為1說(shuō)明接收完引起中斷,關(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ù)沒(méi)發(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; }