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

📄 uart.c

📁 单片机P89V51RD2在操纵系统RTX下的各个功能
💻 C
字号:
//uart.c
//

                  
#include "AppDefine.h"                 


bit bdata bFrameSt;			//帧头

extern unsigned int  Val_Mytime, Val_Uptime, Val_ad, Val_Actdata, Val_Actdir;
extern unsigned char Val_Mystatus;

extern unsigned char COMMFlag;		//

unsigned char COMMInLenght;		//
unsigned char COMMInIndex;		//
unsigned char COMMInSum;		//
unsigned char COMMInBuff[8];		//

extern unsigned char RUNflag;		//

/*****************************通讯程序***********************************/
/**************************************************************************/
void Uart_Init(unsigned char smod, unsigned char ctime)
{
	SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
	TMOD  = 0x20;       //TMOD: timer 1, mode 2, 8-bit reload 
	switch(smod)
	{
	case 1:
		PCON  = 0x80;       //SMOD=1; 
		break;
	case 0:
	default:
		PCON  = 0x00;       //SMOD=0; 
		break;
	}
	TL1   = ctime;       
	TH1   = TL1;       
	TR1   = 1;          // timer 1 run 
	
	//中断
	ES = 1;
	//
	EN485 = 0;//RECEIVE
	//
	COMMInLenght = 0;
	COMMInIndex = 0;
	COMMInSum = 0;
	bFrameSt = 0;

}


//向串口发送一个字符 data
void Uart_SendChar(unsigned char ch)  
{
	EN485 = T_EN485;
	ES = 0;
  SBUF = ch;
  while(TI==0);
  TI = 0;
	ES = 1;
	EN485 = R_EN485;
}

//向串口发送一帧数据 address + data
unsigned char Uart_SendFrame(unsigned char addr, unsigned char *ch, unsigned char datalen)  
{
	unsigned char i, sendlen=0, sum=0;

	EN485 = T_EN485;
	ES = 0;
	
  SBUF = 0x7f;
  while(TI==0);
  TI = 0;
  sendlen++;
  
  SBUF = addr;
  while(TI==0);
  TI = 0;
  sum += addr;
  sendlen++;
    
	for(i=0;i<datalen;i++)
	{
  		sum += *ch;
	    SBUF = *ch++;
	    while(TI==0);
	    TI=0;
  		sendlen++;
	}
	
  SBUF = sum;
  while(TI==0);
  TI = 0;
  sendlen++;

	ES = 1;
	EN485 = R_EN485;
	return sendlen;
}

//串口接收中断函数,分为接收4字节和8字节 
void Uart_INT () interrupt 4 using 1 
{
    if(RI)
    {
        unsigned char ch;//,i;
       ES = 0;
       RI = 0;
        ch = SBUF;
        if(bFrameSt == 0)//bFrameSt=0
		{
			if(ch == 0x7f){//帧头
				bFrameSt = 1;
			}
		}
		else{//bFrameSt=1
			switch(COMMFlag)
			{
			case CMD_NO_FLAG:
				if(ch == BG485ADDR){//广播地址
					COMMFlag = CMD_RESET_FLAG;
					COMMInLenght = CMD_RESET_NUM;
					COMMInIndex = 0;
					COMMInSum = 0;
					COMMInBuff[COMMInIndex] = ch;
				}
				else if(ch == MY485ADDR){//data
					if(RUNflag != RUN_NO_FLAG){
						COMMFlag = CMD_DATA_FLAG;
						COMMInLenght = CMD_DATA_NUM;
						COMMInIndex = 0;
						COMMInBuff[COMMInIndex] = ch;
					}else{
						COMMFlag = CMD_NO_FLAG;
						COMMInLenght = 0;
						COMMInIndex = 0;
						COMMInBuff[COMMInIndex] = 0x0;
						bFrameSt = 0;
					}
				}
				break;
			case CMD_DATA_FLAG:
				COMMInIndex++;
				COMMInBuff[COMMInIndex] = ch;
				if(COMMInIndex == CMD_DATA_NUM)
					COMMFlag = CMD_END_FLAG;
				//Uart_SendChar(COMMInIndex);
				break;
			case CMD_RESET_FLAG:
				COMMInIndex++;
				COMMInBuff[COMMInIndex] = ch;
				if(COMMInIndex == CMD_RESET_NUM)
					COMMFlag = CMD_END_FLAG;
				//Uart_SendChar(COMMInIndex);
				break;
			case CMD_END_FLAG:
				//Uart_SendChar(0xf);
				break;
			default:
				COMMFlag = CMD_NO_FLAG;
				COMMInLenght = 0;
				COMMInIndex = 0;
				COMMInBuff[COMMInIndex] = 0x0;
				bFrameSt = 0;
				//Uart_SendChar(',');
				break;
			}
		}
	ES = 1;
    }//end of RI
}

