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

📄 16c554.c

📁 C51实现西门子PPI协议
💻 C
字号:
#include ".\16c554.H"
#include".\COM.H"
 #include<absacc.h>
#include <intrins.h>


//*******************************************************ST16C1554端口定义





//*******************************************************
   void init_16c554uart(void)
{   
   
   RESET= 1;      //RESET 16C554
   _nop_();_nop_();
   _nop_();_nop_();
   _nop_();_nop_();
   _nop_();_nop_();
   _nop_();_nop_();
   RESET=0;


   uc_16c554a_LCR=0x80;	 //串口1使能波特率设置
  uc_16c554a_DLL=0x30;   //外部晶振为7.3728M 波特率为9600
  uc_16c554a_DLM=0x00;
   uc_16c554a_FCR=0x07;     //FIFO trigger level 为1字节
   uc_16c554a_LCR=0x03;  //8 bit data 1 stop  no parity
   uc_16c554a_IER=0x01;//使能接收和发送中断
   uc_16c554a_MCR=0x08; //使能串口中断
   _nop_();_nop_();
   _nop_();_nop_();
   _nop_();_nop_();
 
  

   uc_16c554b_LCR=0x80;	 //串口2使能波特率设置
   uc_16c554b_DLL=0x30;   //外部晶振为单片机的六分之一波特率为9600
   uc_16c554b_DLM=0x00;
   uc_16c554b_FCR=0x07;
   uc_16c554b_LCR=0x03;  //8 bit data 1 stop  no parity
   uc_16c554b_IER=0x01;//使能接收和发送中断
  uc_16c554b_MCR=0x08; //使能串口中断
   _nop_();_nop_();
   _nop_();_nop_();
   _nop_();_nop_();

   uc_16c554c_LCR=0x80;	 //串口3使能波特率设置
   uc_16c554c_DLL=0x30;   //外部晶振为单片机的六分之一波特率为9600
   uc_16c554c_DLM=0x00;
   uc_16c554c_FCR=0x07;
   uc_16c554c_LCR=0x03;  //8 bit data 1 stop  no parity
   uc_16c554c_IER=0x01;//使能接收
   uc_16c554c_MCR=0x08; //使能串口中断
    _nop_();_nop_();
   _nop_();_nop_();
   _nop_();_nop_();


   uc_16c554d_LCR=0x80;	 //串口2使能波特率设置
   uc_16c554d_DLL=0x30;   //外部晶振为单片机的六分之一波特率为9600
   uc_16c554d_DLM=0x00;
   uc_16c554d_FCR=0x07;
   uc_16c554d_LCR=0x03;  //8 bit data 1 stop  no parity
   uc_16c554d_IER=0x01;//使能接收
   uc_16c554d_MCR=0x08; //使能串口中断

 _nop_();_nop_();
   _nop_();_nop_();
   _nop_();_nop_();

 
}


//发送一个字节
void uart_16C554asend(unsigned char s)
 	{   unsigned char temp;
		uc_16c554a_THR=s;
		temp=uc_16c554a_LSR;
		while((temp&0x40)!=0x40)
			{
			temp=uc_16c554a_LSR;
			
			}
		 
	}

//发送一帧数据
void frame_16c554asend(unsigned char t)//发送数据桢
	{    EX0=0;//当RTS 变高时RX1变低16c554认为有数据要接受会产生接受中断,关闭中断
		RTS1=ENABLE;		
		for(i=0;i<t;i++)
			{
				
			   uart_16C554asend(s_buffer[i]);
				
			}
		RTS1=DISABLE;
	   EX0=1;
	}

//发送一个字节
void uart_16C554bsend(unsigned char s)
 	{   unsigned char temp;
		uc_16c554b_THR=s;
		temp=uc_16c554b_LSR;
		while((temp&0x40)!=0x40)
			{
			temp=uc_16c554b_LSR;
			
			}
		 
	}

//发送一帧数据
void frame_16c554bsend(unsigned char t)//发送数据桢
	{    EX1=0;//当RTS 变高时RX1变低16c554认为有数据要接受会产生接受中断,关闭中断
		RTS2=ENABLE;		
		for(i=0;i<t;i++)
			{
				
			   uart_16C554bsend(s_buffer[i]);
				
			}
		RTS2=DISABLE;
	   EX1=1;
	}

//发送一个字节
void uart_16C554csend(unsigned char s)
 	{   unsigned char temp;
		uc_16c554c_THR=s;
		temp=uc_16c554c_LSR;
		while((temp&0x40)!=0x40)
			{
			temp=uc_16c554c_LSR;
			
			}
		 
	}

//发送一帧数据
void frame_16c554csend(unsigned char t)//发送数据桢
	{    EX1=0;//当RTS 变高时RX1变低16c554认为有数据要接受会产生接受中断,关闭中断
		RTS3=ENABLE;		
		for(i=0;i<t;i++)
			{
				
			   uart_16C554csend(s_buffer[i]);
				
			}
		RTS3=DISABLE;
	   EX1=1;
	}
//发送一个字节
void uart_16C554dsend(unsigned char s)
 	{   unsigned char temp;
		uc_16c554d_THR=s;
		temp=uc_16c554d_LSR;
		while((temp&0x40)!=0x40)
			{
			temp=uc_16c554d_LSR;
			
			}
		 
	}

