MSP430f149 AD源程序.doc
#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);interruptADC_VECTOR void ADC12(void);interruptUSART1RX_VECTOR void USART1(void);unsigned char savedata1500;unsigned char saveromdata7;unsigned char enddata3;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 = enddatai; while(U1TCTL&0x01)=0); /* if(enddata0=0x11) for(i=0;i<1500;i+) /ldata = savedatai; /low = ldata | 0x00; U1TXBUF = savedatai;/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=(savedata0+savedata1+savedata2+savedata3+savedata4+savedata5+savedata6+savedata7+savedata8+savedata9)/10; vdata2=(savedata10+savedata11+savedata12+savedata13+savedata14+savedata15+savedata16+savedata17+savedata18+savedata19)/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 = saveromdata6; while(U0TCTL&0x01)=0); U0TXBUF = saveromdata5; while(U0TCTL&0x01)=0); U0TXBUF = saveromdata4; while(U0TCTL&0x01)=0); U0TXBUF = saveromdata3; while(U0TCTL&0x01)=0); U0TXBUF = saveromdata2; while(U0TCTL&0x01)=0); U0TXBUF = saveromdata1; while(U0TCTL&0x01)=0); void Filter(void) unsigned int i,j,m,a3,ldata; for(i=0;i<1500;i+) a0=savedatai; a1=savedatai+1; a2=savedatai+2; for(j=0;j<2;j+) for(m=1;m<3;m+) if(am>aj) ldata=aj; aj=am; am=ldata; savedatai=a1; void Averege(void)/取520共15个得到总线电压值 unsigned int i,he; he=0; for(i=20;i<30;i+) he=he+savedatai; ave=he/10; void Analysis(void) int delaytostart,start,error,n,aveadd,time32; enddata0=0; enddata1=0; enddata2=0; aveadd=ave+30; /问题:如果拉电流太小就达不到 200 datai=0; while(1) /= datai=datai+50; delaytostart=0; start=0; error=0; while(1) time32=0; if(savedatadatai>aveadd) time32+; if(savedatadatai+1>aveadd) time32+; if(savedatadatai+2>aveadd) time32+; if(savedatadatai+3>aveadd) time32+; if(savedatadatai+4>aveadd) time32+; if(time32>=4) start=1; break; else if(delaytostart<700) delaytostart+; datai+; else error=1; break; if(error=1) enddata0=0x11;enddata1=0x11;enddata2=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(savedatadatai>aveadd) time32+; if(savedatadatai+1>aveadd) time32+; if(savedatadatai+2>aveadd) time32+; if(time32>=2) switch(n) case 1: enddata0 &= 0x01;break; case 2: enddata0 &= 0x02;break; case 3: enddata0 &= 0x04;break; case 4: enddata0 &= 0x08;break; case 5: enddata0 &= 0x10;break; case 6: enddata0 &= 0x20;break; case 7: enddata0 &= 0x40;break; case 8: enddata0 &= 0x80;break; else switch(n) case 1: enddata0 |= 0x01;break; case 2: enddata0 |= 0x02;break; case 3: enddata0 |= 0x04;break; case 4: enddata0 |= 0x08;break; case 5: enddata0 |= 0x10;break; case 6: enddata0 |= 0x20;break; case 7: enddata0 |= 0x40;break; case 8: enddata0 |= 0x80;break; /datai=datai+6; /= datai=datai+50; delaytostart=0; start=0; error=0; while(1) time32=0; if(savedatadatai>aveadd) time32+; if(savedatadatai+1>aveadd) time32+; if(savedatadatai+2>aveadd) time32+; if(savedatadatai+3>aveadd) time32+; if(savedatadatai+4>aveadd) time32+; if(time32>=4) start=1;break; else if(delaytostart<400) delaytostart+; datai+; else error=1;break; if(error=1) enddata1=0x11;enddata2=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(savedatadatai>aveadd) time32+; if(savedatadatai+1>aveadd) time32+; if(savedatadatai+2>aveadd) time32+; if(time32>=2) switch(n) case 1: enddata1 &= 0x01;break; case 2: enddata1 &= 0x02;break; case 3: enddata1 &= 0x04;break; case 4: enddata1 &= 0x08;break; case 5: enddata1 &= 0x10;break; case 6: enddata1 &= 0x20;break; case 7: enddata1 &= 0x40;break; case 8: enddata1 &= 0x80;break; else switch(n) case 1: enddata1 |= 0x01;break; case 2: enddata1 |= 0x02;break; case 3: enddata1 |= 0x04;break; case 4: enddata1 |= 0x08;break; case 5: enddata1 |= 0x10;break; case 6: enddata1 |= 0x20;break; case 7: enddata1 |= 0x40;break; case 8: enddata1 |= 0x80;break; /datai=datai+6; /= datai=datai+50; delaytostart=0; start=0; error=0; while(1) time32=0; if(savedatadatai>aveadd) time32+; if(savedatadatai+1>aveadd) time32+; if(savedatadatai+2>aveadd) time32+; if(savedatadatai+3>aveadd) time32+; if(savedatadatai+4>aveadd) time32+; if(time32>=4) start=1;break; else if(delaytostart<400) delaytostart+; datai+; else error=1;break; if(error=1) enddata2=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(savedatadatai>aveadd) time32+; if(savedatadatai+1>aveadd) time32+; if(savedatadatai+2>aveadd) time32+; if(time32>=2) switch(n) case 1: enddata2 &= 0x01;break; case 2: enddata2 &= 0x02;break; case 3: enddata2 &= 0x04;break; case 4: enddata2 &= 0x08;break; case 5: enddata2 &= 0x10;break; case 6: enddata2 &= 0x20;break; case 7: enddata2 &= 0x40;break; case 8: enddata2 &= 0x80;break; else switch(n) case 1: enddata2 |= 0x01;break; case 2: enddata2 |= 0x02;break; case 3: enddata2 |= 0x04;break; case 4: enddata2 |= 0x08;break; case 5: enddata2 |= 0x10;brea