main.lst 29 KB

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