基本信息
源码名称:智能车嵌入式开发(AD128.rar)
源码大小:0.04M
文件格式:.rar
开发语言:C/C++
更新时间:2020-01-04
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍


#include"msp430x26x.h"
#include"stdio.h"
#include"math.h"
#include"LCD.h"
#include"icc.h"


#define  uchar   unsigned char
#define  uint    unsigned int
#define  ulong   unsigned long
#define  Num_of_Results   16
float Ratio=3.02;
uint t,temp,temp1=100,temp2=100;
uint add_10=1,add_100=1;
uchar state,cnt=0,cnt1=0,EndFlag=0,LoadFlag=1;
uchar table[4];
void CLOCK_Init();
void ADC12_Init();
void DAC12_Init();
void TimeA_Init();
void GPIO_Init();
void Transform();
void Sum();
void delay(uint z);
void fuzai();
void Transform_dis(uint sum,uchar state,uchar type);


uchar   table1[16]="    欢迎光临   ";
uchar   table2[16]="简易直流电子负载";
uchar   table3[16]="章之倚  罗志强";
uchar   table4[16]="指导老师:陈丹江";
uchar   table5[16]="采样电流:";
uchar   table6[16]="设置电流:";
uchar   table7[16]="采样电压";
uchar   table8[16]="负载调整率";

main(void)
{
  
    WDTCTL=WDTPW  WDTHOLD;
    if(CALBC1_1MHZ==0XFF ||CALDCO_1MHZ==0XFF)
    {
        while(1);
    }
    
   CLOCK_Init();
   Init_LCD();//初始化液晶
   _EINT();
   GPIO_Init();
   DAC12_Init();
   Disp_string(1,1,table1);
   Disp_string(1,2,table2);
   Disp_string(1,3,table3);
   Disp_string(1,4,table4);
   delay(30000);
   Write_cmd(0x00);
   while(1)
   {  
      Transform();
      Sum();
      if(EndFlag==0)
       {
        P4OUT|=BIT5;
       }
       else
       {
          DAC12_0DAT=temp2*Ratio;
       }
      
      if(LoadFlag==0)
      {
          fuzai();
      }
     
   }
}

/*****************************************
            1ms延时程序  8M晶振
*****************************************/
void delay(uint z)
{
    unsigned int i,j;
    for(i = 0;i<500;i  )
      for(j=0;j<z;j  )
      {;;};
}

/******************************************
            时钟初始函数
******************************************/
void CLOCK_Init() //配置MCLK,SMCLK均为8MHz
{ 
  BCSCTL2=SELM_0 DIVM_0 DIVS_0;
  if(CALBC1_8MHZ!=0xFF)
  {
    //__delay_cycles(10000);
    DCOCTL=0x00;
    BCSCTL1=CALBC1_16MHZ;
    DCOCTL=CALDCO_16MHZ;
  }
  BCSCTL1|=XT2OFF DIVA_0; 
}
/******************************************
            时钟初始函数
******************************************/
/*void CLOCK_Init()
{
  //P5DIR=BIT4;
  //P5SEL=BIT4;
  //P1DIR=BIT4;
  //P1SEL=BIT4;
  DCOCTL =CALDCO_16MHZ;
  BCSCTL1=0x00FD;
  BCSCTL2=SELM_2 DIVS_3;
  
}*/

