| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798 |
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 1
- C51 COMPILER V9.54, COMPILATION OF MODULE MAIN
- OBJECT MODULE PLACED IN .\Objects\main.obj
- COMPILER INVOKED BY: D:\Keil5 C51\C51\BIN\C51.EXE main.c LARGE OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\Listi
- -ngs\main.lst) TABS(2) OBJECT(.\Objects\main.obj)
- line level source
- 1 #include "STC8XXXX.h"
- 2 #include "oled.h"
- 3 #include "bmp.h"
- 4 #include "timer0.h"
- 5 #include "ADC.h"
- 6 #include "EEPROM.h"
- 7 #include <math.h>
- 8
- 9 #define vol_channel 0
- 10 #define tem_channel 1
- 11 #define vcc_channel 15
- 12
- 13 void prekey(void);//计算按键按下时长
- 14 void relkey_page0(void);//对按键操作做出反应
- 15 void relkey_page1(void);//对按键操作做出反应
- 16 void page0(void);//第0个页面
- 17 void page1(void);//第1个页面
- 18 void mode0(void);//模式0
- 19 void mode1(void);//模式1
- 20 void pid_p(void);
- 21
- 22 unsigned int presstime=500;//长按时间ms
- 23 unsigned int tartem=300;//设定温度
- 24 unsigned int keyi0=0;//按键0时长
- 25 unsigned int keyi1=0;//按键1时长
- 26 unsigned int keyi=0;//同时按下时长
- 27 unsigned int maxtartem=350;//最大设定温度,可设置
- 28 unsigned int mintartem=1;//最小设定温度,可设置
- 29 unsigned int i;//for循环变量
- 30 unsigned int time;//定时器计时
- 31 unsigned int kp=10,ki=20,kd=30;
- 32
- 33 int pwm=0;
- 34 int pagenum=0;
- 35 int err=0,lasterr=0;
- 36 int integral=0;
- 37 int derivative=0;
- 38
- 39 double showpwm=0;
- 40 double showpwm_opp=0;
- 41 double powvol;//电源电压统计
- 42 double powvol_average[30]=0;//电源电压均值
- 43 double realtem=200;//真实温度
- 44 double realtem_average[30]=0;//实际温度统计
- 45 double p1= 0.00000016;//温度曲线参数1
- 46 double p2= -0.00089441;//温度曲线参数2
- 47 double p3= 1.91367865;//温度曲线参数3
- 48 double p4=-1537.97459730;//温度曲线参数4
- 49 double vcc=0;
- 50
- 51 unsigned char count=0;//电源电压统计计数
- 52 unsigned char page = 0;//页面选择
- 53 unsigned char modesel=0;//模式选择
- 54 unsigned char keyx0,keyx1;
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 2
- 55 unsigned char page1_iconnum=4;//页面1选项数量
- 56 unsigned char page1_PIDnum=4;//PID二级页面选项数量
- 57 unsigned char page1_TEMnum=3;//温度二级页面选项数量
- 58 unsigned char page1_MODEnum=3;//模式二级页面选项数量
- 59 unsigned char eeptart[2]=0;
- 60 unsigned char eepkp[2]=0;
- 61 unsigned char eepki[2]=0;
- 62 unsigned char eepkd[2]=0;
- 63 unsigned char eepmaxt[2]=0;
- 64 unsigned char eepmint[2]=0;
- 65 unsigned char mapline[101]=0;//温度记录
- 66 unsigned char numofsam=30;//取样次数
- 67
- 68 sbit heat=P3^4;//加热
- 69 sbit key0=P3^2;//按键0
- 70 sbit key1=P3^3;//按键1
- 71
- 72 bit swclose=1;//按键休眠开关
- 73 bit keyj0;//按键0标志位
- 74 bit keyj1;//按键1标志位
- 75 bit keyj;//同时按下标志位-1
- 76 bit keyp;//同时按下标志位-2
- 77 bit eeprom_tartem=1;//设定温度标志位
- 78 bit eeprom_pid=1;//PID参数标志位
- 79 bit eeprom_limtem=1;//温度限制标志位
- 80 bit eeprom_mode=1;
- 81 bit pageflag;//切换页面标志位
- 82 bit blinker;//刷新标志位
- 83 bit pidflag;
- 84
- 85 void init(void)
- 86 {
- 87 1 EEPROM_read_n(0x0000,&eeptart[0],2);
- 88 1 EEPROM_read_n(0x0200,&eepkp[0],2);
- 89 1 EEPROM_read_n(0x0204,&eepki[0],2);
- 90 1 EEPROM_read_n(0x0208,&eepkd[0],2);
- 91 1 EEPROM_read_n(0x0400,&eepmaxt[0],2);
- 92 1 EEPROM_read_n(0x0404,&eepmint[0],2);
- 93 1 EEPROM_read_n(0x0600,&modesel,1);
- 94 1 tartem=(256*eeptart[1])+eeptart[0];
- 95 1 kp=(256*(eepkp[1]))+(eepkp[0]);
- 96 1 ki=(256*(eepki[1]))+(eepki[0]);
- 97 1 kd=(256*(eepkd[1]))+(eepkd[0]);
- 98 1 maxtartem=(256*(eepmaxt[1]))+(eepmaxt[0]);
- 99 1 mintartem=(256*(eepmint[1]))+(eepmint[0]);
- 100 1 if(maxtartem>350){maxtartem=350;}
- 101 1 else if(maxtartem<200){maxtartem=200;}
- 102 1 if(mintartem>200){mintartem=0;}
- 103 1 else if(mintartem<0){mintartem=0;}
- 104 1 if(tartem>maxtartem){tartem=maxtartem;}
- 105 1 else if(tartem<mintartem){tartem=mintartem;}
- 106 1 if(kp>1000){kp=500;}
- 107 1 else if(kp<0){kp=0;}
- 108 1 if(ki>1000){ki=500;}
- 109 1 else if(ki<0){ki=0;}
- 110 1 if(kd>1000){kd=500;}
- 111 1 else if(kd<0){kd=0;}
- 112 1 if(modesel>page1_MODEnum-2 || page1_MODEnum<0)
- 113 1 {
- 114 2 modesel=0;
- 115 2 }
- 116 1 P1M0 = 0x00;//00000011
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 3
- 117 1 P1M1 = 0xff;//11111100
- 118 1 P3M0 = 0xff;//11111111
- 119 1 P3M1 = 0x0c;//00001100
- 120 1 heat=0;
- 121 1 swclose=0;
- 122 1 powvol=0;
- 123 1 adc_init();//初始化ADC
- 124 1 OLED_Init();//初始化屏幕
- 125 1 Timer0Init();//初始化定时器0
- 126 1 EA=1;
- 127 1 showpwm_opp=100-showpwm;
- 128 1 for(i=0;i<numofsam;i++)
- 129 1 {
- 130 2 powvol_average[i]=get_adc(vol_channel);//读取电源ADC值
- 131 2 realtem_average[i]=transform(get_adc(tem_channel),p1,p2,p3,p4);
- 132 2 }
- 133 1 for(i=0;i<numofsam;i++)
- 134 1 {
- 135 2 vcc+=(1.19*4096)/get_adc(vcc_channel);//计算电源电压
- 136 2 }
- 137 1 vcc/=numofsam;
- 138 1 for(i=0;i<numofsam;i++)
- 139 1 {
- 140 2 powvol+=19*vcc*(powvol_average[i]/4096);
- 141 2 realtem+=realtem_average[i];
- 142 2 }
- 143 1 powvol/=numofsam;
- 144 1 realtem/=numofsam;
- 145 1 }
- 146
- 147 void main(void)
- 148 {
- 149 1 init();
- 150 1 while(1)
- 151 1 {
- 152 2 if(page==0){page0();}//页面0
- 153 2 if(page==1){page1();}//页面1
- 154 2 }
- 155 1 }
- 156
- 157 void timer0()interrupt 1
- 158 {
- 159 1 time++;
- 160 1 time %= 1000;
- 161 1 if(time%1000==0){blinker=0;if(swclose){pidflag=1;}}
- 162 1 if(pwm>=time && swclose){heat=1;}
- 163 1 else/* if(pwm<time || !swclose)*/{heat=0;}
- 164 1 prekey();//检测和计算按键按下时长
- 165 1 }
- 166
- 167 void prekey(void)
- 168 {
- 169 1 if(!key0 && key1 && !keyj)
- 170 1 {keyi0++;keyj0=1;}
- 171 1 if(!key1 && key0 && !keyj)
- 172 1 {keyi1++;keyj1=1;}
- 173 1 if(!key0 && !key1 && keyi0<presstime && keyi1<presstime)
- 174 1 {keyi0=keyi1=keyj0=keyj1=0;keyi++;keyj=1;}
- 175 1 }
- 176
- 177 void relkey_page0(void)
- 178 {
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 4
- 179 1 if(!key0 && keyi0>=presstime)//长按0
- 180 1 {
- 181 2 if(tartem<maxtartem)
- 182 2 {
- 183 3 tartem++;
- 184 3 eeprom_tartem=0;
- 185 3 }
- 186 2 }
- 187 1 else if(key0 && keyj0)//短按0
- 188 1 {
- 189 2 if(tartem<maxtartem)
- 190 2 {
- 191 3 tartem++;keyi0=0;keyj0=0;eeprom_tartem=0;
- 192 3 }
- 193 2 }
- 194 1 if(!key1 && keyi1>=presstime)//长按1
- 195 1 {
- 196 2 if(tartem>mintartem)
- 197 2 {
- 198 3 tartem--;
- 199 3 eeprom_tartem=0;
- 200 3 }
- 201 2 }
- 202 1 else if(key1 && keyj1 && !pageflag)//短按1
- 203 1 {
- 204 2 if(tartem>mintartem)
- 205 2 {
- 206 3 tartem--;keyi1=0;keyj1=0;eeprom_tartem=0;
- 207 3 }
- 208 2 }
- 209 1 if(!key0 && !key1 && keyi>=presstime && keyj && keyp)//同时长按
- 210 1 {
- 211 2 page=!page;
- 212 2 swclose=0;
- 213 2 heat=0;
- 214 2 keyj=0;
- 215 2 keyi=0;
- 216 2 keyp=0;
- 217 2 pagenum=1;
- 218 2 }
- 219 1 else if(key1 && key0 && keyj && keyi<presstime && keyp)//同时短按
- 220 1 {
- 221 2 swclose=!swclose;
- 222 2 pagenum=1;
- 223 2 heat=swclose;
- 224 2 integral=0;
- 225 2 pwm=0;
- 226 2 keyj=0;
- 227 2 keyi=0;
- 228 2 }
- 229 1 if(key1 && key0)//松开
- 230 1 {
- 231 2 keyi=0;
- 232 2 keyj=0;
- 233 2 keyp=1;
- 234 2 keyi0=0;
- 235 2 keyi1=0;
- 236 2 keyj0=0;
- 237 2 keyj1=0;
- 238 2 if(eeprom_tartem==0)
- 239 2 {
- 240 3 eeptart[0]=(tartem%256);
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 5
- 241 3 eeptart[1]=(tartem/256);
- 242 3 EEPROM_SectorErase(0x0000);
- 243 3 EEPROM_write_n(0x0000,&eeptart[0],2);
- 244 3 eeptart[0]=eeptart[1]=0;
- 245 3 eeprom_tartem=1;
- 246 3 }
- 247 2 }
- 248 1 if(pageflag)
- 249 1 {
- 250 2 pageflag=0;
- 251 2 }
- 252 1 }
- 253
- 254 void page0(void)
- 255 {
- 256 1 OLED_display_clear();
- 257 1 count++;
- 258 1 count%=numofsam;
- 259 1 powvol_average[count]=get_adc(vol_channel);//读取电源ADC值
- 260 1 realtem_average[count]=transform(get_adc(tem_channel),p1,p2,p3,p4);
- 261 1 realtem=0;
- 262 1 powvol=0;
- 263 1 vcc=0;
- 264 1 for(i=0;i<numofsam;i++)
- 265 1 {
- 266 2 vcc+=(1.19*4096)/get_adc(vcc_channel);//计算参考电压
- 267 2 }
- 268 1 vcc/=numofsam;
- 269 1 for(i=0;i<numofsam;i++)
- 270 1 {
- 271 2 powvol+=20*vcc*(powvol_average[i]/4096);//计算电源电压
- 272 2 realtem+=realtem_average[i];//计算实际温度
- 273 2 }
- 274 1 powvol/=numofsam;
- 275 1 realtem/=numofsam;
- 276 1 //realtem=pidflag;
- 277 1 if(realtem>400 || realtem<0)
- 278 1 {
- 279 2 realtem=0;
- 280 2 }
- 281 1 if(pidflag){pid_p();pidflag=0;}
- 282 1 if(modesel==0){mode0();}//显示第0个模式
- 283 1 else if(modesel==1){mode1();}//显示第一个模式
- 284 1 OLED_display();
- 285 1 relkey_page0();
- 286 1 }
- 287
- 288 void relkey_page1(void)
- 289 {
- 290 1 if(!key0 && keyi0>=presstime)//长按0
- 291 1 {
- 292 2 if(pagenum>=100 && pagenum<110)
- 293 2 {
- 294 3 switch(pagenum%10)
- 295 3 {
- 296 4 case 0: if(kp<500) {kp++;eeprom_pid=0;} break;
- 297 4 case 1: if(ki<500) {ki++;eeprom_pid=0;} break;
- 298 4 case 2: if(kd<500) {kd++;eeprom_pid=0;} break;
- 299 4 }
- 300 3 }
- 301 2 else if(pagenum>=200 && pagenum<210)
- 302 2 {
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 6
- 303 3 switch(pagenum%10)
- 304 3 {
- 305 4 case 0: if(maxtartem<350) {maxtartem++;eeprom_limtem=0;} break;
- 306 4 case 1: if(mintartem<200) {mintartem++;eeprom_limtem=0;} break;
- 307 4 }
- 308 3 }
- 309 2 }
- 310 1 else if(key0 && keyj0)//短按0
- 311 1 {
- 312 2 if(pagenum<100)
- 313 2 {
- 314 3 pagenum++;
- 315 3 }
- 316 2 else if(pagenum>=100 && pagenum<110)
- 317 2 {
- 318 3 switch(pagenum%10)
- 319 3 {
- 320 4 case 0: if(kp<500) {kp++;eeprom_pid=0;} break;
- 321 4 case 1: if(ki<500) {ki++;eeprom_pid=0;} break;
- 322 4 case 2: if(kd<500) {kd++;eeprom_pid=0;} break;
- 323 4 }
- 324 3 }
- 325 2 else if(pagenum>=200 && pagenum<210)
- 326 2 {
- 327 3 switch(pagenum%10)
- 328 3 {
- 329 4 case 0: if(maxtartem<350) {maxtartem++;eeprom_limtem=0;} break;
- 330 4 case 1: if(mintartem<200) {mintartem++;eeprom_limtem=0;} break;
- 331 4 }
- 332 3 }
- 333 2 if(pagenum==page1_iconnum+1)
- 334 2 {
- 335 3 pagenum=1;
- 336 3 }
- 337 2 else if(pagenum==10+page1_PIDnum)
- 338 2 {
- 339 3 pagenum-=page1_PIDnum;
- 340 3 }
- 341 2 else if(pagenum==20+page1_TEMnum)
- 342 2 {
- 343 3 pagenum-=page1_TEMnum;
- 344 3 }
- 345 2 else if(pagenum==30+page1_MODEnum)
- 346 2 {
- 347 3 pagenum-=page1_TEMnum;
- 348 3 }
- 349 2 keyi0=0;
- 350 2 keyj0=0;
- 351 2 }
- 352 1 if(!key1 && keyi1>=presstime)//长按1
- 353 1 {
- 354 2 if(pagenum>=100 && pagenum<110)
- 355 2 {
- 356 3 switch(pagenum%10)
- 357 3 {
- 358 4 case 0: if(kp>0){kp--;eeprom_pid=0;} break;
- 359 4 case 1: if(ki>0){ki--;eeprom_pid=0;} break;
- 360 4 case 2: if(kd>0){kd--;eeprom_pid=0;} break;
- 361 4 }
- 362 3 }
- 363 2 else if(pagenum>=200 && pagenum<210)
- 364 2 {
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 7
- 365 3 switch(pagenum%10)
- 366 3 {
- 367 4 case 0: if(maxtartem>200) {maxtartem--;eeprom_limtem=0;} break;
- 368 4 case 1: if(mintartem>0) {mintartem--;eeprom_limtem=0;} break;
- 369 4 }
- 370 3 }
- 371 2 }
- 372 1 else if(key1 && keyj1)//短按1
- 373 1 {
- 374 2 if(pagenum<100)
- 375 2 {
- 376 3 pagenum--;
- 377 3 }
- 378 2 else if(pagenum>=100 && pagenum<110)
- 379 2 {
- 380 3 switch(pagenum%10)
- 381 3 {
- 382 4 case 0: if(kp>0){kp--;eeprom_pid=0;} break;
- 383 4 case 1: if(ki>0){ki--;eeprom_pid=0;} break;
- 384 4 case 2: if(kd>0){kd--;eeprom_pid=0;} break;
- 385 4 }
- 386 3 }
- 387 2 else if(pagenum>=200 && pagenum<210)
- 388 2 {
- 389 3 switch(pagenum%10)
- 390 3 {
- 391 4 case 0: if(maxtartem>200) {maxtartem--;eeprom_limtem=0;} break;
- 392 4 case 1: if(mintartem>0) {mintartem--;eeprom_limtem=0;} break;
- 393 4 }
- 394 3 }
- 395 2 if(pagenum==0)
- 396 2 {
- 397 3 pagenum=page1_iconnum;
- 398 3 }
- 399 2 else if(pagenum==9)
- 400 2 {
- 401 3 pagenum+=page1_PIDnum;
- 402 3 }
- 403 2 else if(pagenum==19)
- 404 2 {
- 405 3 pagenum+=page1_TEMnum;
- 406 3 }
- 407 2 else if(pagenum==29)
- 408 2 {
- 409 3 pagenum+=page1_TEMnum;
- 410 3 }
- 411 2 keyi1=0;
- 412 2 keyj1=0;
- 413 2 }
- 414 1 if(!key0 && !key1 && keyi>=presstime && keyj && keyp)//同时长按
- 415 1 {
- 416 2 if(pagenum<10)
- 417 2 {
- 418 3 if(tartem<mintartem)
- 419 3 {
- 420 4 tartem=mintartem;
- 421 4 }
- 422 3 else if(tartem>maxtartem)
- 423 3 {
- 424 4 tartem=maxtartem;
- 425 4 }
- 426 3 page=!page;
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 8
- 427 3 pageflag=0;
- 428 3 pagenum=0;
- 429 3 swclose=0;
- 430 3 heat=0;
- 431 3 keyj=0;
- 432 3 keyi=0;
- 433 3 keyp=0;
- 434 3 }
- 435 2 else
- 436 2 {
- 437 3 pagenum/=10;
- 438 3 keyj=0;
- 439 3 keyi=0;
- 440 3 keyp=0;
- 441 3 }
- 442 2 }
- 443 1 else if(key1 && key0 && keyj && keyi<presstime && keyp)//同时短按
- 444 1 {
- 445 2 if(pagenum==page1_iconnum)
- 446 2 {
- 447 3 if(tartem<mintartem)
- 448 3 {
- 449 4 tartem=mintartem;
- 450 4 }
- 451 3 else if(tartem>maxtartem)
- 452 3 {
- 453 4 tartem=maxtartem;
- 454 4 }
- 455 3 page=!page;
- 456 3 pageflag=0;
- 457 3 pagenum=0;
- 458 3 swclose=0;
- 459 3 heat=0;
- 460 3 keyj=0;
- 461 3 keyi=0;
- 462 3 keyp=0;
- 463 3 }
- 464 2 else if(pagenum>=100)
- 465 2 {
- 466 3 pagenum=pagenum/10+pagenum%10;
- 467 3 }
- 468 2 else if(pagenum==13 || pagenum==22)
- 469 2 {
- 470 3 pagenum/=10;
- 471 3 }
- 472 2 else if(pagenum<10)
- 473 2 {
- 474 3 pagenum=pagenum*10;
- 475 3 }
- 476 2 else if(pagenum>=30 && pagenum<40)// && pagenum%10!=page1_MODEnum-1)
- 477 2 {
- 478 3 if(pagenum%10!=page1_MODEnum-1)
- 479 3 {
- 480 4 modesel=pagenum%10;
- 481 4 eeprom_mode=0;
- 482 4 }
- 483 3 else
- 484 3 {
- 485 4 pagenum/=10;
- 486 4 }
- 487 3 }
- 488 2 else
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 9
- 489 2 {
- 490 3 pagenum=(pagenum/10)*100+pagenum%10;
- 491 3 }
- 492 2 keyj=0;
- 493 2 keyi=0;
- 494 2 }
- 495 1 if(key1 && key0)//松开
- 496 1 {
- 497 2 keyi=0;
- 498 2 keyj=0;
- 499 2 keyp=1;
- 500 2 if(eeprom_pid==0)
- 501 2 {
- 502 3 eepkp[0]=(kp%256);
- 503 3 eepkp[1]=(kp/256);
- 504 3 eepki[0]=(ki%256);
- 505 3 eepki[1]=(ki/256);
- 506 3 eepkd[0]=(kd%256);
- 507 3 eepkd[1]=(kd/256);
- 508 3 EEPROM_SectorErase(0x0200);
- 509 3 EEPROM_write_n(0x0200,&eepkp[0],2);
- 510 3 EEPROM_write_n(0x0204,&eepki[0],2);
- 511 3 EEPROM_write_n(0x0208,&eepkd[0],2);
- 512 3 eeprom_pid=1;
- 513 3 }
- 514 2 if(eeprom_limtem==0)
- 515 2 {
- 516 3 eepmaxt[0]=maxtartem%256;
- 517 3 eepmaxt[1]=maxtartem/256;
- 518 3 eepmint[0]=mintartem%256;
- 519 3 eepmint[1]=mintartem/256;
- 520 3 EEPROM_SectorErase(0x0400);
- 521 3 EEPROM_write_n(0x0400,&eepmaxt[0],2);
- 522 3 EEPROM_write_n(0x0404,&eepmint[0],2);
- 523 3 eeprom_limtem=1;
- 524 3 }
- 525 2 if(eeprom_mode==0)
- 526 2 {
- 527 3 EEPROM_SectorErase(0x0600);
- 528 3 EEPROM_write_n(0x0600,&modesel,1);
- 529 3 eeprom_mode=1;
- 530 3 }
- 531 2 }
- 532 1 if(!pageflag)
- 533 1 {
- 534 2 pageflag=1;
- 535 2 }
- 536 1 }
- 537
- 538 void page1()
- 539 {
- 540 1 OLED_display_clear();
- 541 1 relkey_page1();
- 542 1 //Draw_realnum(pagenum);
- 543 1 if(pagenum<10)//一级页面
- 544 1 {
- 545 2 OLED_DrawBMP_2(109,1,17,48,page1_arrrw);
- 546 2 OLED_DrawBMP_2(2,1,17,48,page1_arrlw);
- 547 2 OLED_DrawBMP_2(48,0,32,64,page1_icon[pagenum-1]);
- 548 2 }
- 549 1 else if(pagenum>=10 && pagenum < 20)//二级页面-PID
- 550 1 {
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 10
- 551 2 OLED_DrawBMP_2(109,1,17,48,page1_arrrw);
- 552 2 OLED_DrawBMP_2(2,1,17,48,page1_arrlw);
- 553 2 OLED_DrawBMP_2(52,0,54,32,kpid[pagenum%10]);
- 554 2 if(pagenum%10<page1_PIDnum-1)
- 555 2 {
- 556 3 OLED_DrawBMP_2(22,0,28,56,PIDopp[pagenum%10]);
- 557 3 }
- 558 2 else if(pagenum%10==page1_PIDnum-1)
- 559 2 {
- 560 3 OLED_DrawBMP_2(22,0,28,56,PID[page1_PIDnum-1]);
- 561 3 }
- 562 2 for(i=0;i<page1_PIDnum;i++)
- 563 2 {
- 564 3 if(i!=pagenum%10)
- 565 3 {
- 566 4 OLED_DrawBMP_2((72/(page1_PIDnum-1))*i+22,7,12,8,tab);
- 567 4 }
- 568 3 else
- 569 3 {
- 570 4 OLED_DrawBMP_2((72/(page1_PIDnum-1))*i+22,7,12,8,tab2);
- 571 4 }
- 572 3 }
- 573 2 }
- 574 1 else if(pagenum>=20 && pagenum < 30)//二级页面-温度
- 575 1 {
- 576 2 OLED_DrawBMP_2(109,1,17,48,page1_arrrw);
- 577 2 OLED_DrawBMP_2(2,1,17,48,page1_arrlw);
- 578 2 OLED_DrawBMP_2(52,0,54,32,templimit[pagenum%10]);
- 579 2 if(pagenum%10<page1_TEMnum-1)
- 580 2 {
- 581 3 OLED_DrawBMP_2(22,0,28,56,TEMPopp[pagenum%10]);
- 582 3 }
- 583 2 else if(pagenum%10==page1_TEMnum-1)
- 584 2 {
- 585 3 OLED_DrawBMP_2(22,0,28,56,TEMP[pagenum%10]);
- 586 3 }
- 587 2 for(i=0;i<page1_TEMnum;i++)
- 588 2 {
- 589 3 if(i!=pagenum%10)
- 590 3 {
- 591 4 OLED_DrawBMP_2((72/(page1_TEMnum-1))*i+22,7,12,8,tab);
- 592 4 }
- 593 3 else
- 594 3 {
- 595 4 OLED_DrawBMP_2((72/(page1_TEMnum-1))*i+22,7,12,8,tab2);
- 596 4 }
- 597 3 }
- 598 2 }
- 599 1 else if(pagenum>=30 && pagenum<=40)//二级页面-模式
- 600 1 {
- 601 2 OLED_DrawBMP_2(109,1,17,48,page1_arrrw);
- 602 2 OLED_DrawBMP_2(2,1,17,48,page1_arrlw);
- 603 2 OLED_DrawBMP_2(52,0,54,32,modeexp[pagenum%10]);
- 604 2 if(pagenum%10==page1_MODEnum-1)
- 605 2 {
- 606 3 OLED_DrawBMP_2(22,0,28,56,mode[pagenum%10]);
- 607 3 }
- 608 2 else if(modesel==pagenum%10)
- 609 2 {
- 610 3 OLED_DrawBMP_2(22,0,28,56,mode[pagenum%10]);
- 611 3 }
- 612 2 else
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 11
- 613 2 {
- 614 3 OLED_DrawBMP_2(22,0,28,56,modopp[pagenum%10]);
- 615 3 }
- 616 2 for(i=0;i<page1_MODEnum;i++)
- 617 2 {
- 618 3 if(i!=pagenum%10)
- 619 3 {
- 620 4 OLED_DrawBMP_2((72/(page1_MODEnum-1))*i+22,7,12,8,tab);
- 621 4 }
- 622 3 else
- 623 3 {
- 624 4 OLED_DrawBMP_2((72/(page1_MODEnum-1))*i+22,7,12,8,tab2);
- 625 4 }
- 626 3 }
- 627 2 }
- 628 1 else if(pagenum >=100 && pagenum<110)//三级页面-PID设置
- 629 1 {
- 630 2 OLED_DrawBMP_2(109,1,17,48,page1_arrrb);
- 631 2 OLED_DrawBMP_2(2,1,17,48,page1_arrlb);
- 632 2 OLED_DrawBMP_2(22,0,28,56,PID[pagenum%10]);
- 633 2 OLED_DrawBMP_2(52,0,54,32,kpid[pagenum%10]);
- 634 2 //Draw_midnum(53,4,pagenum,4);
- 635 2 switch(pagenum%10)
- 636 2 {
- 637 3 case 0: Draw_midnum(53,4,kp,4); break;
- 638 3 case 1: Draw_midnum(53,4,ki,4); break;
- 639 3 case 2: Draw_midnum(53,4,kd,4); break;
- 640 3 }
- 641 2 for(i=0;i<page1_PIDnum;i++)
- 642 2 {
- 643 3 if(i!=pagenum%10)
- 644 3 {
- 645 4 OLED_DrawBMP_2((72/(page1_PIDnum-1))*i+22,7,12,8,tab);
- 646 4 }
- 647 3 else
- 648 3 {
- 649 4 OLED_DrawBMP_2((72/(page1_PIDnum-1))*i+22,7,12,8,tab2);
- 650 4 }
- 651 3 }
- 652 2 }
- 653 1 else if(pagenum>=200 && pagenum<210)//三级页面-温度设置
- 654 1 {
- 655 2 OLED_DrawBMP_2(109,1,17,48,page1_arrrb);
- 656 2 OLED_DrawBMP_2(2,1,17,48,page1_arrlb);
- 657 2 OLED_DrawBMP_2(22,0,28,56,TEMP[pagenum%10]);
- 658 2 OLED_DrawBMP_2(52,0,54,32,templimit[pagenum%10]);
- 659 2 switch(pagenum%10)
- 660 2 {
- 661 3 case 0: Draw_midnum(53,4,maxtartem,3); break;
- 662 3 case 1: Draw_midnum(53,4,mintartem,3); break;
- 663 3 }
- 664 2 for(i=0;i<page1_TEMnum;i++)
- 665 2 {
- 666 3 if(i!=pagenum%10)
- 667 3 {
- 668 4 OLED_DrawBMP_2((72/(page1_TEMnum-1))*i+22,7,12,8,tab);
- 669 4 }
- 670 3 else
- 671 3 {
- 672 4 OLED_DrawBMP_2((72/(page1_TEMnum-1))*i+22,7,12,8,tab2);
- 673 4 }
- 674 3 }
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 12
- 675 2 }
- 676 1 OLED_display();
- 677 1 }
- 678
- 679 void mode0()
- 680 {
- 681 1 Draw_realnum(0,0,realtem);//显示测量温度
- 682 1 Draw_tarnum(48,3,tartem,1);//绘制设定温度到缓存
- 683 1 Draw_voltage(48,0,powvol);//绘制电源电压到缓存
- 684 1 if(realtem>=mintartem && realtem <= maxtartem)
- 685 1 {
- 686 2 Draw_Loading(8,6,0,((realtem-mintartem)*100)/(maxtartem-mintartem));//绘制左侧进度条
- 687 2 }
- 688 1 else if(realtem>maxtartem)
- 689 1 {
- 690 2 Draw_Loading(8,6,0,100);
- 691 2 }
- 692 1 else
- 693 1 {
- 694 2 Draw_Loading(8,6,0,0);//绘制左侧进度条
- 695 2 }
- 696 1 if(showpwm!=pwm && swclose){showpwm_opp=(pwm/10-showpwm);showpwm_opp=showpwm_opp*0.8;showpwm=pwm/10-showp
- -wm_opp;}
- 697 1 else if(!swclose){showpwm*=0.8;}
- 698 1 Draw_Loading(65,6,1,showpwm+1);//绘制右侧进度条
- 699 1 Draw_Sign(11,48,((tartem-(mintartem))*100)/((maxtartem)-(mintartem)),tartem,realtem);//绘制左侧进度条标记
- 700 1 if(swclose==0){OLED_DrawBMP_2(84, 0, 42, 48, &state[2]);}
- 701 1 else if(err>5){OLED_DrawBMP_2(84, 0, 42, 48, &state[1]);}
- 702 1 else{OLED_DrawBMP_2(84, 0, 42, 48, &state[0]);}
- 703 1 }
- 704
- 705 void mode1()
- 706 {
- 707 1 Draw_tarnum(0,0,realtem,0);//绘制设定温度到缓存
- 708 1 Draw_tarnum(0,3,tartem,0);//绘制设定温度到缓存
- 709 1 if(swclose==0){OLED_DrawBMP_2(4,6,16,16,switch_clo);}
- 710 1 else{OLED_DrawBMP_2(4,6,16,16,switch_ope);}
- 711 1 //OLED_DrawLine(26,60,128,60,1);
- 712 1 OLED_DrawBMP_2(25,0,103,64,xy);//绘制坐标轴
- 713 1 for(i=26;i<128;i++)
- 714 1 {
- 715 2 if((i+1)%4==0)
- 716 2 {
- 717 3 OLED_DrawPixel(i,60-((tartem*60)/(maxtartem-mintartem)),1);
- 718 3 }
- 719 2 }
- 720 1 if(!blinker)
- 721 1 {
- 722 2 for(i=0;i<100;i++)
- 723 2 {
- 724 3 mapline[i]=mapline[i+1];
- 725 3 }
- 726 2 blinker=1;
- 727 2 mapline[100]=realtem;
- 728 2 }
- 729 1 for(i=0;i<101;i++)
- 730 1 {
- 731 2 OLED_DrawPixel(27+i,60-((mapline[i]*60)/maxtartem),1);
- 732 2 }
- 733 1 }
- 734
- 735 void pid_p(void)
- C51 COMPILER V9.54 MAIN 09/26/2022 20:11:45 PAGE 13
- 736 {
- 737 1 err=tartem-realtem;//误差
- 738 1 if(fabs(err)<10){integral=integral+err;}
- 739 1 derivative = err-lasterr;//微分
- 740 1 if(integral>500){integral=500;}
- 741 1 if(integral<-500){integral=-500;}//避免积分值太大
- 742 1 if(kp*err>1000){err=1000/kp;}
- 743 1 if(ki*integral>1000){integral=1000/ki;}
- 744 1 if(kd*derivative>1000){integral=1000/kd;}
- 745 1 pwm=kp*err+ki*integral+kd*derivative;
- 746 1 if(pwm>1000){pwm=1000;}
- 747 1 if(pwm<0){pwm=0;}//防止溢出
- 748 1 lasterr=err;
- 749 1 }
- MODULE INFORMATION: STATIC OVERLAYABLE
- CODE SIZE = 11763 ----
- CONSTANT SIZE = 10066 ----
- XDATA SIZE = 435 43
- PDATA SIZE = ---- ----
- DATA SIZE = ---- ----
- IDATA SIZE = ---- ----
- BIT SIZE = 12 ----
- END OF MODULE INFORMATION.
- C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
|