📄 zhudanyuan.lst
字号:
250 1 {
251 2 dat = 16383;
252 2 }
253 1 else if(dat<0)
254 1 {
255 2 dat = 0;
256 2 }
257 1 dat &=0x3fff; //14 bits is vaild.
258 1 DAC_A0 = 0;
259 1 return dat; //SHG设定, DAC8164通道A
260 1 }
261 unsigned int Set_THG(uint tem) //THG 130 -160 度
262 {
263 1 unsigned int dat;
264 1 float v;
265 1 tem = 15000;
266 1 v = tem/1000.0;
267 1 dat = (uint)(16384/5*v);
268 1 if(dat>16383)
269 1 {
270 2 dat = 16383;
271 2 }
272 1 else if(dat<0)
273 1 {
274 2 dat = 0;
275 2 }
276 1 dat &=0x3fff; //14 bits is vaild.
277 1 DAC_A0 = 0;
278 1 return dat; //THG 设定, DAC8164通道B
279 1 }
280
281 void DAC8164_ISRA(unsigned int tem)
282 {
283 1 unsigned int dat;
284 1 dat = Set_SHG(tem);
285 1 dat<<=2;
286 1 dat |= DAC_cha1|0x800000;
287 1 Spi_Write(dat);
288 1 }
289 void DAC8164_ISRB(unsigned int tem)
290 {
291 1 unsigned int dat;
292 1 dat = Set_THG(tem);
293 1 dat<<=2;
294 1 dat |= DAC_cha2|0x800000;
295 1 Spi_Write(dat);
296 1 }
297 void Spi_Write(unsigned int dat)
298 {
299 1 unsigned char i;
C51 COMPILER V7.02b ZHUDANYUAN 08/29/2008 14:57:54 PAGE 6
300 1 DAC_ENAB=0;
301 1 _nop_();
302 1 DAC_SYNC=0;
303 1 DAC_SCLK = 1;
304 1 for(i=0;i<24;i++)
305 1 {
306 2 DAC_DIN = ((dat&0x800000)>0)?1:0;
307 2 DAC_SCLK = 0;DAC_SCLK = 1;
308 2 dat<<=1;
309 2 }
310 1 _nop_();
311 1 _nop_();
312 1 DAC_SYNC=1;
313 1 _nop_(); _nop_();
314 1 DAC_LDAC=1;
315 1 delay(10);
316 1 DAC_ENAB=1;
317 1 }
318
319 //***************************************数据采集******************************//
320 uint GetADCData(uchar channel)
321 {
322 1 uchar xdata dtt,dth,dtl;
323 1 uint xdata sump = 0;
324 1 uint xdata i;
325 1 MAX_CS = 0;
326 1 for(i=0; i<15; i++)
327 1 {
328 2 MAX_CON = 0;
329 2 delay(10);
330 2 MAX_CON = 0;
331 2 if(MAX_INT = 0);
332 2 {
333 3 for(i=0; i<2; i++)
334 3 {
335 4 MAX_RD = 0;
336 4 _nop_();
337 4 _nop_();
338 4 dtt = P5&0x3f;
339 4 dth = dtt;
340 4 dtl = P4;
341 4 sump+= dtl+dth*256;
342 4 MAX_RD = 1;
343 4 delay(3000);
344 4 }
345 3 }
346 2 delay(30);
347 2 }
348 1 return sump / 15;
349 1 }
350
351
352 //--------------递推平均滤波--------------------//
353 uint filter(uchar channel)
354 {
355 1 char count;
356 1 uint sum = 0;
357 1 if(channel == 0)
358 1 {
359 2 filter0_buf[array0++] = GetADCData(0);
360 2 if (array0 == N0)
361 2 array0 = 0;
C51 COMPILER V7.02b ZHUDANYUAN 08/29/2008 14:57:54 PAGE 7
362 2 for (count=0;count<N0;count++)
363 2 {
364 3 sum += filter0_buf[count];
365 3 }
366 2 return (uint)(sum/N0);
367 2 }
368 1 else if(channel == 1)
369 1 {
370 2 filter1_buf[array1++] = GetADCData(1);
371 2 if (array1 == N1) array1 = 0;
372 2 for (count=0;count<N1;count++)
373 2 {
374 3 sum += filter1_buf[count];
375 3 }
376 2 return (uint)(sum/N1);
377 2 }
378 1
379 1 }
380
381 //--------SHG与THG的温度读取----------//
382 void GetSHG( uchar channel, float current)
383 {
384 1 uint adresult;
385 1 float v,tem,logval;
386 1 float m,n,z;
387 1
388 1 adresult = filter(channel);
389 1 v = adresult*5.0/16384.0;
390 1 if(channel == 5)
391 1 {
392 2 logval = log(v/CUR_SHG);
393 2 _nop_();
394 2 _nop_();
395 2 m = 1.120332914398244e-003 ;
396 2 _nop_();
397 2 _nop_();
398 2 n = 2.354891980894096e-004*logval;
399 2 _nop_();
400 2 _nop_();
401 2 z = 8.289547029771934e-008*logval*logval*logval;
402 2 _nop_();
403 2 _nop_();
404 2 _nop_();
405 2 _nop_();;
406 2 tem = 1.0/(m + n + z) - 273.15+0.11; //实际温度
407 2 _nop_();
408 2 _nop_();
409 2 SHGAct = tem*100; //SHG实际温度
410 2 }
411 1 delay(3000);
412 1 }
413 void GetTHG( uchar channel, float current )
414 {
415 1 uint adresult;
416 1 float v,tem,res;
417 1 adresult = filter(0);
418 1 v = adresult*5.0/16384.0;
419 1 res = v/CUR_THG;
420 1 tem = 0.261643*res-261.643;
421 1 THGAct = tem*100.0; //THG实际温度
422 1
423 1 }
C51 COMPILER V7.02b ZHUDANYUAN 08/29/2008 14:57:54 PAGE 8
424
425
426
427 //UART通信
428 void Receiving()
429 {
430 1 #define PC_data (uchan xdata*) 0x0000; //定义外部数据地址
431 1 uchan xdata * point; //定义外部数据指针变量
432 1 uchan ch;
433 1 uint i;
434 1 UART0_Init();
435 1 TR1 = 1; //启动波特率发生器
436 1 RI0 = 0; //清接受中断标志
437 1 point= PC_data; //指针变量赋初值
438 1 P4= 0xf0; //CS0=0,CS1=1,选择RAM中的第0页
439 1 for (i=0;i<oxffff;i++) //接受64K个数据(超过64K另置页地址)
440 1 {
441 2 while(!RI0); //接受一个字节数据
442 2 *point=SUBF0; //存储一个字节数据到RAM中
443 2 point++; //指向下一个地址
444 2 RI0 = 0; //清接受中断标志
-
445 2 }
446 1 TR1=0; //停止波特率发生器
447 1 P4= 0xff;
448 1 erase_flash(); //擦除FLASH芯片
449 1 point= PC_data; //指针变量赋初值
450 1 for (i=0;i<oxffff;i++) //写64K字节数据到FLASH中
451 1 {
452 2 P4= 0xf0; //选择RAM中第0页
453 2 ch= *point; //读RAM
454 2 P4= 0x8e; //选择FLASH中第0页
455 2 XBYTE[0X5555]= 0xaa; //写一个字节的命令
456 2 XBYTE[0X2aaa]= 0x55; //写一个字节的命令
457 2 XBYTE[0X5555]= 0xa0; //写一个字节的命令
458 2 *point= ch; //写一个字节到FLASH中
459 2 delay(500);
460 2 point++; //指针变量指向下一个地址
461 2 }
462 1 P4= 0xff; //CS0=0,CS1=1,重置页地址
463 1 }
464
465
466 void Send_data(void)
467 {
468 1 uint i;
469 1 P4= 0xf0;
470 1 SCON1= 0x40;
471 1 TR1 = 1;
472 1 point= PC_data;
473 1 P4= 0xf0;
474 1 for (;point<ffff;)
475 1 { for (i=0;i<10;i++)
476 2 {
477 3 SUBF1= *point;
478 3 while((SCON1&0x02)==0);
479 3 SCON1= 0x40;
480 3 point++;
481 3 }
482 2 }
483 1 }
484
C51 COMPILER V7.02b ZHUDANYUAN 08/29/2008 14:57:54 PAGE 9
485 //--------------------延时指令定义//-----------------//
486 void delay(uint i)
487 {
488 1 while (i--) ;
489 1 }
490
491
492 void long_delay(void)
493 {
494 1 uchar i;
495 1 for( i = 0; i <250; i++)
496 1 {
497 2 _nop_();
498 2 _nop_();
499 2 }
500 1 }
501
502
503 void short_delay(void)
504 {
505 1 uchar i;
506 1 for( i = 0; i <100; i++);
507 1 }
C51 COMPILATION COMPLETE. 0 WARNING(S), 4 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -