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

📄 zhenggeshi.c

📁 数据包(帧格式)的PC机和单片机串口通信 C51程序+proteus仿真
💻 C
字号:
#include<reg52.h>              
#include<intrins.h>
#include<stdio.h>
#include<DIS_LEDNUM_595.c>



#define F_ADDR P0				 
sbit PButton = P3^2;			 

#define uchar unsigned char      
#define uint unsigned int       

#define F_ST 0x02               
#define F_END 0x03               

#define F_Receive_OK 0x05       
#define F_Receive_Error 0x06	
#define F_Overtime 0x09		




uchar UART_Receive;              
bit ST_Flag;					 
bit ADDR_Flag;					
bit LEN_Flag;			        
bit Receive_OK_Flag;			
bit Receive_Error_Flag;		
bit Receive_Overtime_Flag;	
bit Button_Flag;				
bit Send_Flag;				    
bit Send_Overtime_Flag;		   
uchar Temer_Num;                


uchar F_LEN;                    
uchar ASCII_Receive_Buf[20];     
uchar ASCII_Send_Buf[20];      
uchar HEX_Send_Buf[20];        
uchar LEN_Data_Buf;				
uchar UART_Data_Buf;			 

void Timer_init(void);			
void UART_init(void);			   
void Delay_1ms(uint Nms);		 
void Send_Response(uchar Frame);   
void Send_Array(void);             
uchar ASCII_To_Hex(uchar bChar);
uchar Hex_To_ASCII(uchar bHex);
void Send_Hex_To_ASCII(void);	  
bit CheckSum(void);               
void Get_CheckSum(void);          





void int0() interrupt 0
{
  uchar i,j;
  EA=0;
  PButton=1;
  for(j=0;j<10;j++)			
  {
    for(i=0;i<250;i++)
    {
      _nop_();
      _nop_();
      _nop_();
    }
  }
  if(!PButton)
  {
  	Button_Flag=1;
  }

  EA=1;
}



void timer0(void) interrupt 1
{
  				            
  TH0=0x15;							 
  TL0=0xa0;
  if(ADDR_Flag)
  {									 
	TR0=0;							
    Receive_Overtime_Flag=1;		 
    ST_Flag=0;			            
    ADDR_Flag=0;			       
    LEN_Flag=0;
  }
  if(Send_Flag)					
  {
  	if(Temer_Num>10)			
	{  
	  Temer_Num=0;
	  Send_Overtime_Flag=1;
	}
	else							
	{							
	  Temer_Num++;				
	}
  }

}


void UART_Isr() interrupt 4
{
  ES=0;						             
  if(RI)
    { 
	  RI=0;
      UART_Data_Buf=SBUF;
	  if(ST_Flag)   				
	  {
		if(ADDR_Flag)					
		{
	  	  if(LEN_Flag)				
		  {							
	  	    if(F_LEN)				
			{
			  F_LEN--;
	  	      ASCII_Receive_Buf[LEN_Data_Buf - F_LEN]=UART_Data_Buf;
			}							
			else						 
			{
			  if(UART_Data_Buf==F_END)	 
			  {
			  	 Receive_OK_Flag=1;	
			  	 TR0=0;					 
				 ST_Flag=0;				 
				 ADDR_Flag=0;			 
				 LEN_Flag=0;
			  }
			  else
			  {
			  	 Receive_Error_Flag=1;	
				 ST_Flag=0;				
				 ADDR_Flag=0;			
				 LEN_Flag=0;
				 TR0=0;					 
			  }
			}  
		  }
		  else
		  { 
		    F_LEN=UART_Data_Buf;			
		    ASCII_Receive_Buf[0]=F_LEN;		
	        LEN_Data_Buf=F_LEN;				
		    LEN_Flag=1;						 
		  }
		}
		else
		{
	      if(UART_Data_Buf==F_ADDR)	
		  {
			ADDR_Flag=1;
		    TH0=0x15;
            TL0=0xa0;
			TR0=1;                      
		  }
		  else
		    ST_Flag=0;					
		}


	  }
	  else
	  {
	  	if(UART_Data_Buf==F_ST)
		  ST_Flag=1;				
	  }


    }
  ES=1;
}






void UART_Send(uchar Send_Value)
{  
  TI=0;
  SBUF=Send_Value;
  while(TI==1);
  TI=0;  
}


