基本信息
源码名称:智能车嵌入式开发(AD128.rar)
源码大小:0.04M
文件格式:.rar
开发语言:C/C++
更新时间:2020-01-04
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在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; } }