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

📄 mysub.c

📁 pic 控制 usb程序
💻 C
字号:
#include "f:\wangyong\GSUSB\GSUSBN3\PIC2\mysub.h"
#include "math.H"


void DoRBInit(void);
void DoRCInit(void);
void SendCh(INT8U ch);


#if TXBUFFERENABLE == 1
struct UARTBUFFER2{							//UART0数据队列
	INT8U Buffer[T_UARTLENGTH];
	INT8U Counter;
	INT8U In;
	INT8U Out;
}bank1 Tx;

bank1 INT8U TXEnable = 0;		//串口当前状态

#endif
#if TXBUFFERENABLE == 1
//串行中断发送程序
void DoTXInit(void){
	
	if(Tx.Counter > 0){
		Tx.Counter -= 1;
		SBUF = Tx.Buffer[Tx.Out];
		Tx.Out += 1;
		if(Tx.Out == (T_UARTLENGTH - 1)){
			Tx.Out = 0;
		}			
	}
	else{
		TXEnable = 0;
		ES = 0;		//关闭中断
	}
}

#endif

/****************************************************************
函数名称:UARTInit(INT16U bate)
函数功能:异步通讯接口的设置
Input Vector:bate 波特率
****************************************************************/

void UARTInit(INT16U bate){

	TRISC |= 0b11000000;
	TXSTA = 0b10100100;		
	RCSTA = 0b10110000;
	SPBRG = XTAL / bate / 16 - 1;
	#if TXBUFFERENABLE == 1
		Tx.Counter = 0;
		Tx.In = 0;
		Tx.Out = 0;	
	#endif
}

/*******************************************************************
函数名称:SebdString
函数功能:将长整型数据转换字符串发送出去
Input Vector:no(待发数据),LF
*******************************************************************/
void SendStr(INT32S no){

	INT8U ch[9];
	INT8U ii;
	
	if(no >= 0) 	ch[0] = '+';
	else{
		no = -no;
		ch[0] = '-';
	}
	
	for(ii = 0 ; ii < 8 ; ii++){
		ch[8 - ii] = (no % 10) + 0x30;
		no /= 10;	
	}
	for(ii = 0 ; ii < 9 ; ii++){
		SendCh(ch[ii]);
	}
}
/**************************************************************************
程序名称:SendCh
程序功能:发送数据
**************************************************************************/

void SendCh(INT8U ch){

#if TXBUFFERENABLE == 1
	ES = 0;
	if(TXEnable == 0){
		if(Tx.Counter == 0){
			TXREG = ch;		
		}
		else{
			Tx.Counter -= 1;
			TXREG = Tx.Buffer[Tx.Out];
			Tx.Out += 1;

			if(Tx.Out == (T_UARTLENGTH - 1)){
				Tx.Out = 0;
			}

			Tx.Counter += 1;
			Tx.Buffer[Tx.In] = ch;
			Tx.In += 1;

			if(Tx.In == (T_UARTLENGTH - 1)){
				Tx.In = 0;
			}	
		}
		TXEnable = 1;
		ES = 1;
	}
	else{
		ES = 1;
		while(Tx.Counter >= T_UARTLENGTH);	//等待发送空		
		
		Tx.Counter += 1;
		Tx.Buffer[Tx.In] = ch;
		Tx.In += 1;

		if(Tx.In == (T_UARTLENGTH - 1)){
			Tx.In = 0;
		}	
	}	
#else
	TXREG = ch;
	while(!TXIF)	CLRWDT();
	TXIF = 0;	
#endif
}

//读取对应AD值的程序
INT8U ReadAD(INT8U Channel){

	INT8U Vol;

	if(Channel < 6){
		Channel <<= 3;
		Vol = ADCON0 & 0b11000111;
		ADCON0 = Vol | Channel;
		
		for(Channel = 0 ; Channel < 100 ; Channel++);
		
		ADGO = 1;
		CLRWDT();
		while(ADGO);
		Channel = ADRES;				
		return Channel;	
	}
	return 0;
}

//细分处理
INT32S WY_XFFunction(INT32S GSCounter  , INT8U VolX , INT8U VolY , INT8U VolMid)
{
	float Vx , Vy , Vm;
	
	Vx = VolX;
	Vy = VolY;
	Vm = VolMid;

	Vx = Vx - Vm;
	Vy = Vy - Vm;

	if(Vy == 0){	
		if(Vx > 0)	Vm = 3.141592654 / 2.0;
		else 		Vm = 3.141592654 / 2.0 + 3.141592654;
	}
	else{
		Vm = -atan(Vx / Vy);
		if(Vy > 0){			
			Vm += 3.141592654;
		}
		else if(Vx < 0){
			Vm = 3.141592654 * 2 + Vm;
		}
	}

	Vm = Vm * 31.83098861422280369261393109942;

	Vm += 50;
	if(Vm >= 200) Vm -= 200;

	GSCounter *= 200;

	GSCounter += Vm;	

	return GSCounter;
}



/*******************************************************************************
中继处理程序
*******************************************************************************/
void interrupt tc_int(void)
{	
	if(RBIF){			//计数器溢出处理				
		DoRBInit();
	}
	
	if(RCIF){
		RCIF = 0;
		DoRCInit();	
	}
	#if TXBUFFERENABLE == 1
	if(TXIF){
		TXIF = 0;
		DoTXInit();
	}
	#endif
}

⌨️ 快捷键说明

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