串口中断方式实现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 ;
}
}
}
}
/*
注意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 ;
}
}
}
}
相关文章推荐
- 51单片机的中断整理
- 时钟+温度+遥控设置,综合时钟例子
- 温度传感器+I2C+串口+PC上位机(pyserial)例子
- 51单片机中data,idata,xdata,pdata的区别
- 什么叫51单片机最小系统
- 用串口连接GSM手机发送和接收短消息,在应用程序中如何编程实现?
- MCU之心路分享
- 按键led
- 单片机学会释放CPU
- 单片机无线串行接口电路设计
- 单片机无线串行接口电路设计
- 单片机系统中的红外通信接口
- 单片机系统中的红外通信接口
- 单片机实现接收从电脑发送过来的字符串的方法
- 单片机IO口模拟串口程序(发送+接收
- DSP、ARM和单片机的区别
- 转:接地:数字地、模拟地、信号地、交流地、直流地、屏蔽地、浮地
- 单片机存储器之flash,eeprom,sram,dram简介
- 程序状态字(PSW)的动画说明,
- 51单片机