在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例嵌入式开发 → 智能车嵌入式开发(AD128.rar)

智能车嵌入式开发(AD128.rar)

嵌入式开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.04M
  • 下载次数:7
  • 浏览次数:171
  • 发布时间:2020-01-04
  • 实例类别:嵌入式开发
  • 发 布 人:ghg666
  • 文件格式:.rar
  • 所需积分: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;
  }
}

标签: 智能车

实例下载地址

智能车嵌入式开发(AD128.rar)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警