/*==============================*/
/*
注意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 ;
}
}
}
}