專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

中斷法串口通信

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年02月11日   【字體:

第一個(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;
}
關(guān)閉窗口

相關(guān)文章