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