void main()
{
  uchar i=0;
  F_ADDR=0x00;
  IT0=1;                         
  EX0=1;                         
  
  Timer_init();
  UART_init();
  EA=1;

  Dis_LedNum(1);
  Dis_LedNum(0);


  while(1)
  {
	if(Button_Flag)				     
	{
	  Send_Flag=1;
      TH0=0x15;
      TL0=0xa0;
	  TR0=1;				         
	  Temer_Num=0;				     

									 
	  HEX_Send_Buf[0]=0x01;		
	  HEX_Send_Buf[1]=0x45;			 
	  Send_Hex_To_ASCII();			 
	  Send_Array();				


	  Button_Flag=0;				  
	}
	
	if(Send_Flag)					 
	{								  
	  TR0=1;				      
	}							
									 

	if(Send_Overtime_Flag)			 
	{

	  HEX_Send_Buf[0]=0x01;			 
	  HEX_Send_Buf[1]=0x45;			 
	  Send_Hex_To_ASCII();			

	  Send_Array();			
	  Send_Overtime_Flag=0;			 
	}
	
	if(Receive_OK_Flag)				
	{
	  if(CheckSum())				  
	  {
	    if(ASCII_Receive_Buf[1]<0x30) 
		{
		  if(ASCII_Receive_Buf[1]==F_Receive_OK)	
		  {  
			Send_Flag=0;				
		    Send_Overtime_Flag=0;		 
		    TR0=0;					 
		  }
		}
		else
		{
	      i=ASCII_To_Hex(ASCII_Receive_Buf[1])<<4;
	      i+=ASCII_To_Hex(ASCII_Receive_Buf[2]);
	      Dis_LedNum(i);
	  	  Send_Response(F_Receive_OK);		       
		}
	  }
	  else
	  {
		Receive_Error_Flag=1;			   
	  }
	  Receive_OK_Flag=0;
	}

	if(Receive_Error_Flag)					 
	{
	  Send_Response(F_Receive_Error);       
	  Receive_Error_Flag=0;
	}

	if(Receive_Overtime_Flag)
	{
	  Send_Response(F_Overtime);            
	  Receive_Overtime_Flag=0;
	}

  }

}


void Timer_init(void)
{
  TMOD=0x1;				
  TH0=0x15;				
  TL0=0xa0;
  PT0=1;                   
  ET0=1;                  
}



void UART_init()
{                         
  SCON = 0x50;           
  TMOD|= 0x20;          
  TH1 = 0xFB;           
  TL1 = 0XFB;            
  TR1 = 1;             
  ET1 = 0;				
  //AUXR=64;            
  ES = 1;                
  //PS = 1;                
  EA = 1;                 
}



bit CheckSum(void)                          
{
  uchar ASCII_Len=0;			             
  uchar Checksum_Temp=0;		             
  ASCII_Len=ASCII_Receive_Buf[0]-1;
  
  for(;ASCII_Len!=0;ASCII_Len--)		
  {
  	Checksum_Temp+=ASCII_Receive_Buf[ASCII_Len];
  }

  ASCII_Len=ASCII_Receive_Buf[0];
											
  if(Checksum_Temp==ASCII_Receive_Buf[ASCII_Len]) 
    return 1;
  else
    return 0;

}


void Get_CheckSum(void)                         
{
  uchar ASCII_Len=0;			               
  uchar CheckSum_Temp=0;		               
  ASCII_Len=ASCII_Send_Buf[0]-1;
  
  for(;ASCII_Len!=0;ASCII_Len--)				
  {
  	CheckSum_Temp+=ASCII_Send_Buf[ASCII_Len];
  }

  ASCII_Len=ASCII_Send_Buf[0];
  ASCII_Send_Buf[ASCII_Len]=CheckSum_Temp;
											   
}



void Send_Response(uchar Frame)
{
  uchar ASCII_Len=1;

  ASCII_Send_Buf[ASCII_Len++]=Frame;
  ASCII_Send_Buf[0]=ASCII_Len;			 

  ASCII_Send_Buf[ASCII_Len]=Frame;       
  Send_Array();							

}



void Send_Hex_To_ASCII(void)	  
{
  uchar i;
  uchar Hex_Len=0;				  
  uchar ASCII_Len=1;			  
  Hex_Len=HEX_Send_Buf[0];		  

  for(i=1;i<=Hex_Len;i++)		 
  {
    ASCII_Send_Buf[ASCII_Len++]=Hex_To_ASCII(HEX_Send_Buf[i]>>4);
    ASCII_Send_Buf[ASCII_Len++]=Hex_To_ASCII(HEX_Send_Buf[i]&0x0f);
  }								  
  ASCII_Send_Buf[0]=ASCII_Len;	  
  Get_CheckSum();
}


void Send_Array(void)                   
{
  uchar i;
  uchar ASCII_Len=1;
  ASCII_Len=ASCII_Send_Buf[0];

  UART_Send(F_ST);						
  Delay_1ms(2);							 
  UART_Send(F_ADDR);					 
  Delay_1ms(2);
  for(i=0;i<=ASCII_Len;i++)				 
  {
    UART_Send(ASCII_Send_Buf[i]);
    Delay_1ms(2);
  }
  UART_Send(F_END);						
  Delay_1ms(2);

}




uchar ASCII_To_Hex(uchar bChar)
{
  if((bChar>=0x30)&&(bChar<=0x39))
    bChar -= 0x30;
  else if((bChar>=0x41)&&(bChar<=0x46))
    bChar -= 0x37;
  else if((bChar>=0x61)&&(bChar<=0x66))
    bChar -= 0x57;
  else bChar = 0xff;
  
  return bChar;
}

uchar Hex_To_ASCII(uchar bHex)
{
  if((bHex>=0)&&(bHex<=9))
    bHex += 0x30;
  else if((bHex>=10)&&(bHex<=15))
    bHex += 0x37;
  else bHex = 0xff;
  return bHex;
}


void Delay_1ms(uint Nms)
{
  uchar Temp;
  for(;Nms!=0;Nms--)
      {
       for(Temp=0;Temp<255;Temp++)
	     {
           _nop_();
           _nop_();
           _nop_();
		 }
      } 
}

⌨️ 快捷键说明

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