//发送一帧数据
void frame_16c554dsend(unsigned char t)//发送数据桢
	{    EX0=0;//当RTS 变高时RX1变低16c554认为有数据要接受会产生接受中断,关闭中断
		RTS4=ENABLE;		
		for(i=0;i<t;i++)
			{
				
			   uart_16C554dsend(s_buffer[i]);
				
			}
		RTS4=DISABLE;
	   EX0=1;
	}




void INTA_int(void) interrupt 0 using 1    //串口1中断
{
   unsigned char x;

   

  if(INTD==1)
   	{
   	    
             uc_554d_isr=uc_16c554d_ISR;    //读中断状态寄存器
            if(uc_554d_isr_status)         //ISR INT STATUS为0表示有中断产生
             return; 
             switch(uc_554d_isr)
               {   case     0xc1:
  	             case    0x01:          //NO INTERRUPT
  	             break;
	         case     0xc4:
                case     0x04:          // receive data interrupt
                uc_554d_r_buffer[uc_554d_r_number]=uc_16c554d_RHR;
				 
		 
		
		   
				 
	          break;

	        case      0xc2:
	        case      0x02:           //tranmit data  interrupt
	         break;

	        case      0xc6:
	        case      0x06:          //lsr      interrupt
               x=uc_16c554d_LSR;          //清除LSR中断
               break;
	        case       0x0c:         //receive time out interrupt
	        case       0xcc:
	         x=uc_16c554d_RHR;       //清除接受超时
               break;
	        case       0x00:            //msr interrupt
	        case       0xc0:
	        x=uc_16c554d_MSR;           //清除msr中断
	        break;
	        default:
	         break;
         
   	}
  }

  else
  	{
  uc_554a_isr=uc_16c554a_ISR;    //读中断状态寄存器
  if(uc_554a_isr_status)         //ISR INT STATUS为0表示有中断产生
    return; 
  switch(uc_554a_isr)
  {   case     0xc1:
  	case    0x01:          //NO INTERRUPT
  	   break;
	case     0xc4:
       case     0x04:          // receive data interrupt
          uc_554a_r_buffer[uc_554a_r_number]=uc_16c554a_RHR;
		 
	  break;
       case      0xc2:
	case      0x02:           //tranmit data  interrupt
	     
	
	 break;
       case      0xc6:
	case      0x06:          //lsr      interrupt
          x=uc_16c554a_LSR;          //清除LSR中断
          break;
	case       0x0c:         //receive time out interrupt
	case       0xcc:
	   x=uc_16c554a_RHR;       //清除接受超时
          break;
	case       0x00:            //msr interrupt
	case       0xc0:
	x=uc_16c554a_MSR;           //清除msr中断
	break;
	default:
	break;
   }
   //uc_16c554a_MCR=0x08; //使能串口中断
  	}
}

void INTB_int(void) interrupt 2 using 0   //串口2中断
{
   unsigned char x;

    if(INTC==1)//串口3接收到数据,原理图本意是用定时器做外部中断,现改为查询
	{
          uc_554c_isr=uc_16c554c_ISR;    //读中断状态寄存器
         if(uc_554c_isr_status)         //ISR INT STATUS为0表示有中断产生
          return; 
      
          
            switch(uc_554c_isr)
               {   
                case     0xc1:
  	         case    0x01:          //NO INTERRUPT
  	          break;
	         case     0xc4:
                case     0x04:          // receive data interrupt
                uc_554c_r_buffer[uc_554c_r_number]=uc_16c554c_RHR;
		  
	           break;
               case      0xc2:
	        case      0x02:           //tranmit data  interrupt
	          break;
              case      0xc6:
	       case      0x06:          //lsr      interrupt
               x=uc_16c554c_LSR;          //清除LSR中断
                break;
	       case       0x0c:         //receive time out interrupt
	       case       0xcc:
	       x=uc_16c554c_RHR;       //清除接受超时
              break;
	      case       0x00:            //msr interrupt
	      case       0xc0:
	       x=uc_16c554c_MSR;           //清除msr中断
	      break;
	      default:
	       break;
           }
	 }
else
	{
	
		
  uc_554b_isr=uc_16c554b_ISR;    //读中断状态寄存器
  if(uc_554b_isr_status)         //ISR INT STATUS为0表示有中断产生
    return; 
  switch(uc_554b_isr)
  {
       case    0xc1:
  	case    0x01:          //NO INTERRUPT
  	   break;
	case     0xc4:
       case     0x04:          // receive data interrupt
          uc_554b_r_buffer[uc_554b_r_number]=uc_16c554b_RHR;
		  

	case      0xc2:
	case      0x02:           //tranmit data  interrupt
	   
         break;
	case      0xc6:
	case      0x06:          //lsr      interrupt
          x=uc_16c554b_LSR;          //清除LSR中断
          break;
	case      0xcc:
	case       0x0c:         //receive time out interrupt
	   x=uc_16c554b_RHR;       //清除接受超时
          break;
	case      0xc0:
	case       0x00:            //msr interrupt
	x=uc_16c554b_MSR;           //清除msr中断
	break;
   }
}
// uc_16c554b_MCR=0x08; //使能串口中断
}

⌨️ 快捷键说明

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