#include "STC8XXXX.h" #include "oled.h" #include "bmp.h" #include "timer0.h" #include "ADC.h" #include "EEPROM.h" #include #define vol_channel 0 #define tem_channel 1 #define vcc_channel 15 void prekey(void);//计算按键按下时长 void relkey_page0(void);//对按键操作做出反应 void relkey_page1(void);//对按键操作做出反应 void page0(void);//第0个页面 void page1(void);//第1个页面 void mode0(void);//模式0 void mode1(void);//模式1 void pid_p(void); unsigned int presstime=500;//长按时间ms unsigned int tartem=300;//设定温度 unsigned int keyi0=0;//按键0时长 unsigned int keyi1=0;//按键1时长 unsigned int keyi=0;//同时按下时长 unsigned int maxtartem=350;//最大设定温度,可设置 unsigned int mintartem=1;//最小设定温度,可设置 unsigned int i;//for循环变量 unsigned int time;//定时器计时 unsigned int kp=10,ki=20,kd=30; int pwm=0; int pagenum=0; int err=0,lasterr=0; int integral=0; int derivative=0; double showpwm=0; double showpwm_opp=0; double powvol;//电源电压统计 double powvol_average[30]=0;//电源电压均值 double realtem=200;//真实温度 double realtem_average[30]=0;//实际温度统计 double p1= 0.00000016;//温度曲线参数1 double p2= -0.00089441;//温度曲线参数2 double p3= 1.91367865;//温度曲线参数3 double p4=-1537.97459730;//温度曲线参数4 double vcc=0; unsigned char count=0;//电源电压统计计数 unsigned char page = 0;//页面选择 unsigned char modesel=0;//模式选择 unsigned char keyx0,keyx1; unsigned char page1_iconnum=4;//页面1选项数量 unsigned char page1_PIDnum=4;//PID二级页面选项数量 unsigned char page1_TEMnum=3;//温度二级页面选项数量 unsigned char page1_MODEnum=3;//模式二级页面选项数量 unsigned char eeptart[2]=0; unsigned char eepkp[2]=0; unsigned char eepki[2]=0; unsigned char eepkd[2]=0; unsigned char eepmaxt[2]=0; unsigned char eepmint[2]=0; unsigned char mapline[101]=0;//温度记录 unsigned char numofsam=30;//取样次数 sbit heat=P3^4;//加热 sbit key0=P3^2;//按键0 sbit key1=P3^3;//按键1 bit swclose=1;//按键休眠开关 bit keyj0;//按键0标志位 bit keyj1;//按键1标志位 bit keyj;//同时按下标志位-1 bit keyp;//同时按下标志位-2 bit eeprom_tartem=1;//设定温度标志位 bit eeprom_pid=1;//PID参数标志位 bit eeprom_limtem=1;//温度限制标志位 bit eeprom_mode=1; bit pageflag;//切换页面标志位 bit blinker;//刷新标志位 bit pidflag; void init(void) { EEPROM_read_n(0x0000,&eeptart[0],2); EEPROM_read_n(0x0200,&eepkp[0],2); EEPROM_read_n(0x0204,&eepki[0],2); EEPROM_read_n(0x0208,&eepkd[0],2); EEPROM_read_n(0x0400,&eepmaxt[0],2); EEPROM_read_n(0x0404,&eepmint[0],2); EEPROM_read_n(0x0600,&modesel,1); tartem=(256*eeptart[1])+eeptart[0]; kp=(256*(eepkp[1]))+(eepkp[0]); ki=(256*(eepki[1]))+(eepki[0]); kd=(256*(eepkd[1]))+(eepkd[0]); maxtartem=(256*(eepmaxt[1]))+(eepmaxt[0]); mintartem=(256*(eepmint[1]))+(eepmint[0]); if(maxtartem>350){maxtartem=350;} else if(maxtartem<200){maxtartem=200;} if(mintartem>200){mintartem=0;} else if(mintartem<0){mintartem=0;} if(tartem>maxtartem){tartem=maxtartem;} else if(tartem1000){kp=500;} else if(kp<0){kp=0;} if(ki>1000){ki=500;} else if(ki<0){ki=0;} if(kd>1000){kd=500;} else if(kd<0){kd=0;} if(modesel>page1_MODEnum-2 || page1_MODEnum<0) { modesel=0; } P1M0 = 0x00;//00000011 P1M1 = 0xff;//11111100 P3M0 = 0xff;//11111111 P3M1 = 0x0c;//00001100 heat=0; swclose=0; powvol=0; adc_init();//初始化ADC OLED_Init();//初始化屏幕 Timer0Init();//初始化定时器0 EA=1; showpwm_opp=100-showpwm; for(i=0;i=time && swclose){heat=1;} else/* if(pwm