/****************************************** 
            GPIO初始化函数
******************************************/
void GPIO_Init()
{ 
  P4DIR=BIT5;
  P4OUT&=~BIT5;
  P2DIR=0X00;
  P2IES=0xFF;
  P2IE =0XFF;
  P2IFG=0x00;
}
/******************************************

           DAC1初始函数
******************************************/
void DAC12_Init()
{
  P6DIR=BIT6;
  P6SEL=BIT6;
  DAC12_0CTL = DAC12SREF_3 DAC12IR   DAC12AMP_5; // Int ref gain 1
  //DAC12_0DAT = 0x0666;                     // 1.0V (2.5V = 0x0FFFh)
  DAC12_0CTL|=DAC12IE;
}
/*****************************************
              配置ads1115
*****************************************/
void Confige1115(uchar chanel)
{
    unsigned char  i;
    switch(chanel) 
    {
        case 0:   table[2] = 0xC8;  break;//设置配置寄存器的高八位1100 0101,即AINp=AIN0,AINn=GND;满量程FS= -4.096;连续转换模式
        case 1:   table[2] = 0xD4;  break;
        case 2:   table[2] = 0xE2;  break;
        case 3:   table[2] = 0xF2;break;
        default:break;
    }
    table[0] = 0x90;//CMD_Write;
    table[1] = 0x01;//指向配置寄存器
   
    table[3] = 0xe3;//设置配置寄存器的低八位1100 0101,即
    start();//发送起始信号
    for(i=0;i<4;i  )
    {   
      shout(table[i]);//将table里面的数写入ads1115
      _NOP();
    }
    stop();//发送停止信号
    
}
/*******************************************
    指向ADS1115指针寄存器用于准备读取数据
*******************************************/
void PointRegister (void)
{
    unsigned char i;
    table[0] = 0x90;//写
    table[1] = 0x00;//指针指向转换寄存器
    start();//发送起始信号
    for(i=0;i<2;i  )
    {
      shout(table[i]);//将table里面的数写入ads1115
      delay(5);
    }
    stop();//发送停止信号
}
/*******************************************
          读转换寄存器里面的值
*******************************************/
uint read()
{  
    uint result,resulth,resultl;
    start(); 
    shout(0x91); 
    resulth = shin();  //高八位               
    resultl = shin(); //底八位
    stop(); 
    result=(resulth<<8)|resultl;
    if(result>0x7fff)
      result=~result 1;//用于测量负电压,负电压从8000~ffff,负电压与正关于0有类似对称关系,按位取反后 1相同
    return result;	   
}
/******************************************
          获取最终模数转换之后的结果
*******************************************/
uint getad(uchar chanel)
{
    uint value;
    Confige1115(chanel);  
    _NOP();
    PointRegister();
   _NOP(); 
    value=read();
    return value;
}

/********************************************/
/*              采样值加权平均              */
/*******************************************/

void Sum(void)
{
  
  uint i,j;
  ulong sumA3=0,sumA4=0;
  for(i=0;i<16;i  )
       {
          sumA3 =getad(0);
       }
       sumA3>>=4;
       Transform_dis(sumA3,0,0);
       
       for(j=0;j<16;j  )
       {
          sumA4 =getad(1);
       }
       sumA4>>=4;
       Transform_dis(sumA4,1,1);
       
  }

/*******************************************
                电流转化函数
********************************************/
void Transform()
{
  uchar dl[5];
  dl[0]=temp2/1000 0x30;
  dl[1]=temp2%1000/100 0x30;
  dl[2]=temp2%1000%100/10 0x30;
  dl[3]=temp2%1000%100%10 0x30;
  dl[4]='\0';
  if(dl[0]==0x30)
  {
    dl[0]=0x20;
  }
  Disp_string(1,1,table6);
  Disp_string(6,1,dl);
  Disp_string(8,1,"mA");
  
}
/*******************************************
                负载调整率
*******************************************/
void fuzai()
{   
    float avg=0,volt1=0,volt2=0;
    uchar voltdis[5];
    Disp_string(1,4,table8);
    DAC12_0DAT=3020;
    delay(100);
    volt1=getad(1);
    DAC12_0DAT=0;
    delay(100);
    volt2=getad(1);
    avg=(volt2-volt1)*100/volt2;
    voltdis[0]=((uint)(avg*10))/100 0x30;
    voltdis[1]=((uint)(avg*10))%100/10 0x30;
    voltdis[2]='.';
    voltdis[3]=((uint)(avg*10))%10 0x30;
    voltdis[4]='%';
    Disp_string(6,4,voltdis);
    LoadFlag=~LoadFlag;
}

/*******************************************/
/*             电压、温度装换函数          */
/*******************************************/

