2015全国电子设计大赛电源类

#include "msp430g2553.h"
#include "12864.h"
#include "pwm.h"
#include "ad.h"
#include "setdis.h"

int z=0,x=0;
uint i;
void get()
{
U1=getdataAD1(0);
U1=U1*352/32;
U2=getdataAD1(1);
U2=U2*352/32;
I1=0;
for(i=0;i<20;i++)
{I1+=getdataAD1(2);}
I1=I1/20;
I1=I1-254.5;
I1=I1*1000/187;
I1+=0.05;

I2=0;
for(i=0;i<20;i++)
{I2+=getdataAD1(3);}
I2=I2/20;
I2=I2-255.82;
I2=I2*1000/73;
P1=U1*I1;
P2=U2*I2;
a=P1/P2*100;
}

void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
Timer1A3PWM();


int_port();
lcdinit();

P1DIR&=~(BIT1+BIT2); //P1.1和p1.2作为输入,按键改变PWM占空比
P1OUT|=(BIT1+BIT2); //P1.1和p1.2上拉输入
P1REN|=(BIT1+BIT2); //P1.1和p1.2上拉电阻使能

P1DIR&=~(BIT6+BIT7); //P1.6和p1.7作为输入,控制功能

P2DIR|=BIT0+BIT4+BIT3;
P2DIR&=~BIT2;

while(1)
{
if(z==0&&x==0)
{display();}

if(!(P1IN&BIT6))
{ __delay_cycles(1000);
if(!(P1IN&BIT6))
z++;
write_com(0x01);
while(!(P1IN&BIT6)); //判断P1.1按键是否按下
__delay_cycles(1000); //延时
}
if(z==1)
{ set();
get();
display1();
if(U1<=2400)
{
I1/=100;
if(pwm1>500&&pwm1<990)
{
if(((I1-I10)/I10)<=0.10&&((I1-I10)/I10)>0.02)
{pwm1-=1; }
if(((I1-I10)/I10)<=0.15&&((I1-I10)/I10)>0.10)
{pwm1-=2; }
if(((I1-I10)/I10)<=0.2&&((I1-I10)/I10)>0.15)
{pwm1-=4;}
if(((I1-I10)/I10)<=0.3&&((I1-I10)/I10)>0.2)
{pwm1-=8;}
if(((I1-I10)/I10)<=0.5&&((I1-I10)/I10)>0.3)
{pwm1-=12;}
if(((I1-I10)/I10)>0.5)
{pwm1-=25;}

if(((I1-I10)/I10)>=-0.02&&((I1-I10)/I10)<=0.02)
{pwm1=pwm1;}

if(((I1-I10)/I10)>=-0.10&&((I1-I10)/I10)<-0.02)
{pwm1+=1;}
if(((I1-I10)/I10)>=-0.15&&((I1-I10)/I10)<-0.10)
{pwm1+=2; }
if(((I1-I10)/I10)>=-0.2&&((I1-I10)/I10)<-0.15)
{pwm1+=4; }
if(((I1-I10)/I10)>=-0.3&&((I1-I10)/I10)<-0.2)
{ pwm1+=8;}
if(((I1-I10)/I10)>=-0.5&&((I1-I10)/I10)<-0.3)
{ pwm1+=12;}
if(((I1-I10)/I10)<-0.5)
{ pwm1+=25;}
}
else
pwm1=750;
}
else
{pwm1=0;
z=0;
write_com(0x01);}

TA1CCR1=pwm1;
TA1CCR2=TA1CCR1-10;
}
if(z==2)
{z=0;}

if(!(P1IN&BIT7))
{ __delay_cycles(1000);
if(!(P1IN&BIT7))
x++;
write_com(0x01);
while(!(P1IN&BIT7)); //判断P1.1按键是否

按下
__delay_cycles(1000); //延时
}
if(x==1)
{
TA1CCR2=pwm2;
TA1CCR1=TA1CCR2+10;
get();
display2();
U2/=100;
if(pwm2>150&&pwm2<400)
{ if(((U2-30)/30)<=0.05&&((U2-30)/30)>0.0166)
{pwm2-=5; }
if(((U2-30)/30)<=0.12&&((U2-30)/30)>0.05)
{pwm2-=15;}
if(((U2-30)/30)<=0.18&&((U2-30)/30)>0.12)
{pwm2-=30;}
if(((U2-30)/30)<=0.25&&((U2-30)/30)>0.18)
{pwm2-=60;}
if(((U2-30)/30)>0.25)
{pwm2-=80;}

if(((U2-30)/30)>=-0.0166&&((U2-30)/30)<0.0166)
{ pwm2=pwm2;}

if(((U2-30)/30)>=-0.05&&((U2-30)/30)<-0.00166)
{pwm2+=5;}
if(((U2-30)/30)>=-0.12&&((U2-30)/30)<-0.05)
{pwm2+=15; }
if(((U2-30)/30)>=-0.18&&((U2-30)/30)<-0.12)
{pwm2+=30;}
if(((U2-30)/30)>=-0.25&&((U2-30)/30)<-0.18)
{ pwm2+=60;}
if(((U2-30)/30)<-0.25)
{ pwm2+=80;}
}
else
{ pwm2=290; }
TA1CCR2=pwm2;
TA1CCR1=TA1CCR2+10;
}
if(x==2)
{x=0;}
}

}




