#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
}