void  Transform_dis(uint sum,uchar state,uchar type)
{
  
  float DataTemp;
  float constI=0.048;
  float constV=0.686;
  uint  Curr_Volt;
  uint temp,temp1,temp2;
  uchar display[6];
  DataTemp=sum;
  
  if(type==0)
  {
      DataTemp=DataTemp*constI;
      Curr_Volt=(uint)DataTemp-10;
      display[0]=(Curr_Volt/1000) 0x30;                  /*取千位*/
      temp=Curr_Volt-((display[0]-0x30)*1000);
      display[1]=(temp/100) 0x30;                        /*取百位*/
      temp1=temp-((display[1]-0x30)*100);
      display[2]=(temp1/10) 0x30;                        /*取十位*/
      display[3]=(temp1-(display[2]-0x30)*10) 0x30;      /*取个位*/
      display[4]='\0';
      Disp_string(1,3,table5);
      Disp_string(6,3,display);
      Disp_string(8,3,"mA");
      type=0;
    
    }
 else
   {
        
        DataTemp=DataTemp*constV;
        Curr_Volt=(uint)DataTemp-40;
        
        if(Curr_Volt>18050)
        {
            P4OUT|=BIT5;
        }
        
        if(Curr_Volt<17950&&EndFlag==1)
        {
            P4OUT&=~BIT5;
        }
        
        if(Curr_Volt>10000)
        {
            display[0]=(Curr_Volt/10000) 0x30;                  /*取千位*/
            temp=Curr_Volt-((display[0]-0x30)*10000);
            display[1]=(temp/1000) 0x30;                        /*取百位*/
            temp1=temp-((display[1]-0x30)*1000);
            display[3]=(temp1/100) 0x30;                        /*取十位*/
            temp2=(temp1-(display[3]-0x30)*100);                /*取个位*/
            display[4]=(temp2/10) 0x30;
            display[5]=temp2%10 0x30;
            display[2]='.';
            display[6]='\0';
        }
        else
        {
            display[0]=(Curr_Volt/1000) 0x30;                  /*取千位*/
            temp=Curr_Volt-((display[0]-0x30)*1000);
            display[2]=(temp/100) 0x30;                        /*取百位*/
            temp1=temp-((display[2]-0x30)*100);
            display[3]=(temp1/10) 0x30;                        /*取十位*/
            display[4]=(temp1-(display[3]-0x30)*10) 0x30;      /*取个位*/
            display[1]='.';
            display[5]='\0';
        }
        Disp_string(1,2,table7);
        Disp_string(5,2,display);
        Disp_string(8,2,"V");
  
      type=0;
    }
  
}

/*******************************************
               PORT2中断函数
*******************************************/
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
  if(0xFF !=(P2IN & 0xFF))
  delay(10);
  if(0xFF !=(P2IN & 0XFF))
  { 
    while(0xFF !=( P2IN & 0xFF));
    switch (P2IFG)
        { 
         case 0x01:
                    if(temp2<1000)
                    {
                      temp2=temp2 10;
                    }
                    else
                    {
                      temp2=1000;
                    }
                    P2IFG&=0X00;
                    break;
         case 0x02: 
                   if(temp2>100)
                     {
                       temp2=temp2-10;
                     }
                   else
                   {
                     temp2=100;
                   };
                   P2IFG&=0X00;
                    break;
         case 0x08: if(temp2<1000)
                    {
                      temp2=temp2 100;
                    }
                    else
                    {
                      temp2=1000;
                    }
                    P2IFG&=0X00;
                    break; 
        case 0x20: 
                   if(temp2>100)
                     {
                       temp2=temp2-100;
                     }
                   else
                   {
                     temp2=100;
                   }
                   
                   P2IFG&=0X00;
                   break;
        case 0x04: if(cnt%2==0)       //开路
                   {
                    P4OUT|=BIT5;
                    EndFlag=1;
                    cnt  ;
                    }
                   else
                   {
                    P4OUT&=~BIT5;
                    EndFlag=0;
                    cnt  ;
                   }
                   P2IFG&=0X00;
                   break;
        case 0x10: Ratio =0.01;          //电流系数微调
                   P2IFG&=0X00;
                   break;
            
                   
                   
        
        case 0x40: Ratio-=0.01;          //电流系数微调
                   P2IFG&=0X00;
                   break;
        
                   
                   
        case 0x80: if(cnt1%2==0)       //开路
                   {
                     LoadFlag=1;
                     cnt1  ;
                    }
                   else
                   {
                    LoadFlag=0;
                    cnt1  ;
                   }
                    break;
         default:  P2IFG &=0x00;             // P2.0-P2.2 IO口中断标志位清除
                    break;           
        }
    
        P2IFG&=0X00;
  }
  else
  {
    P2IFG&=0X00;
  }
}