源程序如下: #include"reg51.h" #include <string.h> #define uchar unsigned char #define uint unsigned int char temp;
char * data_string; char * data_back;
//******************函数声明****************** char Re_str(uchar *ans); char Re_char(void); //void Data_deal(char *data2); void Tr_char(char c); char Tr_str(char *data1); void Check_re(void); void Check_tr(void); void delay10mx(int count1);
void serial(void)interrupt 4 using 1 //串口中断服务程序 { uint i; ES=0; //禁止串口中断 P0=0xff;// 灯全灭,说明进入串口中断 while(1){ temp=Re_str(data_string); // 接收数据,将接收到的数据给data_string字符串 if(strncmp(data_string,"ok",2)==0)//判断接收到的字符串是否ok,若是,则处理该数据,然后返回 { P0=0xfe;//最后一个灯亮,说明接收到“ok”,并成功判断出来 Data_deal(data_back);//处理上次收到的字符串 break; } else if(strncmp(data_string,"err",3)==0)//若接收到的数据是err,直接退出中断服务程序 { P0=0xfd;//倒数第二个灯亮,说明接收到“err”并且成功判断出来 break; } else { strcpy(data_back,data_string); P0=0xfb;//倒数第3个灯亮,说明接收到数据不是“ok”或“err” Tr_str(data_string);//若收到的数据既非ok亦非err,则将该数据原样返回 } for(i=0;i<temp;i++) { delay10mx(200); P0=data_string; }
//P0=0x02;/ } ES=1; //允许串口中断 }
void delay10mx(int count1) { int l ,j ,k; for (l=0;l<count1;l++) for (j=0;j<10;j++) for (k=0;k<120;k++) ; } /**********接收一个字符****************************/ char Re_char(){ char c; Check_re(); c=SBUF; return c; }
/************ 接收字符串*************************/ char Re_str(uchar *ans) { char i=0; while(1){ P0=0x7f;// 第一个灯亮,说明进入字符串接收 ans=Re_char(); //接收字符 P0=0xbf;//第2个灯亮,说明接收完一个字符 if(i>2&&((ans==0x0a)||(ans==0x0d)||(ans==0x00))) break; //收到3个以上字符并收到回车返回 else i++; } i++; ans=0x00; //末字节加0x00 P0=0xdf; //第3个灯亮,说明接收完一串 return i; //接收字符串长度 }
/***********判断是否接收完一个字符********** di****/ void Check_re(){ while(RI==0); RI=0;// 清接收完毕标志位 } /***********判断是否发送完一个字符*******************/ void Check_tr(){ while(TI==0); TI=0;// 清发送完毕标志位
}
/************发送一个字符*************************/ void Tr_char(uchar c){ SBUF=c; //发送字符 Check_tr(); //等待发送完毕 return; } /***********发送一个字符串***********************/ void Tr_str(uchar *data1){ char i=0; while(data1!=0x00) { Tr_char(data1); i++; } return; }
main(void) { P0=0x00; TMOD=0x20; //T1工作方式2 TH1=0xfd; //串口波特率为9600 SCON=0x50; //串口工作于方式1并允许接受 TR1=1; //启动T1 ES=1; //允许串口中断 EA=1; //允许全部外设中断 while(1); }
|