📄 msp430ad.txt
字号:
#include <MSP430x14x.h>
#define ADCMEM ((int *) 0x0140) //ADC12MEMx定义
void InitSYS(void);
void InitUST0(void); //初始化系统及ADC寄存器
void InitUST1(void);
void InitADC(void);
void SetZero(void);
int GetBusData(void);
void SetBusData(int busvdata);
void SendRomCode(void);
void Averege(void);
void Filter(void);
void Analysis(void);
void Delay(int delaydata);
interrupt[ADC_VECTOR] void ADC12(void);
interrupt[USART1RX_VECTOR] void USART1(void);
unsigned char savedata[1500];
unsigned char saveromdata[7];
unsigned char enddata[3];
unsigned int adtime;
unsigned int recromok;
unsigned int ave;
unsigned int datai;
unsigned int vdata;
unsigned int time;
void main(void) //使用中断方式
{
unsigned int i,busvdata,low,hi,ldata;
InitSYS();
InitUST0();
InitUST1();
InitADC();
P1DIR |= 0x20;
P1DIR |= 0x1c; //p1.4 p1.3 p1.2
P1OUT |= BIT4;
SetZero(); //设置x9015到零
for(i=0;i<30000;i++)
{ _NOP(); } //wait to sample
busvdata=GetBusData(); //
while(1)
{
SetBusData(busvdata);
busvdata=GetBusData();
if(busvdata<150)
{ break; }
}
IE2 |=URXIE1;
while(1)
{
// for(time=0;time<256;time++)
// {
//IE2 |=URXIE1;
//low=time;
recromok=0;
while(recromok!=1);
SendRomCode();
for(i=0;i<6500;i++)
{ _NOP(); } //wait to sample
ADC12CTL0 |= 0x02;
ADC12CTL0 |= 0x01; //start AD
adtime=0;
while(1)
{
if(adtime>1500)
{
ADC12CTL0 &= ~0x02;
Filter();
Averege();
Analysis();
for(i=0;i<3;i++)
{
U1TXBUF = enddata[i];
while((U1TCTL&0x01)==0);
}
/* if(enddata[0]==0x11)
{
for(i=0;i<1500;i++)
{
//ldata = savedata[i];
//low = ldata | 0x00;
U1TXBUF = savedata[i];//low;
while((U1TCTL&0x01)==0);
U1TXBUF = 0x00;;//low;
while((U1TCTL&0x01)==0);
//ldata = ldata>>8;
//hi = ldata | 0x00;
//U1TXBUF = hi;
// while((U1TCTL&0x01)==0);
}
} */
break;
}
//}
}
}
}
void SetZero(void)
{
int i;
P1OUT &= ~BIT4; //cs
P1OUT &= ~BIT3; //u/d
for(i=0;i<64;i++)
{
P1OUT ^= BIT2; //inc
}
P1OUT |= BIT4; //cs
}
int GetBusData(void)
{
unsigned char vdata1,vdata2;//,vdata;
adtime=0;
ADC12CTL0 |= 0x02;
ADC12CTL0 |= 0x01; //start AD
while(1)
{
if(adtime>20)
{
ADC12CTL0 &= ~0x02;
break;
}
}
//计算
vdata1=(savedata[0]+savedata[1]+savedata[2]+savedata[3]+savedata[4]+savedata[5]+savedata[6]+savedata[7]+savedata[8]+savedata[9])/10;
vdata2=(savedata[10]+savedata[11]+savedata[12]+savedata[13]+savedata[14]+savedata[15]+savedata[16]+savedata[17]+savedata[18]+savedata[19])/10;
vdata=(vdata1+vdata2)/2;
return(vdata);
}
void SetBusData(int busvdata)
{
int i;
unsigned int temp;
unsigned int movetime;
if(busvdata>150)
{
temp=busvdata-150;
movetime=(temp*20*3)/256/3;
P1OUT &= ~BIT4; //cs
P1OUT |= BIT3; //u/d
for(i=0;i<movetime+1;i++)
{
P1OUT ^= BIT2; //inc
}
P1OUT |= BIT4; //cs
}
}
void SendRomCode(void)
{
U0TXBUF = saveromdata[6];
while((U0TCTL&0x01)==0);
U0TXBUF = saveromdata[5];
while((U0TCTL&0x01)==0);
U0TXBUF = saveromdata[4];
while((U0TCTL&0x01)==0);
U0TXBUF = saveromdata[3];
while((U0TCTL&0x01)==0);
U0TXBUF = saveromdata[2];
while((U0TCTL&0x01)==0);
U0TXBUF = saveromdata[1];
while((U0TCTL&0x01)==0);
}
void Filter(void)
{
unsigned int i,j,m,a[3],ldata;
for(i=0;i<1500;i++)
{
a[0]=savedata[i];
a[1]=savedata[i+1];
a[2]=savedata[i+2];
for(j=0;j<2;j++)
{
for(m=1;m<3;m++)
{
if(a[m]>a[j])
{
ldata=a[j];
a[j]=a[m];
a[m]=ldata;
}
}
}
savedata[i]=a[1];
}
}
void Averege(void)//取5-20共15个得到总线电压值
{
unsigned int i,he;
he=0;
for(i=20;i<30;i++)
{
he=he+savedata[i];
}
ave=he/10;
}
void Analysis(void)
{
int delaytostart,start,error,n,aveadd,time32;
enddata[0]=0;
enddata[1]=0;
enddata[2]=0;
aveadd=ave+30; //问题:如果拉电流太小就达不到 200
datai=0;
while(1)
{
//==============================================================================
datai=datai+50;
delaytostart=0;
start=0;
error=0;
while(1)
{
time32=0;
if(savedata[datai]>aveadd)
{ time32++; }
if(savedata[datai+1]>aveadd)
{ time32++; }
if(savedata[datai+2]>aveadd)
{ time32++; }
if(savedata[datai+3]>aveadd)
{ time32++; }
if(savedata[datai+4]>aveadd)
{ time32++; }
if(time32>=4)
{ start=1; break; }
else if(delaytostart<700)
{ delaytostart++; datai++; }
else
{ error=1; break; }
}
if(error==1)
{ enddata[0]=0x11;enddata[1]=0x11;enddata[2]=0x22;break; }
if(start==1)
{
datai=datai+7;
for(n=1;n<9;n++)
{
switch(n)
{
case 1: datai=datai+16;break;
case 2: datai=datai+16;break;
case 3: datai=datai+17;break;
case 4: datai=datai+16;break;
case 5: datai=datai+16;break;
case 6: datai=datai+17;break;
case 7: datai=datai+16;break;
case 8: datai=datai+16;break;
}
time32=0;
if(savedata[datai]>aveadd)
{ time32++; }
if(savedata[datai+1]>aveadd)
{ time32++; }
if(savedata[datai+2]>aveadd)
{ time32++; }
if(time32>=2)
{
switch(n)
{
case 1: enddata[0] &= ~0x01;break;
case 2: enddata[0] &= ~0x02;break;
case 3: enddata[0] &= ~0x04;break;
case 4: enddata[0] &= ~0x08;break;
case 5: enddata[0] &= ~0x10;break;
case 6: enddata[0] &= ~0x20;break;
case 7: enddata[0] &= ~0x40;break;
case 8: enddata[0] &= ~0x80;break;
}
}
else
{
switch(n)
{
case 1: enddata[0] |= 0x01;break;
case 2: enddata[0] |= 0x02;break;
case 3: enddata[0] |= 0x04;break;
case 4: enddata[0] |= 0x08;break;
case 5: enddata[0] |= 0x10;break;
case 6: enddata[0] |= 0x20;break;
case 7: enddata[0] |= 0x40;break;
case 8: enddata[0] |= 0x80;break;
}
}
//datai=datai+6;
}
}
//=============================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -