📄 wendu.lst
字号:
175 1 clear();
176 1 }
177
178 void myint1(void) interrupt 2 // 外中断1,读AD转换结果
179 {
C51 COMPILER V7.09 WENDU 08/02/2005 14:26:27 PAGE 4
180 1 ADVALUE = AD0809;
181 1 ADMARK = 0x01;
182 1 }
183
184 void myint2(void) interrupt 1 // 定时器0,启动AD转换
185 {
186 1 TH0 = 0xD8;
187 1 TL0 = 0xEF;
188 1 ET0 = 1;
189 1 AD0809 = 1;
190 1 if (TC < TS)
191 1 TC++;
192 1 else
193 1 {
194 2 TKMARK = 0x01;
195 2 TC = 0x00;
196 2 }
197 1
198 1 if (FPWM == 0x01) //产生PWM
199 1 {
200 2 if (VAA != 0x00)
201 2 {
202 3 VAA = VAA - 1;
203 3 P17 = 0; // P10输出为低, 加热
204 3 }
205 2 else
206 2 {
207 3 FPWM = 0x02;
208 3 VBB = BBB / 2;
209 3 }
210 2 }
211 1 if (FPWM == 0x02)
212 1 {
213 2 if (VBB != 0x00)
214 2 {
215 3 VBB = VBB - 1;
216 3 P17 = 1; // P10输出为高, 停止加热
217 3 }
218 2 else
219 2 {
220 3 FPWM = 0x01;
221 3 VAA = AAAA / 2;
222 3 }
223 2 }
224 1 return;
225 1 }
226
227 void pid(void)
228 {
229 1 int K,P,I,D;
230 1
231 1 K=P=I=D=0;
232 1 EK=SPEC-YK; //得到偏差
233 1 BEK=EK-EK_1-AEK; //△2EK
234 1 AEK=EK-EK_1; //△EK 偏差变化量
235 1
236 1 if (abs(EK)>abs(IBAND)) I=0; //判积分分离
237 1 else I=(EK*TS)/KI; //计算积分项
238 1
239 1 P=AEK;
240 1 D=((KD/TS)*BEK)/10000; //计算微分项
241 1
C51 COMPILER V7.09 WENDU 08/02/2005 14:26:27 PAGE 5
242 1 //△UK=KP*△EK + KI*Ek + KD*(△EK-△EK_1) UK=△UK+UK_1
243 1 K=madd(I,P);
244 1 K=madd(D,K);
245 1 K=mmul(K,KP);
246 1 K=K/10;
247 1 CK=K+CK_1;
248 1
249 1 //将UK值转化成8位数据,取K的低8位值并取符号
250 1 CK=change16_8(CK);
251 1 CK_1=CK;
252 1 EK_1=EK;
253 1 CK=CK+X;
254 1 }
255
256 int mmul( int x,int y)
257 {
258 1 int t,z;
259 1 long s;
260 1 s=x*y;
261 1 z=(int)(s&0x0FFFF);
262 1 t=(int)((s>>16)&0x0FFFF);
263 1 s=change32_16(z,t);
264 1 return(s);
265 1 }
266
267 int change32_16(int z,int t) //t=高字,z=低字
268 {
269 1 int s;
270 1
271 1 if(t==0)
272 1 {
273 2 if((z&0x8000)==0) s=z;
274 2 else s=0x7fff;
275 2 }
276 1 else if ((t&0xffff)==0xffff)
277 1 {
278 2 if((z&0x8000)==0) s=0x8000;
279 2 else s=z;
280 2 }
281 1 else if ((t&0x8000)==0) s=0x7fff;
282 1 else s=0x8000;
283 1 return(s);
284 1 }
285
286 int madd(int x,int y)
287 {
288 1 int t;
289 1 t=x+y;
290 1 if(x>=0 && y>=0) //同号相乘,符号位变反说明溢出
291 1 { if((t&0x8000)!=0) t=0x7fff; }
292 1 else if (x<=0 && y<=0)
293 1 { if((t&0x8000)==0) t=0x8000; }
294 1 return(t);
295 1 }
296
297 char change16_8(int wd) //t=高字节,z=低字节
298 {
299 1 char z,t,s;
300 1
301 1 z=wd&0x0FF;
302 1 t=(wd>>8)&0x0FF;
303 1
C51 COMPILER V7.09 WENDU 08/02/2005 14:26:27 PAGE 6
304 1 if(t==0x00)
305 1 {
306 2 if((z&0x80)==0) s=z;
307 2 else s=0x7f;
308 2 }
309 1 else if ((t&0xff)==0xff)
310 1 {
311 2 if((z&0x80)==0) s=0x80;
312 2 else s=z;
313 2 }
314 1 else if((t&0x80)==0) s=0x7f;
315 1 else s=0x80;
316 1
317 1 return(s);
318 1 }
319
320
321 void Display() //数码管显示函数
322 {
323 1 unsigned char i, j = 0xF7;
324 1 b[3] = SPEC/10;
325 1 b[2] = SPEC%10;
326 1 b[1] = DIS/10;
327 1 b[0] = DIS%10;
328 1 for(i=0; i<4; i++)
329 1 {
330 2 C8255_A = j;
331 2 C8255_B = Led[b[i]];
332 2 delay(0x55);
333 2 j >>= 1;
334 2 }
335 1 }
336
337 void clear()
338 {
339 1 C8255_B = 0x00;
340 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1079 ----
CONSTANT SIZE = 256 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 55 12
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -