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

📄 msp430ad.txt

📁 TI公司的MSP430单片机的12位AD变换程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
#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 + -