⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.h

📁 这是52单片机串口调试程序
💻 H
字号:
void Serial_init(void)
{
	Set_28F040_Page(1);
	Machine_ID=Flash[0x2400];
	if((Machine_ID<101)||(Machine_ID>132)){
		b_Serial_mode=RS232_MODE;
		Machine_ID=0x53;
		RS485_SEND
	}else{
		b_Serial_mode=RS485_MODE;
		RS485_RECV
	}
	Recv_pointer=Recv_stat=0;
	b_Recv_done=0;
	b_Send_busy=0;
	Send_buf[0]=Send_buf[1]=Send_buf[2]=Machine_ID;
	if(b_Serial_mode==RS232_MODE){
#ifdef	BAUD_57600
		RCAP2L=0xFA;  RCAP2H=0xFF;			// 11.0592MHz 57600B=0xFFFA(-6)
#else
		RCAP2L=0xDC;  RCAP2H=0xFF;			// 11.0592MHz  9600B=0xFFDC(-36)
#endif
	}else{	// RS485 mode
		RCAP2L=0xFA;  RCAP2H=0xFF;			// 11.0592MHz 57600B=0xFFFA(-6)
	}
}

void Send_Data(void)
{
	BYTE i, j;
	j=Send_buf[5];
	for(i=6; i<22; i++)
		j+=Send_buf[i];
	Send_buf[22]=0-j;
	Send_pointer=1;
	b_Send_busy=1;
	if(b_Serial_mode==RS485_MODE)
		RS485_SEND
	SBUF=Send_buf[0];
}

void Serial_interrupt(void) interrupt SIO_VECTOR
{
	BYTE s;
	if(RI){
		RI=0;
		s=SBUF;
		switch(Recv_stat){
			case 0:
				if(s==Machine_ID)
					Recv_stat=1;
				break;
			case 1:
				if(s==Machine_ID)
					Recv_stat=2;
				else
					Recv_stat=0;
				break;
			case 2:
				if(s==Machine_ID){
					Recv_stat=3;
					Recv_pointer=0;
				}else
					Recv_stat=0;
				break;
			case 3:
				Recv_buf[Recv_pointer]=s;
				Recv_pointer++;
				Recv_stat=4;
				break;
			case 4:
				if(s==(~Recv_buf[0]))
					Recv_stat=5;
				else
					Recv_stat=0;
				break;
			case 5:
				Recv_buf[Recv_pointer]=s;
				Recv_pointer++;
				if(Recv_pointer==19){
					Recv_stat=0;
					b_Recv_done=1;
					REN=0;
				}
				break;
		}
	}else{
		TI=0;
		if(Send_pointer<23){
			SBUF=Send_buf[Send_pointer];
			Send_pointer++;
		}else{
			b_Send_busy=0;
			if(b_Serial_mode==RS485_MODE)
				RS485_RECV
		}
	}
}