#include "msp430g2553.h"
#define uint unsigned int
#define uchar unsigned char

extern int pwm2=290;
extern int pwm1=700;

float U1,I1,U2,I2,P1,P2;
float a=0;
float I10=1.00;
void set()
{
P1DIR&=~(BIT1+BIT2); //P1.1和p1.2作为输入,按键改变PWM占空比
P1OUT|=(BIT1+BIT2); //P1.1和p1.2上拉输入
P1REN|=(BIT1+BIT2); //P1.1和p1.2上拉电阻使能
if(!(P1IN&BIT2))
{ __delay_cycles(1000);
if(!(P1IN&BIT2))
I10-=0.05;
while(!(P1IN&BIT2)); //判断P1.1按键是否按下
__delay_cycles(1000); //延时
}

if(!(P1IN&BIT1)) //设定电压加减p1.2和p1.1可在下面增加DA输出
{
__delay_cycles(1000);
if(!(P1IN&BIT1))
I10+=0.05;
while(!(P1IN&BIT1)); //判断P1.1按键是否按下
__delay_cycles(1000); //延时

}
}


void display()
{
write_com(0x80);;
print_string("请选择功能: ");

write_com(0x90);
print_string("充电请按1 ");

write_com(0x98);
print_string("放电请按2 ");
}


void display1()
{
uint f,g,h;
uchar sheding[]={0};

f=(uint)(I10)%10;
g=(uint)(I10*10)%10;
h=(uint)(I10*100)%10;
sheding[0]=f;
sheding[1]=g;
sheding[2]=h;
write_com(0x80); //第一行首地址0x80
print_string("setI10: "); //第一行显示(必须加一个空格否则不能下载)
write_com(0x80+5);
write_data(sheding[0]+'0');
write_data('.');
write_data(sheding[1]+'0');
write_data(sheding[2]+'0');
write_data('0');
write_data('A');



write_com(0x90);
write_data('I');
write_data('1');
write_data(':');
write_data(((int)I1)/100+'0');
write_data('.');
write_data(((int)I1)/10%10+'0');
write_data(((int)I1%10)+'0');
write_data('A');
write_com(0x90+4); //第一行首地址0x80
write_data('U');
write_data('1');
write_data(':');
write_data(((int)U1/1000)%10+'0');
write_data(((int)U1/100)%10+'0');
write_data('.') ;
write_data(((int)U1/10)%10+'0');
write_data('V');

write_com(0x88);
write_data('I');
write_data('2');
write_data(':');
write_data(((int)I2/100)%10+'0');
write_data('.');
write_data(((int)I2/10)%10+'0');
write_data(((int)I2)%10+'0');
write_data('A');

// write_com(0x88);
write_data('U');
write_data('2');
write_data(':');
write_data(((int)U2/1000)%10+'0');
write_data(((int)U2/100)%10+'0');
write_data('.') ;
write_data(((int)U2/10)%10+'0');
write_data('V');

write_com(0x98);
print_string("效率:"); //第一行显示(必须加一个空格否则不能下载)
write_data(((int)a/10)%10+'0');
write_data(((int)a%10)+'0');
write_data('%');
print_string(" ZKB:"); //第一行显示(必须加一个空格否则不能下载)
write_data(((int)(pwm1/10)/10)%10+'0');
write_data(((int)(pwm1/10)%10)+'0');
write_data('%');
}

void display2()
{
write_com(0x80);
write_data('U');
write_data('1');
write_data(':');
write_data(((int)U1/1000)%10+'0');
write_data(((int)U1/100)%10+'0');
write_data('.') ;
write_data(((int)U1/10)%10+'0');
write_data('V');

write_com(0x90);
write_data('U');
write_data('2');
write_data(':');
write_data(((int)U2/1000)%10+'0');
write_data(((int)U2/100)%10+'0');
write_data('.') ;
write_data(((int)U2/10)%10+'0');
write_data('V');

write_com(0x88);
print_string(" ZKB:"); //第一行显示(必须加一个空格否则不能下载)
write_data(((int)(pwm2/10)/10)%10+'0');
write_data(((int)(pwm2/10)%10)+'0');
write_data('%');
}




#include "msp430g2553.h"

#define uint unsigned int
#define uchar unsigned char

