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

📄 serial1.c

📁 c8051f020实现4个 产UART 口
💻 C
📖 第 1 页 / 共 2 页
字号:

//*************************************************************************
#include "all.h"

void Open_URRA_1(void);



uchar xdata DiZh_Rx_Buff[DiZh_BUFF_MAX];    //地震
uchar xdata DiZh_Tx_Buff[DiZh_BUFF_MAX];

uchar xdata  KEY_RX_Buff[KEY_BUFF_MAX];    //屏
uchar xdata  KEY_TX_Buff[KEY_BUFF_MAX];

uchar xdata  F76_RX_Buff[F76_BUFF_MAX];   //床体
uchar xdata  F76_TX_Buff[F76_BUFF_MAX];

bit  XinKey_Sound_b=0;   //用于发声音
bit  Xin_KeyJTX_RX_B=0;   //甲天行来的标志位
 bit XinKey_b=0;             //手柄来的键值标志
 uchar xdata   XinKey_Value, itask;   //手柄来的键值

bit Dis_All_Key_B=0;     //不检测按键标志位   1:不检测   0:检测

void  Fa_F76_buffer_0xee0xee(uchar Fun,uchar *Poit,uint Lenthg) reentrant ;


bit  bUartBusy;		//上位机串口发送状态标志,"1"表示上位机串口"忙"(正发送数据
							//到子串口,新数据只需送入子串口发送缓冲区即可,"0"表示上位
							//机串口"空闲",需用户程序将"TI=1"来启动子串口数据发送

bit  bInstructFlag;	//上位机发送指令请求标志,上位机需要发送指令时必须
							//先将待发发送指令放到"InstructBuf",之后将该
							//标志设置为"1"即可.标志变为"0"后可继续发送指令

bit    KEY_TX_is_over_Start_cnt_B=0;   // 帧间隔计时位
      //    //发送数据时要先检测此位为0才能发送数据
				
uchar	   KEY_TX_is_over_Start_cnt=0;     // 帧间隔计时计数器


uchar xdata UartPointer;	//子串口发送数据指针,中断服务程序通过该指针轮询
							//发送数据到各子串口,保证各子串口的数据不丢失

uchar xdata InstructBuf;	//指令缓冲(用户可将设置SP2328/SP2338的指令放入
							//该寄存器,由驱动程序自动完成指令发送)



uchar  MY_P4L;   

							


uchar xdata Uart0RBuf,Uart1RBuf,Uart2RBuf;	//接收子串口数据缓
							

unsigned char xdata  F76_RX_Sta=0;
unsigned char xdata   F76_RX_cnt=0;
unsigned char    F76_Es_jie_cnt;
 bit  Xin_F76_RX_B=0;



unsigned char xdata  KEY_RX_Sta=0;
unsigned int xdata   KEY_RX_cnt=0;
unsigned char    KEY_Es_jie_cnt;
 bit  Xin_KEY_RX_B=0;


unsigned char xdata  DiZh_RX_Sta=0;
unsigned int xdata   DiZh_RX_cnt=0;
unsigned char    DiZh_Es_jie_cnt;
 bit  Xin_DiZh_RX_B=0;



uint xdata DiZh_TX_Len;   //发送长度
uint xdata  DiZh_TX_cnt=0;    //发送计数器
bit DiZh_TX_is_over_B=1;    //所完标志位
                                  // GPRS_TX_is_over_B=0表示串口忙被 占用,
                                  //谁得到 GPRS_TX_is_over_B=1谁就得到串口生理权

uint xdata KEY_TX_Len;    //发送长度
uint xdata  KEY_TX_cnt=0;   //发送计数器
bit KEY_TX_is_over_B=1;    //所完标志位
                                  // KEY_TX_is_over_B=0表示串口忙被 占用,
                                  //谁得到 KEY_TX_is_over_B=1谁就得到串口生理权
                                  
bit  KEY_TX_Right_B=1;    //key发送权标志
  

uint xdata F76_TX_Len;     //发送长度
uint xdata  F76_TX_cnt=0;  //发送计数器
bit F76_TX_is_over_B=1;    //所完标志位
                                  // F76_TX_is_over_B=0表示串口忙被 占用,
                                  //谁得到 F76_TX_is_over_B=1谁就得到串口生理权