//串口处理程序
void Uart_Do(void)
{
	unsigned char i;
	
	unsigned char COMMOutLenght;	//
	unsigned char COMMOutBuff[5];	//返回buffer
	
	if(COMMFlag == CMD_END_FLAG)
	{
		//sum
		COMMInSum = 0;
		for(i=0;i<(COMMInIndex-1);i++)
			COMMInSum += COMMInBuff[i];

		if(COMMInSum == COMMInBuff[(COMMInLenght-1)])
		{
			//addr
			if(COMMInBuff[0] == MY485ADDR)//data
		    {
				if(COMMInBuff[1] == DATA_SEND_CMD)//send acq data 0x53
				{
					RUNflag = RUN_ACQ_FLAG;
					
					COMMOutLenght = 5;//5 data len
					COMMOutBuff[0] = Val_Mytime>>8;//time
					COMMOutBuff[1] = Val_Mytime;
					COMMOutBuff[2] = Val_ad>>8;//AD
					COMMOutBuff[3] = Val_ad;
					COMMOutBuff[4] = Val_Mystatus;//故障码
					Uart_SendFrame(MY485ADDR, COMMOutBuff, COMMOutLenght);
				}
				else if(COMMInBuff[1] == DATA_RECV_CMD)//接收后的回应  0x52
				{
					RUNflag = RUN_ACT_FLAG;

					Val_Actdata = COMMInBuff[2];//执行 data
					Val_Actdata = (Val_Actdata << 8) + COMMInBuff[3];
					Val_Actdir = COMMInBuff[4];//方向,R和L


					//执行程序(电机)
					if(Val_Actdata <= 0){
						PWM_stop();
						DAMP_R = 1;	 //1 off //0 on
						DAMP_L = 1;
					}
					else{
						PWM_stop();
						PWM_changfreq(Val_Actdata);
						if(Val_Actdir == 'L'){//左转 0x4C
							PWM_DIR = 1;
							DAMP_R = 1;
							DAMP_L = 0;
						}
						else{              //右转'R'和默认 0x52
							PWM_DIR = 0;
							DAMP_L = 1;
							DAMP_R = 0;
						}
						PWM_run();
					}
						
					COMMOutLenght = 5;//5 data len
					COMMOutBuff[0] = Val_Mytime>>8;//time
					COMMOutBuff[1] = Val_Mytime;
					COMMOutBuff[2] = Val_Actdata>>8;//AD
					COMMOutBuff[3] = Val_Actdata;
					COMMOutBuff[4] = Val_Mystatus;//故障码
					Uart_SendFrame(MY485ADDR, COMMOutBuff, COMMOutLenght);
				}
			}
			else if(COMMInBuff[0] == BG485ADDR)//广播地址
		    {
				Val_Uptime = COMMInBuff[2];//time
				Val_Uptime = (Val_Uptime << 8) + COMMInBuff[3];

				Val_Mytime = Val_Uptime;
		    	RUNflag = RUN_RESET_FLAG;
				//Uart_SendChar('1');
		    }
			else{//addr不对,丢弃,重新来

				//if(RUNflag == RUN_NO_FLAG)
				//	RUNflag = RUN_NO_FLAG;
				//LED_ERR = 1;
				//Uart_SendChar(0xfc);
			}
		}
		else{//sum不对,丢弃,重新来
			
			///RUNflag = RUN_NO_FLAG;
			LED_ERR = 1;
			//Uart_SendChar(0xfe);
		}

		COMMFlag = CMD_NO_FLAG;
		COMMInLenght = 0;
		COMMInIndex = 0;
		COMMInSum = 0;
		COMMInBuff[COMMInIndex] = 0x0;
		bFrameSt = 0;

	}//end of CMD_END_FLAG
    
	
}

⌨️ 快捷键说明

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