void Timer1A3PWM()
{
DCOCTL |= ( DCO0 + DCO1 );
BCSCTL1 |= ( RSEL0 + RSEL1 + RSEL3);

P2DIR |=BIT1+BIT5;
P2SEL |=BIT1+BIT5;


TA1CTL |= TASSEL_2 + MC_3 + TACLR; //时钟源:ACLK
TA1CCR0 =1000; //增减技术模式
TA1CCTL1 |= OUTMOD_6;
TA1CCR1 = 700;
TA1CCTL2 |= OUTMOD_2; //死区时间T=Ttimer*(CCR1-CCR2)
TA1CCR2 = 690;
//TA1CCR2 = 819;
}




#include "msp430g2553.h"

#define uint unsigned int
#define uchar unsigned char

void delay

(uint t) //延时函数
{
uint i,j;
for(i=0; ifor(j=0; j<10; j++);
}
void Delay5us(void)
{
uchar i;

for(i = 0;i < 15;i++);
_NOP();
}
//初始化LCD的IO口
void int_port(void)
{
P1SEL&=~BIT4; //P1.4模拟SID,设置为i/o口输出方向
P1DIR|=BIT4;
P1OUT&=~BIT4;
P1SEL&=~BIT5; //P1.5模拟SCLK,设置为i/o口输出方向
P1DIR|=BIT5;
P1OUT&=~BIT5;
}
//数据传送函数
void sendbyte(unsigned char zdata)
{
unsigned char code_seg7;
unsigned char serial_clk;
unsigned char serial_shift;
code_seg7=zdata;
serial_shift=0x80;
for(serial_clk=0; serial_clk<8; serial_clk++)
{
if(code_seg7&serial_shift)
{
P1OUT|=BIT4; //SID为1
}
else
{
P1OUT&=~BIT4; //SID为0
}
P1OUT&=~BIT5; //产生时钟信号下沿
P1OUT|=BIT5; //产生时钟信号上沿
serial_shift=serial_shift>>1; //准备发送下一位数据
}
}

//写命令函数
void write_com(unsigned char cmdcode)
{ //串口控制格式(11111AB0)
//A数据方向控制,A=H时读,A=L时写
//B数据类型选择,B=H时为显示数据,B=L时为命令
sendbyte(0xf8); //MCU向LCD发命令

sendbyte(cmdcode & 0xf0); //发高四位数据(数据格式D7D6D5D4_0000)
sendbyte((cmdcode << 4) & 0xf0);//发低四位数据(数据格式D3D2D1D0_0000)
delay(2); //延时等待
}
void write_data(unsigned char Dispdata)
{

sendbyte(0xfa); //MCU向LCD发数据
sendbyte(Dispdata & 0xf0); //发高四位数据
sendbyte((Dispdata << 4) & 0xf0);//发低四位数据
delay(2);
}

//LCD初始化
void lcdinit()
{
delay(20000); //复位等待(内部自带上电复位电路),时间较长
write_com(0x30); //功能设定:基本指令集操作
delay(50); //延时等待
write_com(0x0c); //整体显示,关游标
delay(50);
}

//发送字符串
void print_string(unsigned char *s)
{
while(*s!='\0') //C语言里字符串末尾自动加“\0”(ASCII码值为0)
{
delay(50);
write_data(*s); //发送字符对应的ASCII码,12864指针可设置自动指向下一个显示地址

s++;
}
}


#include "msp430g2553.h"


#define uint unsigned int
#define uchar unsigned char

#define clock1 P2OUT|=BIT0
#define clock0 P2OUT&=~BIT0
#define data_in1 P2OUT|=BIT4
#define data_in0 P2OUT&=~BIT4
#define cs1 P2OUT|=BIT3
#define cs0 P2OUT&=~BIT3
uchar flag;

unsigned int readAD(char dout) // dout为 输入通道 TLC2543
{
unsigned int dataout=0;
unsigned char i;
dout<<=4;
dout|=0x08;
clock0;
Delay5us();
cs0;
Delay5us();

for( i = 0; i < 12; i ++ )
{
flag=P2IN&BIT2;
if(flag)
{dataout|=1;}
dataout<<=1;
if((dout&0x80)) {data_in1 ;Delay5us(); }
else {data_in0 ;Delay5us();}
clock1;
Delay5us(); // 时钟上升沿,TLC2543 输出使能
dout<<=1;
clock0;
Delay5us(); // 时钟下降沿,TLC2543 输入使能
}
cs1; Delay5us();
return ( dataout>>4 );
}

uint getdataAD(char AIN) // 中值滤波
{
uint t,tag,sum,value[9];
char i,j,k;
for(k=0;k<9;k++)
{
value[k]=readAD(AIN);
//_nop_();
}
for(i=1;i<=9;i++)
{
tag=1;
for(j=0;j{
if(value[j]>value[j+1])
{
t=value[j]; value[j]=value[j+1];value[j+1]=t;
tag=0;
}
}
if(tag) break;
}
sum=value[4];
return (sum);

}
uint getdataAD1(char AIN)
{
int t=0;
int i[10]={0};
for(int j=0;j<10;j++)
i[j]=getdataAD(AIN);
for(int j=0;j<10;j++)
{
t+=i[j];
}
return (t/10);
}


相关文档
最新文档