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

📄 receive.c

📁 一个高质量的DSP与异步串口通信芯片16C550的发送接受源代码。
💻 C
字号:
#include<stdio.h>
#include<io2313v.h>
#pragma interrupt_handler time1_ovf:6
#pragma interrupt_handler time0_ovf:7
#pragma interrupt_handler uart_rx:8
#define TXD_BIT     0X01
#define TXD_0()    (PORTB=PINB&~TXD_BIT)
#define TXD_1()    (PORTB=PINB|TXD_BIT)
#define RXD_BIT    0X02
#define RXD_FLAG   PINB&RXD_BIT
char T_FLAG=0,R_FLAG=0,SEND_FLAG=0,RECV_FLAG=0,CycleMode=0,B_FLAG=0,A_FLAG;
char send[10],sendcount,s_scu[3];
char recv[10],recvcount;
char recvdata[10],rxcount=0,ASC_REG[13];
char temp0,mask,i,SendLen; 
unsigned int tt;
char uart_rxs[9],uart_rx_reg,uart_rx_flag,uart_rx_number,uart_xor;
char shear_flag=0,ovr_flag;
unsigned  int  shr_number,shr_number_n,time_flag=0;
char shr_number_h,shr_number_hh,shp_h,shr_number_l,shr_number_ll,shp_l,direct;
void delay(unsigned int dt)
{
   for(tt=0;tt<dt;tt++);
 } 
 void output(char txd_data)
{
char i;
  	T_FLAG=1; 
	for(i=0;i<8;i++)
    { 
	   mask=1<<i;
       if(txd_data& mask)
       { 
		  send[i]=1;
		}	   
        else 
        {
			 send[i]=0;
		 }
	   }
	   send[8]=1;
	   send[9]=1;	
	  TCNT0=0xd4;
	  TXD_0();
	  TCCR0=0x02;
	  sendcount=0;
}	
void SendData()
{ char i;
 //UCR=0x0;
 for(i=0;i<SendLen;i++)
	   {
	     while (T_FLAG);
		 delay(3000);
	 	 output( ASC_REG[i]);
		}
		delay(5000);
		TXD_1();
		//UCR=0x90;
}
char ASCHi(char ASCData)
{
     temp0=ASCData/16;
	 if (temp0>9)
	 {
	    return temp0+87;
	 }
	 else
	 {
	    return temp0+0x30; 
	}
}
char ASCLo(char ASCData)
{
   temp0=ASCData%16;
	 if (temp0>9)
	 {
	    return temp0+87;
	 }
	 else
	 {
	    return temp0+0x30; 
	}
}
			
/*void SCU_CONTROL(char p1,char p2)           //向控制器发送的复位信号子函数
     {
      ASC_REG[1]=p1;	 
	  ASC_REG[3]=0x30;
	  ASC_REG[4]=0x30;
	  ASC_REG[5]=p2;
	  ASC_REG[6]=0x0d;
      SendLen=7;
	  SendData();
	 }*/
/*void SCU_VERSION()    //向控制器发送版本号
     {
      ASC_REG[1]=0x32;	 
	  ASC_REG[3]=0x33;
	  ASC_REG[4]=0x30;
	  ASC_REG[5]=0x34;
	  ASC_REG[6]=0x30;
      ASC_REG[7]=0x30;	 
	  ASC_REG[8]=0x30;
	  ASC_REG[9]=0x31;
	  ASC_REG[10]=0x30;
	  ASC_REG[11]=0x36;
	  ASC_REG[12]=0x0d;
      SendLen=13;
	  SendData();
	 }	 */
void shear_number(char dh,char dl)
{  
   unsigned int sh_data;
   sh_data=dh*256+dl;
   if(sh_data>50000)
    { 
	  sh_data=65535-sh_data;
	     if(sh_data==0)
	      {
		    shr_number=15;
		   }
	    else
		  {	   	
	        sh_data=(sh_data-1);
	        sh_data=sh_data/208;
	        if (sh_data<14)
	          {
	           shr_number=14-sh_data;
	          }
	        else
	          {
	           shr_number=1;
		       }
		   }	   
	}
	else 
	 { if(sh_data==0)
	      {
		    shr_number=15;
		   }
	    else
		{	   	
	       sh_data=(sh_data-1);
	       sh_data=sh_data/208;
	       shr_number=15+sh_data;
		 }   
	  }
	 shr_number_hh=shr_number/256;
	 shr_number_ll=shr_number%256; 
	if( ovr_flag==0) 
    {if(shear_flag==1)
	  { if(A_FLAG<1)
	      {  
	       shr_number_h=shr_number_hh;
	       shr_number_l=shr_number_ll;
		   shr_number_n=shr_number;
		   A_FLAG=2;
		  }	
	    else
	     { if((shr_number<shr_number_n+3)&&(shr_number>shr_number_n-3))
	         {shr_number_h=shr_number_hh;
	          shr_number_l=shr_number_ll;
			  shr_number_n=shr_number;
	         }
	       else
	         {
			  if(shr_number_ll==15)
		        { shr_number_h=0;
	              shr_number_l=15;
				  shr_number_n=shr_number;
			    }
			  else  
		        {shr_number_h=shr_number_h;
	             shr_number_l=shr_number_l;
			    }
	         }
	     }
	}	
  }
  else
  {	  A_FLAG=0;}
}

	 
void SCU_DATA()  //向控制器发送采煤机的位置信号
     {
	  char tempreg;
	  UCR=0x0;
	  TIMSK=TIMSK&~0x80;
	  shear_number(s_scu[0],s_scu[1]);
	  direct=s_scu[2];
	  //if (direct>2)
	  //{direct=0;}
   	  if (shear_flag==0)
	  { shp_h=0xff;
	    shp_l=0xff;
	    //A_FLAG=0;
	  }
	  else
	  {shp_h=shr_number_h;
	   shp_l=shr_number_l;
	  }
	  tempreg=0x02^0x42^0x03;
	  tempreg^=shp_h^shp_l^direct; 
      ASC_REG[1]=0x42;	 
	  ASC_REG[3]=0x33; 
	  ASC_REG[4]=ASCHi(shp_h);
	  ASC_REG[5]=ASCLo(shp_h);
	  ASC_REG[6]=ASCHi(shp_l);
      ASC_REG[7]=ASCLo(shp_l);	 
	  ASC_REG[8]=ASCHi(direct);
	  ASC_REG[9]=ASCLo(direct);
	  ASC_REG[10]=ASCHi(tempreg);
	  ASC_REG[11]=ASCLo(tempreg);
	  ASC_REG[12]=0x0d;
	  SendLen=13;
	  SendData();
	  UCR=0x90;
	  TIMSK=TIMSK|0x80;
	  shear_flag=0;
	 }	