void Recv_Process(void)
{
	BYTE i, j;
	j=Recv_buf[1];
	for(i=2; i<19; i++)
		j+=Recv_buf[i];
	if(j==0){
		switch(Recv_buf[0]){
			case 0:	// Get User/Total_record/Version
				if(!b_Send_busy){
					Send_buf[3]=0;  Send_buf[4]=~0;
					Send_buf[5]=Total_User%256;    Send_buf[6]=Total_User/256;
					Send_buf[7]=Total_Record%256;  Send_buf[8]=Total_Record/256;
					Send_buf[9]='V';   Send_buf[10]='1';
					Send_buf[11]='.';  Send_buf[12]='1';
					for(i=13; i<22; i++)
						Send_buf[i]=0;
					Send_Data();
				}
				break;
			case 1:	// Read user infomation
				if(!b_Send_busy){
					Set_28F040_Page(8);
					Flash_p=Recv_buf[2]*256+Recv_buf[1];
					Send_buf[3]=1;  Send_buf[4]=~1;
					for(i=0; i<17; i++)
						Send_buf[i+5]=Flash[Flash_p+i];
					Send_Data();
				}
				break;
			case 2:	// Calculate USER and RECORD
				Calc_Total_User();
				Calc_Total_Record();
				if(!b_Send_busy){
					Send_buf[3]=2;  Send_buf[4]=~2;
					Send_buf[5]=Total_User%256;    Send_buf[6]=Total_User/256;
					Send_buf[7]=Total_Record%256;  Send_buf[8]=Total_Record/256;
					Send_buf[9]='V';   Send_buf[10]='1';
					Send_buf[11]='.';  Send_buf[12]='1';
					for(i=13; i<22; i++)
						Send_buf[i]=0;
					Send_Data();
				}
				break;
			case 3:	// Write user information
				Set_28F040_Page(8);
				Flash_p=Total_User*17;
				Total_User++;
				for(i=0; i<17; i++)
					Write_28F040(Flash_p+i, Recv_buf[i+1]);
				if(!b_Send_busy){
					Send_buf[3]=3;  Send_buf[4]=~3;
					for(i=0; i<17; i++)
						Send_buf[i+5]=Flash[Flash_p+i];
					Send_Data();
				}
				break;
			case 4:	// Write to a sector, the target must be 0xFF
				if((Recv_buf[1]==0xAA)&&(Recv_buf[2]==0x55)){
					Set_28F040_Page(Recv_buf[3]);
					Flash_p=Recv_buf[5]*256+Recv_buf[4];
					for(i=0; i<Recv_buf[6]; i++)
						Write_28F040(Flash_p+i, Recv_buf[7+i]);
					if(!b_Send_busy){
						Send_buf[3]=4;  Send_buf[4]=~4;
						for(i=0; i<17; i++)
							Send_buf[i+5]=Flash[Flash_p+i];
						Send_Data();
					}
				}
				break;
			case 5:	// Erase a sector of Flash
				if((Recv_buf[4]==0x55)&&(Recv_buf[5]==0xAA)){
					Flash_p=Recv_buf[3]*256+Recv_buf[2];
					Erase_28F040(Recv_buf[1]);
					if(!b_Send_busy){
						Send_buf[3]=5;  Send_buf[4]=~5;
						for(i=0; i<17; i++)
							Send_buf[i+5]=Flash[Flash_p+i];
						Send_Data();
					}
				}
				break;
			case 6:	// Read record
				if(!b_Send_busy){
					Set_28F040_Page(Recv_buf[1]);
					Flash_p=Recv_buf[3]*256+Recv_buf[2];
					Send_buf[3]=6;  Send_buf[4]=~6;
					for(i=0; i<17; i++)
						Send_buf[i+5]=Flash[Flash_p+i];
					Send_Data();
				}
				break;
			case 8:	// Set timer
				for(i=0; i<8; i++){
					Time_buf[i]=Recv_buf[i+1];
				}
				HT1380_WriteTime();
			case 9:	// Read timer
				if(!b_Send_busy){
					HT1380_ReadTime();
					Send_buf[3]=9;  Send_buf[4]=~9;
					for(i=0; i<8; i++)
						Send_buf[i+5]=Time_buf[i];
					for(i=8; i<17; i++)
						Send_buf[i+5]=0;
					Send_Data();
				}
				break;
			case 10:	// Write LCD
				Send_buf[3]=0xa;  Send_buf[4]=~0xa;
				if((Recv_buf[1]&7)==4){		// Now only support LCD line 4
					if(Recv_buf[1]&0x80){	// LCD line 4 is controled by Machine
						b_LCD_line4=0;
					}else{						// LCD line 4 is controled by PC
						b_LCD_line4=1;
						mystrcpy(Recv_buf+2);
						LCD_writeline(6);		// LCD line 4 display
					}
					Send_buf[5]='O';  Send_buf[6]='K';
				}else{							// Command not support,return 'NO'
					Send_buf[5]='N';  Send_buf[6]='O';
				}
				for(i=7; i<22; i++)
					Send_buf[i]=0;
				Send_Data();
				break;
			case 11:	// System pause
				if((Recv_buf[1]==0x55)&&(Recv_buf[2]==0xAA)){
					if(!b_Send_busy){
						Send_buf[3]=11;  Send_buf[4]=~11;
						Send_buf[5]=0xAA;  Send_buf[6]=0x55;
						for(i=7; i<22; i++)
							Send_buf[i]=0;
						Send_Data();
					}
					Pause_time=50;				// System pause time=1s
				}
				break;
			case 12:	// Get Last Card_no
				if((Recv_buf[1]==0x55)&&(Recv_buf[2]==0xAA)){
					if(!b_Send_busy){
						Send_buf[3]=12;  Send_buf[4]=~12;
						for(i=0; i<7; i++)
							Send_buf[i+5]=Last_Card_no[i];
						for(i=7; i<17; i++)
							Send_buf[i+5]=0;
						Send_Data();
					}
				}
				break;
		}
	}
	b_Recv_done=0;
	REN=1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -