您的位置:首页 > 其它

串口中断方式实现FIFO

2015-11-13 16:55 246 查看
/*==============================*/

/*

注意1: Keil默认的Memorymode是

small:Variables in Data,需要改为

large:Variables in XData,在Target1

中进行修改 ,这是因为我定义的数组

太大了

注意2: 这里只能字母和数字,中文可能

出现乱码

*/

/*==============================*/ 

 

#include<reg52.h>

#define unchar unsigned char

#define MAXSIZE 100

 

 

/*======================*/

/*******定义结构体 ******/

/*======================*/ 

typedef struct{

   unchar DataBuffer[MAXSIZE] ;

   int count ; //存储数据的实际数量

   int font  ; //指向要发送的数据

}DataStruct ;

 

/*======================*/

/*******定义全局变量*****/

/*======================*/

//unchar DataBuffer ; //缓存单个数据

DataStruct RData ; //接收缓存多个数据

DataStruct SData ; //发送缓存多个数据

 

bit FirstSendFlag ;  //第一次发送数据标志

bit HaveDataFlag ;
//有数据发送标志

bit EnableSendFlag ; //能发送数据标志

 

/*======================*/

/*******函数声明*********/

/*======================*/

void InitHardware(void) ;

void InitVariable(void) ;

void SendByte(unchar ch) ;

void SendStr(unchar str[]) ;

 

 

 

/*======================*/

/*******0.主函数*********/

/*======================*/

int main(){

   InitHardware() ;//初始化硬件

InitVariable() ;//初始化变量

 

    SendStr("\r\n\n 使用View中serial window的UART调试!");

    SendStr("\r\n中断方式接收,请输入字符:");

 

while(1){

 

  if(HaveDataFlag==1){

 if( (FirstSendFlag==1)&&(TI==0) )

   {

 FirstSendFlag = 0 ;

 TI = 1 ;

   }

 EnableSendFlag = 1 ;

}

}

 

return 0 ;

}

 

 

/*======================*/

/****1.初始化硬件函数****/

/*======================*/

void InitHardware(void){

  TMOD = 0x20 ; // TMOD: timer 1, mode 2, 8-bit 重装

  TL1  = 0xFD ; // TH1:  重装值 9600 波特率 晶振 11.0592MHz  

  TH1  = 0xFD ;

  TR1  = 1 ;

 

  SCON = 0x50 ;// SCON: 模式 1, 8-bit UART, 使能接收  

  ES   = 1 ;

  EA   = 1 ;

 

}

 

 

/*======================*/

/**2.初始化全局变量函数**/

/*======================*/

void InitVariable(void){

//   DataBuffer    = 1 ;

   FirstSendFlag = 1 ;

   HaveDataFlag  = 0 ;

   EnableSendFlag= 0 ;

 

   RData.count   = 0 ;

   RData.font  = 0 ;

   SData.count  = 0 ;

   SData.font  = 0 ;

}

 

 

/*======================*/

/******3.发送一个字节****/

/*======================*/

void SendByte(unchar ch){

SData.DataBuffer[SData.count++] = ch ;

 

}

 

 

 

/*======================*/

/******4.发送字符串******/

/*======================*/

void SendStr(unchar str[]){

  while( *str!='\0' ){

     SendByte(*str) ;

  str++ ;

  }

  if( (FirstSendFlag==1)&&(TI==0) )

   {

 FirstSendFlag = 0 ;

 TI = 1 ;

   }

   EnableSendFlag = 1 ;

}

 

 

 

/*======================*/

/*******5.中断函数*******/

/*======================*/

void UserInterrupt(void) interrupt 4{

//接收中断

if(RI==1){

  RI = 0 ;

  RData.DataBuffer[RData.count] = SBUF ;
//接收数据

  SData.DataBuffer[SData.count] = RData.DataBuffer[RData.count] ;//

  RData.count++ ;

  SData.count++ ;

  HaveDataFlag = 1 ;//进入主函数的if中

  if(RData.count==MAXSIZE){

   SData.font     = 0 ;

SData.count    = 0 ;

RData.font     = 0 ;

RData.count    = 0 ;

  }

}

//发送中断

if(TI==1){

   if(EnableSendFlag==1 ){

      TI =0 ;

  SBUF = SData.DataBuffer[SData.font] ;//发送数据

  SData.font++ ; //

  if(SData.font>=SData.count){

   EnableSendFlag = 0 ;

HaveDataFlag   = 0 ;

SData.font     = 0 ;

SData.count    = 0 ;

RData.font     = 0 ;

RData.count    = 0 ;

  }

   }

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单片机