void main()
    {
	 char j;
	 DDRB=0xfd;
	 PORTB=0xff;
	 //delay(65535);
	 SREG=0x80;
	 TIMSK=0x82;
	 MCUCR=0X02; 
	 UBRR=0xbf;    /*装入波特率1200*/
     UCR=0x90;     /*开发送使能*/
	 uart_rx_flag=0;
	 TCNT1H=0xb9;  /*计数器预定比例值*/
	 TCNT1L=0xb0;
	 TCCR1A=0x00;  /*计数器1控制寄存器*/
	 TCCR1B=0x05;
	 ASC_REG[0]=0x02;
     ASC_REG[2]=0x30;
	// SCU_CONTROL(0x30,0x32);
	 while(1)
	 {
	    if (SEND_FLAG==1)
		{    SCU_DATA();
		    if (RECV_FLAG)
       	    {  //for(j=0;j<3;j++)
			     //{s_scu[j]=uart_rxs[j];}
				  //delay(5);
				  
    	          //SCU_DATA();
        		  RECV_FLAG=0;
		     }
   			SEND_FLAG=0;
			rxcount=0;
		}
		else
		{
		 	if (R_FLAG == 0)
			{
		       temp0=RXD_FLAG;
			   if (temp0 == 0x0)
		       {
			   	  TCNT0=0xb8;
			   	  TCCR0=0x02;
               	  R_FLAG=1;
               	  recvcount=0;
				  UCR=0x0;
			 	}
			}
		}	
		
	  } 

}				  	 	
void time0_ovf()
  { 
	if(R_FLAG==1)                      //接收来自控制器的命令
      {
	      recv[recvcount]=RXD_FLAG;
		  if (recvcount<9)
		  {
		     recvcount+=1;
			 TCNT0=0xd6;
		   }
		   else
		   {
		     recvcount=0;
			 temp0=0;
			 for(i=0;i<8;i++)		
	         { 
			   mask=1<<i;
               if(recv[i])
			   {
			     temp0=temp0|mask;
			    }
			  }
			  recvdata[rxcount]=temp0;
			  if (rxcount<6)
	    	  {
		    	  rxcount+=1;
		      }
   			  else
    		  { 
		         rxcount=0;
    		  	 RECV_FLAG=1;
				 TCNT1H=0xe0;  /*计数器预定比例值*/
				 TCNT1L=0x00;
	           }
			   R_FLAG=0;
			   UCR=0x90;
			   TCCR0=0; 
		    }
	  }
	else                                   //向控制器以9600波特率发送数据
	{   
   	 if (send[sendcount]==0)
	 {
	   TXD_0();
	  }
	 else
	 {
	   TXD_1();
	  }
    if (sendcount<9)
	{
	   sendcount+=1;	
	   TCNT0=0xd8;
	 }
	 else
	 {
	   TCCR0=0;
	   T_FLAG=0;
	  }

	}  
  }
void time1_ovf(void)               //定时发送,接收
 {       char j;
	     SEND_FLAG=1;
		 for(j=0;j<3;j++)
		 {s_scu[j]=uart_rxs[j];}
		 time_flag++;
		 if(time_flag==20)
		 { time_flag=0;
		   ovr_flag=1;
		 }  
		 
 }  
void uart_rx(void)                  //uart中断,接收来自采煤机的数据
  { 
     uart_rx_reg=UDR;
	 switch (uart_rx_flag)
	 {
	    case 0:
	    {
	     if (uart_rx_reg==0xff)
		 {
		    uart_rx_flag=1;
		  }
		 break;
	     }
	     case 1:
	  	  {
		   if (uart_rx_reg==0)
		   {
		      uart_rx_flag=2;
			  uart_rx_number=0;
			}
			else
			{
			  uart_rx_flag=0;
			 }
		     break;
	     }
	  case 2:
	  	  {
		  uart_rxs[uart_rx_number]=uart_rx_reg;
		  if (uart_rx_number<5)
		  {
		     uart_rx_number+=1;
		   }
		   else
		   {
		     uart_rx_number=0;
			 uart_rx_flag=0;
		     if((uart_rxs[3]==0x55)&(uart_rxs[4]==0xaa))
			   {uart_xor=0xff^0x00^uart_rxs[0]^uart_rxs[1]^uart_rxs[2]^uart_rxs[3]^uart_rxs[4];
			    if(uart_rxs[5]==uart_xor)
	              {shear_flag=1;
				   ovr_flag=0;
				   }
				}
			 }
	         break;
	        }
	 }
   } 
    

⌨️ 快捷键说明

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