//void  Fa_F76_buffer(uint Lenthg);
//void  Fa_Key_buffer(uint Lenthg);
//void  Fa_DiZh_buffer(uint Lenthg);



/*****************************************************************************
功能:设定SP2328/SP2338输入、输出地址,可根据实际电路修改
*****************************************************************************/
//sbit 	AdrIn0 =P1^0;		/* 连接到SP2328/SP2338的PIN0 (ADRO0)*/
//sbit	AdrIn1 =P1^1;		/* 连接到SP2328/SP2338的PIN1 (ADRO1)*/
//sbit	AdrOut0=P1^2;		/* 连接到SP2328/SP2338的PIN18(ADRI0)*/
//sbit	AdrOut1=P1^3;		/* 连接到SP2328/SP2338的PIN17(ADRI1)*/


void  Fa_F76_buffer(uchar Fun,uchar *Poit,uint Lenthg) reentrant ;



void UART_1_ISR () interrupt 20 {
  
	
	if (SCON1&0x01) //if (_testbit_(RI_1))	
	{	
		  
		//RI=0;					//准备解析刚接收到的数据来自于哪个子串口
		if(AdrIn1)
		{		//子串口2接收到一个字节
		                         //子串口2 来键盘的数据
			Uart2RBuf=SBUF1;		//缓存子串口2收到的数据,以便接收后续数据
               
                     
			switch(KEY_RX_Sta)   {
                              case 0:
					  if(Uart2RBuf==0xee)
					  	  KEY_RX_Sta=1;
					 
				  break;
				  case 1:
            				  if(Uart2RBuf!=0xee)  {
									KEY_Es_jie_cnt=10; //时限计时值 500ms  	  in : TIME_LIMITED (void) _task_ TIMELIMITED 	
									KEY_RX_Sta=2;
									KEY_RX_Buff[0]=Uart2RBuf;
									KEY_RX_cnt=1;
            				  }	   

				  break;
				     case 2:
 		 				 KEY_RX_Buff[KEY_RX_cnt++]=Uart2RBuf;
						 if( KEY_RX_cnt>=KEY_BUFF_MAX)  {
                                                         KEY_RX_Sta=0;

						 }
						 if(Dis_All_Key_B==1)     //不检测按键标志位   1:不检测   0:检测==1)
						 	 break;
						 if(Uart2RBuf==0xab)  {    //  over byte  flag
									
									  Xin_KEY_RX_B=1;
									  XinKey_b=1;             //手柄来的键值标志
									  
										        
									
									//XinKey_Value=KEY_RX_Buff[2];   //手柄来的键值
									KEY_RX_Sta=0;

									//========以下是优先电话功能==只允许挂机和接听键有效================
								
								

									 ima_cnt=0;    //键盘拔号复0 计数器,超过16秒没人按键则复位为   ima=3;
						 }

				  break;

				  default:
                                          KEY_RX_Sta=0;

				  break;
				
			 }
             
              //Out55:;            
		
		}
		else if(AdrIn0)
		{				//子串口1接收到一个字节
		                     //子串口1 来自报警板的数据
			Uart1RBuf=SBUF1;		//缓存子串口1收到的数据,以便接收后续数据
                      F76_RX_Buff[F76_RX_cnt++]=Uart1RBuf;
			 F76_Es_jie_cnt=16;                     //80ms 时限到认为接收结束in: 
			 if(F76_RX_cnt>=F76_BUFF_MAX)
					  F76_RX_cnt=0;
					  

					  /*
			switch(F76_RX_Sta)   {
                              case 0:
					  if(Uart1RBuf==0xee)
					  	  F76_RX_Sta=1;


				  break;
				  case 1:
            				  if(Uart1RBuf!=0xee)  {
					  	   F76_Es_jie_cnt=10; //时限计时值 500ms  	  in : TIME_LIMITED (void) _task_ TIMELIMITED 	
					  	   F76_RX_Sta=2;
						   F76_RX_Buff[0]=Uart1RBuf;
						    F76_RX_cnt=1;
            				  }	   

				  break;
				     case 2:
 		 				 F76_RX_Buff[F76_RX_cnt++]=Uart1RBuf;
						 if( F76_RX_cnt>=F76_BUFF_MAX)  {
                                                         F76_RX_Sta=0;

						 }
						 if(Uart1RBuf==0xab)  {    //  over byte  flag
                                                         Xin_F76_RX_B=1;
								 F76_RX_Sta=0;

						 }

				  break;
				
				  default:
                                           F76_RX_Sta=0;

				  break;
				
			}
			*/
                   
					 
		}
		else {					//子串口0接收到一个字节
		                          //子串口0 来自DiZh  的数据
			    // if(Xin_DiZh_RX_B==0)   {            //未处理不能接收防止覆盖             
						   Uart0RBuf=SBUF1;		//缓存子串口0收到的数据,以便接收后续数据
			                        DiZh_Rx_Buff[DiZh_RX_cnt++]=Uart0RBuf;
						   DiZh_Es_jie_cnt=16;                     //80ms 时限到认为接收结束in: 
						    if(DiZh_RX_cnt>=DiZh_BUFF_MAX)
								  DiZh_RX_cnt=0;
			     	//}	
		}
	}




       //以下是发送数据==以下是发送数据===以下是发送数据==以下是发送数据
	//以下是发送数据==以下是发送数据===以下是发送数据==以下是发送数据
	//以下是发送数据==以下是发送数据===以下是发送数据==以下是发送数据
	 //以下是发送数据==以下是发送数据===以下是发送数据==以下是发送数据
	if (SCON1&0x02)   //-->_testbit_(TI_1))
	{
		//TI=0;							//已经产生发送中断,准备解析下一个需要发送的数据
		switch(UartPointer){			//判断即将向哪个子串口发送数据?
			case 0:{					//准备向子串口0发送数据
			                       //    子串口0      fa   DiZh  的数据
                                    if( DiZh_TX_Len>DiZh_BUFF_MAX)
						 	 DiZh_TX_Len= DiZh_BUFF_MAX;
					UartPointer++;			//下一次发送中断准备向子串口1发送数据
					if(DiZh_TX_Len){			//串口0发送缓存区是否有数据需要发送?
							AdrOut0_0;			//有数据需要发送,则选通子串口0的地址
							AdrOut1_0;
							_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
							_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
							DiZh_TX_Len--;
							DiZh_TX_is_over_B=0; 
							if(DiZh_TX_Len==0)  {
		                                            DiZh_TX_is_over_B=1; 
							}
							SBUF1=DiZh_Tx_Buff[DiZh_TX_cnt++];//将串口0发送缓存中的一个字节
							break;						//由子串口0发送到下位机
					}
					else  
						goto T_NopInstruction;	//若子串口0没有数据发送则准备发送空指令
			}

			case 1:{					//准备向子串口1发送数据
			              //子串口1 来自报警板的数据
			                 if( F76_TX_Len>F76_BUFF_MAX)
						 	 F76_TX_Len= F76_BUFF_MAX;
							 
	                        	UartPointer++;			//下一次发送中断准备向子串口2发送数据
					if(F76_TX_Len){			//串口1发送缓存区是否有数据需要发送?
							AdrOut0_1;			//有数据需要发送,则选通子串口2的地址
							AdrOut1_0;
							_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
							_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
							F76_TX_Len--;
							F76_TX_is_over_B=0; 
							if(F76_TX_Len==0)  {
								  F76_TX_is_over_B=1; 
								  //Dis_FA_485shou;  //为推完,要上拉电阻 
							}
							SBUF1=F76_TX_Buff[F76_TX_cnt++];//将串口1发送缓存中的一个字节
							break;						//由子串口1发送到下位机
					}
					else 
						  goto T_NopInstruction;	//若子串口1没有数据发送则准备发送空指令
		
			}
			case 2:{			//准备向子串口2发送数据

                                    //子串口2 发给键盘的数据
			             if( KEY_TX_Len>KEY_BUFF_MAX)
						 	 KEY_TX_Len= KEY_BUFF_MAX;

⌨️ 快捷键说明

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