#include"main.H"
#include"OLED12864.h"
#include"kalman.h"
sbit MODE = P2^5;
sbit beep = P2^2;
sbit KEY1 = P3^3;
sbit KEY2 = P3^4;
sbit KEY3 = P3^5;
sbit KEY4 = P2^4;
sbit DAC_CS = P2^1;
sbit DAC_SCLK = P2^0;
sbit DAC_DIN = P1^7;
bit flag_mode=1,flag_set;
bit flag_finish,flag_work=0;
bit flag_ADC_I,flag_ADC_V;
bit flag_alarm,flag_work_wait=0;
uint16 DAC_data;
uint8 step_I,step_V,set_CUR=0;
uint8 ADC_time;
uint8 set_mode[3]={0,0,0};
uint8 set_temp_I=0,set_temp_V;
uint8 idata set_I[]={"0000\0"};
uint8 idata set_V[]={"00.0\0"};
uint8 idata measure_I[]={"0000\0"};
uint8 idata measure_V[]={"00.0\0"};
uint16 ADC_10;
uint8 load,load_code[5]={"00%\0"};
double test_V;
double ADC_I,ADC_V;
void TLC5615(uint16 dat)
{
uint8 i;
dat<<=6;
DAC_CS = 0; //拉低片选
DAC_SCLK = 0;
for(i=0;i<12;i++)
{
if(dat&0x8000)
{
DAC_DIN = 1;
}
else
{
DAC_DIN = 0;
}
DAC_SCLK = 1;
dat<<=1;
//for(j=0;j<10;j++);
DAC_SCLK = 0;
}
DAC_SCLK = 0;
DAC_CS = 1;
}
void ADC_Init(uint8 i)
{
// AUXR |=0x10; //打开ADC中断
// IE |= 0x20; //打开ADC SPI中断
// EA=1; //打开总中断
switch(i)
{
case 1:ADC_RES = 0;ADC_RESL= 0;ADC_CONTR = 0x81;flag_ADC_I=1;break;
case 2:ADC_RES = 0;ADC_RESL= 0;ADC_CONTR = 0x82;flag_ADC_V=1;break;
}
ADC_CONTR |= 0x08; //启动转换
_nop_();
_nop_();
_nop_();
_nop_();
}
void SET()
{
if(KEY3==0)
{
LCD_DLY_ms(30);
if(KEY3==0)
{
LCD_P16x16Ch(32,0,6); //显示设置模式
LCD_P16x16Ch(48,0,7);
LCD_P16x16Ch(64,0,8);
LCD_P16x16Ch(80,0,9);
set_mode[set_CUR]++;
if(set_mode[set_CUR]==3){set_mode[set_CUR]=1;}
if(set_CUR==0)
{
switch(set_mode[0])
{
case 1: LCD_P16x16Ch(0,2,1); //恒压模式
LCD_P16x16Ch(32,2,2);
LCD_P16x16Ch(48,2,4);
LCD_P16x16Ch(64,2,8);
LCD_P16x16Ch(80,2,9);
flag_mode = 0;
break;
case 2: LCD_P16x16Ch(0,2,1); //恒流模式
LCD_P16x16Ch(32,2,2);
LCD_P16x16Ch(48,2,5);
LCD_P16x16Ch(64,2,8);
LCD_P16x16Ch(80,2,9);
flag_mode = 1;
break;
}
}
if(set_CUR==1)
{
switch(set_mode[1])
{
case 1: if(flag_mode==0)
{
step_V=1;
LCD_P8x16Str(64,6," 0.1V");
}else
{
step_I=1;
LCD_P8x16Str(64,6," 10ma");
}
break;
case 2: if(flag_mode==0)
{
step_V=10;
LCD_P8x16Str(64,6," 1V");
}else
{
step_I=10;
LCD_P8x16Str(64,6,"100ma");
}
break;
}
}
if(set_CUR==2)
{
switch(set_mode[2])
{
case 1: LCD_P16x16Ch(32,6,12);
LCD_P16x16Ch(48,6,13);
LCD_P16x16Ch(64,6,14);
LCD_P16x16Ch(80,6,15);
flag_finish = 1;
break;
case 2: LCD_P16x16Ch(32,6,16);
LCD_P16x16Ch(48,6,17);
LCD_P16x16Ch(64,6,14);
LCD_P16x16Ch(80,6,15);
flag_finish = 0;
break;
}
}
while(!KEY3);
}
}
if(set_CUR==1)
{
if(KEY1==0)
{
LCD_DLY_ms(50);
if(KEY1==0)
{
if(flag_mode==0) //恒压模式
{
set_temp_V-=step_V;
if(set_temp_V>135){set_temp_V=135;}
set_V[0]=set_temp_V/100%10+0x30;
set_V[1]=set_temp_V/10%10+0x30;
set_V[3]=set_temp_V/1%10+0x30;
LCD_P8x16Str(64,4,set_V);
}
else{
set_temp_I-=step_I;//恒流模式
if(set_temp_I>100){set_temp_I=100;}
set_I[0]=set_temp_I/100%10+0x30;
set_I[1]=set_temp_I/10%10+0x30;
set_I[2]=set_temp_I/1%10+0x30;
LCD_P8x16Str(64,4,set_I);
}
while(!KEY1);
}
}
if(KEY2==0)
{
LCD_DLY_ms(50);
if(KEY2==0)
{
if(flag_mode==0) //恒压模式
{
set_temp_V+=step_V;
if(set_temp_V>135){set_temp_V=0;}
set_V[0]=set_temp_V/100%10+0x30;
set_V[1]=set_temp_V/10%10+0x30;
set_V[3]=set_temp_V/1%10+0x30;
LCD_P8x16Str(64,4,set_V);
}
else{ //恒流模式
set_temp_I+=step_I;
if(set_temp_I>100){set_temp_I=0;}
set_I[0]=set_temp_I/100%10+0x30;
set_I[1]=set_temp_I/10%10+0x30;
set_I[2]=set_temp_I/1%10+0x30;
LCD_P8x16Str(64,4,set_I);
}
while(!KEY2);
}
}
}
if(flag_mode==1)
{
LCD_P16x16Ch(32,4,3); //电流
LCD_P16x16Ch(48,4,5);
LCD_P8x16Str(64,4,set_I);
LCD_P8x16Str(96,4,"ma");
}
else
{
LCD_P16x16Ch(32,4,3); //电压
LCD_P16x16Ch(48,4,4);
LCD_P8x16Str(64,4,set_V);
LCD_P8x16Str(96,4,"V ");
}
if(KEY4==0)
{
LCD_DLY_ms(50);
if(KEY4==0)
{
set_CUR++;
if(set_CUR==3 && flag_finish==0){set_CUR=0;}
switch(set_CUR)
{
case 0: LCD_P16x16Ch(0,6,0); //切换光标到调整参数并清除上次光标
LCD_P16x16Ch(32,6,0);
LCD_P16x16Ch(48,6,0);
LCD_P16x16Ch(64,6,0);
LCD_P16x16Ch(80,6,0);
LCD_P16x16Ch(0,2,1);
set_mode[set_CUR]=1;
break;
case 1: LCD_P16x16Ch(0,2,0); //切换光标到调整参数并清除上次光标
LCD_P16x16Ch(0,4,1);
LCD_P16x16Ch(32,6,10); //显示步进
LCD_P16x16Ch(48,6,11);
if(flag_mode==0)
{
step_V=1;
LCD_P8x16Str(64,6," 0.1V");
}else
{
step_I=1;
LCD_P8x16Str(64,6," 10ma");
}
set_mode[set_CUR]=1;
break;
case 2: LCD_P16x16Ch(0,4,0);
LCD_P16x16Ch(16,6,0);
LCD_P16x16Ch(32,6,0);
LCD_P16x16Ch(48,6,0);
LCD_P16x16Ch(64,6,0);
LCD_P16x16Ch(80,6,0);
LCD_P16x16Ch(96,6,0);
LCD_P16x16Ch(0,6,1);
LCD_P16x16Ch(32,6,12); //确认参数
LCD_P16x16Ch(48,6,13);
LCD_P16x16Ch(64,6,14);
LCD_P16x16Ch(80,6,15);
flag_finish=1;
set_mode[set_CUR]=1;
break;
}
while(KEY4);
}
}
if(set_CUR==3 && flag_finish==1){ LCD_CLS();set_CUR=0;flag_finish=0;flag_work_wait=1;ADC_Init(2);flag_set=0;}
}
void work()
{
if(flag_mode==1)
{
MODE = 1;
LCD_P16x16Ch(8,0,2); //恒流模式
LCD_P16x16Ch(24,0,5);
LCD_P16x16Ch(40,0,8);
LCD_P16x16Ch(56,0,9);
LCD_P8x16Str(72,0,set_I);
LCD_P8x16Str(104,0,"ma");
DAC_data=set_temp_I*10/(4.85);
TLC5615(DAC_data);
}
else{
MODE = 0;
LCD_P16x16Ch(8,0,2); //恒流模式
LCD_P16x16Ch(24,0,4);
LCD_P16x16Ch(40,0,8);
LCD_P16x16Ch(56,0,9);
LCD_P8x16Str(72,0,set_V);
LCD_P8x16Str(104,0," V");
DAC_data=(set_temp_V*10/1.46);
TLC5615(DAC_data);
}
LCD_P16x16Ch(8,6,18); //恒流模式
LCD_P16x16Ch(24,6,19);
LCD_P16x16Ch(40,6,20);
LCD_P16x16Ch(56,6,21);
LCD_P16x16Ch(72,6,22);
LCD_P8x16Str(88,6,load_code);
}
void main()
{
LCD_Init();
ADC_Init(1);
//TLC5615(0);
P1M1=0xf9;
P1M0=0xff;
KEY1=KEY2=KEY3=KEY4=1;
LCD_P16x16Ch(24,0,27); //请
LCD_P16x16Ch(40,0,6); //设置参数
LCD_P16x16Ch(56,0,7);
LCD_P16x16Ch(72,0,14);
LCD_P16x16Ch(88,0,15);
while(1)
{
if(flag_set==1)
{
MODE = 1;
TLC5615(0);
SET();
}
else
{
if(KEY3==0)
{
LCD_DLY_ms(10);
if(KEY3==0)
{
beep = 1;
flag_set = 1;
flag_work = 0;
flag_work_wait=0;
flag_alarm = 0;
LCD_CLS();
}
}
}
if(flag_work_wait==1)
{
if((ADC_CONTR & 0x10))
{
ADC_CONTR &= 0xef; //转换完成标志位清零
if(flag_ADC_V==1)
{
ADC_10=ADC_RES;
ADC_10=ADC_10<<2|ADC_RESL;
if(ADC_10>=7){ADC_10-=7;}
ADC_V = ((ADC_10)*5.03/1024);
if(flag_work_wait==1)
{
test_V=ADC_V*3;
flag_work = 1;
flag_work_wait=0;
}
}
ADC_Init(2);
}
}
if(flag_work==1)
{
work();
if((ADC_CONTR & 0x10))
{
ADC_CONTR &= 0xef; //转换完成标志位清零
ADC_time++;
if(ADC_time==3){ADC_time=1;}
if(flag_ADC_I==1)
{
ADC_10=ADC_RES;
//ADC_10=ADC_10<<2|ADC_RESL;
ADC_I = ADC_10*5.03/256;
ADC_I= KalmanFilter(ADC_I,0.0018
评论2