#include <AT89X51.h> #define uchar unsigned char #define uint unsigned int #define FRM_STAR 0x02 #define FRM_END 0xEC #define CMD_SUC 0x01 #define CMD_FAI 0x02 #define CMD_BUZ_ON 0x03 #define CMD_BUZ_OFF 0x04 #define CMD_TEMDATA 0x05 uchar Rec[3]; uchar RecOk=0; uchar RecPosition = 0; uchar Recving = 0; uchar RecEnable = 1; uchar CmdSUC[]={FRM_STAR,CMD_SUC,FRM_END}; uchar CmdFAI[]={FRM_STAR,CMD_FAI,FRM_END}; uchar CmdTemDatHea[]={FRM_STAR,CMD_SUC}; void ComSedOneByte(uchar dat) { bit EStemp; EStemp = ES; ES =0; //关串口中断 SBUF=dat; while(TI==0); TI=0; ES =EStemp; } void ComSedBytes(uchar * dat,uchar len) { uchar i; bit EStemp; EStemp = ES; ES =0; //关串口中断 for(i=0;i<len;i++) { SBUF=*(dat+i); while(TI==0); TI=0; } ES =EStemp; } void SedTemDat(uchar *psdata,uchar datalen) { ComSedBytes(CmdTemDatHea,sizeof(CmdTemDatHea)); ComSedOneByte(datalen); ComSedBytes(psdata,datalen); ComSedOneByte(FRM_END); } SedCmdSuc() { ComSedBytes(CmdSUC,sizeof(CmdSUC)); } SedCmdFai() { ComSedBytes(CmdFAI,sizeof(CmdFAI)); } void serial() interrupt 4 using 3 { uchar temp; if (RI) //RI==开始接收 { temp = SBUF; if(RecEnable == 1) { if(Recving == 0) { Recving = 1; RecPosition = 0; RecOk = 0; } if(RecPosition < 3) { //没有接收完毕 Rec[RecPosition]=temp; //将接收到的数据存入缓存 RecPosition ++; //接收数据量加一 if(RecPosition == 3) //数据包的长度是3,如果达到数据包的长度数据接收完毕 { Recving = 0; RecOk = 1; } } } REN=1; //允许接收 RI = 0 ; //串口中断清0 } if(TI) { TI = 0; } } main() { uchar psdata[2]; uint j; uchar buzzeon[]={0x23,0x33}; uchar buzzeoff[]={0x33,0x44}; uchar temdata[]={0x22,0x11}; psdata[0]=1; psdata[1]=2; //init timer TMOD= 0x20; //定时器1定时方式2 // 0010 0000 (GATE C/T M1 M0 : D7 D6 D5 D4)(GATE C/T M1 M0 : D3 D2 D1 D0) TH1= 0xe6; //12MHz 1200波特率 TL1= 0xe6; TR1= 1; //启动定时器 //init scom SCON= 0x40; //串口方式1 // 0100 0000 (SM0 SM1 SM2 : D7 D6 D5)(REN : D4)(TB8 RB8 : D3 D2)(TI RI : D1 D0) //[SM0 SM1 : 0 1]10bit 异步收发.[SM2 : 0]接收到字符RI就置位.[REN : 0]禁止接收.[TI : 0]/[RI : 0]发送接收中断,硬件置位软件清0 PCON=0; //SMOD=0 // 0000 0000 (SMOD : D7)(GF1 GF0 : D3 D2)(PF IDL : D1 D0) 设置波特率 EA = 1; //开中断 ES =1; //开串口中断 REN=1; //允许接收 P0=0x0; Recving = 0; RecPosition = 0; RecOk = 0; RecEnable = 1; while(1) { if(Recving == 1) { j = 0; for(j=0;j<4000;j++); if(RecOk == 0) { RecPosition = 0; Recving = 0; RecEnable = 1; } } if(RecOk == 1) { RecEnable = 0; if((Rec[0] == FRM_STAR)&&(Rec[2] == FRM_END)) { switch(Rec[1]) { case CMD_BUZ_ON: P2_1=0; SedCmdSuc(); break; case CMD_BUZ_OFF: P2_1=1; SedCmdSuc(); break; case CMD_TEMDATA: SedTemDat(temdata,sizeof(temdata)); break; default: SedCmdFai(); break; } } else { SedCmdFai(); } RecOk=0; RecPosition = 0; Recving = 0; RecEnable = 1; } } }