📄 shiyan.c
字号:
PORTDbits.RD7=0; //选通正档2(20欧姆)
PORTDbits.RD6=1; //关闭正档1(220欧姆)
hdcx1();
}
}
else
{
hdcx1();
}
}
if(fudu2>FuDufirst)
{
hdcx2();
}
else
{
if((fudu2*10)<=FuDufirst)
{
PORTGbits.RG15=1; //关闭标档1(220欧姆)
hdcx2();
}
else
{
hdcx2();
}
}
}while((s1==1)&&(s2==1));
// PORTGbits.RG12=1;
//if((fudu1>=0x28f)&&(fudu1<=0x35b))
//{
//delaydms(500);
// PORTGbits.RG12=!PORTGbits.RG12;
// }
// else
//if(fudu2>fudu1)
// {
//delaydms(500);
// PORTGbits.RG12=0;
// }
// if((fudu2>=0x28f)&&(fudu2<=0x35b))
// {
//delaydms(500);
// PORTGbits.RG13=!PORTGbits.RG13;
// }
// else
//if(fudu2>fudu1)
// {
//delaydms(500);
// PORTGbits.RG13=0;
//}
//for(b=0;b<10;b++)
//{
// PORTGbits.RG12=1;
// adrh();
// jztg();
// x[b]=J;
// PORTGbits.RG12=0;
// delaydms(5000);
// }
// F=(x[0]+x[1]+x[2]+x[3]+x[4]+x[5]+x[6]+x[7]+x[8]+x[9])/10;
// while(1)
// {
// PORTGbits.RG12=0;
// }
************************************************************************/
return 0;
}
//延时函数
//AD初始化
void AD1int(void)
{
TRISCbits.TRISC1 = 0; // set portc one is output
CONTROLAD = 0; // disenable AD
TRISCbits.TRISC13 = 0; // set portc thirteen is output
TRISB=0xFFFF; // set portb is input
TRISBbits.TRISB12 = 1;
PORTCbits.RC13= 1; // no read AD
//PORTCbits.RC1 = 0; // set out A/D
}
//定时器初始化
void timerint(unsigned int match_value)
{
ConfigIntTimer1(T1_INT_PRIOR_1 & T1_INT_ON); // Enable Timer1 Interrupt and Priority to "1"
WriteTimer1(0);
OpenTimer1(T1_ON & T1_GATE_OFF & T1_IDLE_STOP &
T1_PS_1_1 & T1_SYNC_EXT_OFF &T1_SOURCE_INT, match_value);
}
//SPI2口的初始化
void spiint(void)
{
TRISGbits.TRISG6= 1; //SCK2 input
TRISGbits.TRISG7= 1; //SDI2 input
TRISGbits.TRISG8= 0; //SDO2 output
TRISGbits.TRISG9= 0; //SS2 input
ConfigIntSPI2(SPI_INT_EN & SPI_INT_PRI_6); //Enable SPI2 interrupt and Priority to "6"
// Configure SPI2 module to transmit 8 bit value in slave mode
SPICONValue = FRAME_ENABLE_OFF & FRAME_SYNC_INPUT & ENABLE_SDO_PIN & SPI_MODE16_OFF &
SPI_SMP_OFF & SPI_CKE_OFF & SLAVE_ENABLE_OFF & CLK_POL_ACTIVE_LOW &
MASTER_ENABLE_OFF & SEC_PRESCAL_7_1 & PRI_PRESCAL_64_1;
SPISTATValue = SPI_ENABLE & SPI_IDLE_CON & SPI_RX_OVFLOW_CLR;
OpenSPI2(SPICONValue,SPISTATValue );
}
//使能PVS
void EnablePSV(void)
{
CORCONbits.PSV = 1;
}
//输出20kHz方波
void ONhighpower(void)
{
timerint(225);
HIGHPOWER=1;
}
//停止输出20kHz方波
void OFFhighpower(void)
{
CloseTimer1();
HIGHPOWER=1;
}
/*
//正档4051换档程序
void hdcx1(void)
{
switch(ch_status1)
{
case CH_OFF1:
if((fudu1>=FuDu_BOTTOM)&&(fudu1<=FuDu_TOP))
{
ch_status1=CH_OFF1;
s1=1;
}
else
{
if((fudu1*3.3)<=FuDu_TOP )
{
ch_status1=CH_01;
PORTDbits.RD2=0; //A,选4051的通道2,使增益为3.3
PORTDbits.RD1=1; //B
PORTDbits.RD0=0; //C
}
else
{
s1=1;
}
}
break;
case CH_01:
if((fudu1>=FuDu_BOTTOM)&&(fudu1<=FuDu_TOP))
{
ch_status1=CH_01;
s1=1;
}
else
{
if((fudu1*11)<=FuDu_TOP)
{
ch_status1=CH_11;
PORTDbits.RD2=1; //A,选4051的通道1,使增益为11
PORTDbits.RD1=0; //B
PORTDbits.RD0=0; //C
}
else
{
s1=1;
}
}
break;
case CH_11:
if((fudu1>=FuDu_BOTTOM)&&(fudu1<=FuDu_TOP))
{
ch_status1=CH_11;
s1=1;
}
else
{
if((fudu1*36.3)<=FuDu_TOP)
{
ch_status1=CH_21;
PORTDbits.RD2=0; //A,选4051的通道0,使增益为36.3
PORTDbits.RD1=0; //B
PORTDbits.RD0=0; //C
nop();
}
else
{
s1=1;
}
}
break;
case CH_21:
if((fudu1>=FuDu_BOTTOM)&&(fudu1<=FuDu_TOP))
{
ch_status1=CH_21;
s1=1;
}
else
{
s1=1;
}
break;
}
}
//标档4051换档程序
void hdcx2(void)
{
switch(ch_status2)
{
case CH_OFF2:
if((fudu2>=FuDu_BOTTOM)&&(fudu2<=FuDu_TOP))
{
ch_status2=CH_OFF2;
s2=1;
}
else
{
if((fudu2*3.3)<=FuDu_TOP )
{
ch_status2=CH_02;
PORTDbits.RD2=0; //A,选4051的通道2,使增益为3.3
PORTDbits.RD1=1; //B
PORTDbits.RD0=0; //C
}
else
{
s2=1;
}
}
break;
case CH_02:
if((fudu2>=FuDu_BOTTOM)&&(fudu2<=FuDu_TOP))
{
ch_status2=CH_02;
s2=1;
}
else
{
if((fudu2*11)<=FuDu_TOP)
{
ch_status2=CH_12;
PORTDbits.RD2=1; //A,选4051的通道1,使增益为11
PORTDbits.RD1=0; //B
PORTDbits.RD0=0; //C
}
else
{
s2=1;
}
}
break;
case CH_12:
if((fudu2>=FuDu_BOTTOM)&&(fudu2<=FuDu_TOP))
{
ch_status2=CH_12;
s2=1;
}
else
{
if((fudu2*36.3)<=FuDu_TOP)
{
ch_status2=CH_22;
PORTDbits.RD2=0; //A,选4051的通道0,使增益为36.3
PORTDbits.RD1=0; //B
PORTDbits.RD0=0; //C
nop();
}
else
{
s2=1;
}
}
break;
case CH_22:
if((fudu2>=FuDu_BOTTOM)&&(fudu2<=FuDu_TOP))
{
ch_status2=CH_22;
s2=1;
}
else
{
s2=1;
}
break;
}
}
*/
//定时器1的中断程序
void __attribute__((__interrupt__)) _T1Interrupt(void)
{
IFS0bits.T1IF = 0; // Clear Timer interrupt flag
WriteTimer1(0);
HIGHPOWER=!HIGHPOWER;
}
//SPI2口中断程序
void __attribute__((__interrupt__)) _SPI2Interrupt(void)
{
IFS1bits.SPI2IF = 0;
}
//AD读数程序
void ADread(void)
{
while(PORTBbits.RB12==0); // A/D convert end
delaydms(105);
PORTDbits.RD9=0; //选中7862
nop(); nop();
PORTCbits.RC13=0; // read A/D
nop();
d=PORTB;
nop();
PORTCbits.RC13=1;
e=((d&0x0FFC)|((d>>14)&0x03));
PORTCbits.RC13=0; // read A/D
nop();
f=PORTB;
nop();
PORTCbits.RC13=1;
g=((f&0x0FFC)|((f>>14)&0x03));
nop();nop();
PORTDbits.RD9=1;
}
//A/D转换
void adrh(void)
{
h=0;
// OpenTimer1(); //启动定时器1
PORTCbits.RC1 = 0; //启动A/D
while(XWYB==0)
{
//while(PORTBbits.RB12==0); //A/D转换完
if(h>=1000) break;
ADread();
u[h]=g;
h++;
if(dsd==1) break;
}
for(i=0;i<1000;i++)
{
ADread();
v[i]=e;
if(h<1000)
{
u[h]=g;
}
h++;
}
PORTCbits.RC1 = 1; //停止A/D
}
//算正切角
float suntg(char j)
{
for(b=0;b<250;b++)
{
p=((float)(*(w+a)-*(w+500+a)+i*(*(w+500-a)-*(w+1000-a))))*(*(m+a))+p;
}
if(j>0)
{
t=p+*(w+250)-*(w+750);
}
if(j<0)
{
t=p+*(w+0)-*(w+500);
}
return(t);
}
//计算介质损耗角
float jztg(void)
{
k=-1;
w=&u[0];
m=&cs[0];
A=suntg(k);
k=1;
w=&u[0];
m=&ss[0];
B=suntg(k);
k=-1;
w=&v[0];
m=&cs[0];
C=suntg(k);
k=1;
w=&v[0];
m=&ss[0];
D=suntg(k);
J=(A*D-C*B)/(B*D+A*C);
}
/******************************************************************************************
//主程序
void
delaydms(25000); //延时
//slzs(0xfe);
delaydms(1000);
FloatToChar(0.00048881, ch); //34.526存为(160,26,10,66
j=ch[0];
s1=ch[1];
s2=ch[2];
s3=ch[3];
d=CtoF(ch);
while(1)//17.625 的 float 儲存格式就是:41 8D 00 00
{
;
}
}
//串行口的发送和接收
char Buf[80]; // Received data is stored in array Buf
char * Receivedddata = Buf; //This is UART1 transmit ISR
void __attribute__((__interrupt__)) _U1TXInterrupt(void)
{
IFS0bits.U1TXIF = 0;
}
void __attribute__((__interrupt__)) _U1RXInterrupt(void) //This is UART1 receive ISR
{
IFS0bits.U1RXIF = 0; // Read the receive buffer till atleast one or more character can be read
while( DataRdyUART1())
{
( *( Receiveddata)++) = ReadUART1();
}
}
void yibusxk(void)
{
char Txdata[] = {'M','i','c','r','o','c','h','i','p','
','I','C','D','2','\0'}; //Data to be transmitted using UART communication module
unsigned int baudvalue; // Holds the value of baud register
unsigned int U1MODEvalue; // Holds the value of uart config reg
unsigned int U1STAvalue; // Holds the information regarding uart TX & RX interrupt modes
// Turn off UART1module
ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR6 &
UART_TX_INT_DIS & UART_TX_INT_PR2); // Configure uart1 receive and transmit interrupt
baudvalue = 5;
// Configure UART1 module to transmit 8 bit data with one stopbit.Also Enable loopback mode
U1MODEvalue = UART_EN & UART_IDLE_CON &
UART_DIS_WAKE & UART_EN_LOOPBACK &
UART_EN_ABAUD & UART_NO_PAR_8BIT &
UART_1STOPBIT;
U1STAvalue = UART_INT_TX_BUF_EMPTY &
UART_TX_PIN_NORMAL &
UART_TX_ENABLE & UART_INT_RX_3_4_FUL &
UART_ADR_DETECT_DIS &
UART_RX_OVERRUN_CLEAR;
OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
// Load transmit buffer and transmit the same till null character is
encountered
putsUART1 ((unsigned int *)Txdata);
// Wait for transmission to complete
while(BusyUART1());
// Read all the data remaining in receive buffer which are unread
while(DataRdyUART1())
{
(*( Receiveddata)++) = ReadUART1() ;
}
// Turn off UART1 module
CloseUART1();
return 0;
}
//SPI串口的发送和接收
unsigned int datard ; //Data received at SPI2
void __attribute__((__interrupt__)) _SPI1Interrupt(void)
{
IFS0bits.SPI1IF = 0;
}
void __attribute__((__interrupt__)) _SPI2Interrupt(void)
{
IFS1bits.SPI2IF = 0;
SPI1STATbits.SPIROV = 0; // Clear SPI1 receive overflow flag if set
}
void spifsjs(void)
{
// Holds the information about SPI configuartion
unsigned int SPICONValue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -