📄 aaa.lst
字号:
297
298
299
300
301 /**********延时子程序*************/
302 void mdelay(uchar j)
C51 COMPILER V7.50 AAA 09/12/2005 06:33:21 PAGE 6
303 {uint i;
304 1 for(;j>0;j--)
305 1 { for(i=0;i<200;i++)
306 2 {;}
307 2 }
308 1 }
309
310 /**********判忙子程序*************/
311 void lcdbusytest()
312 {
313 1 PSD33_reg.DATAOUT_A = 0xff;
314 1 // lcdport=0xff;
315 1 RS=0;
316 1 RW=1;
317 1 E=1;
318 1 PSD33_reg.DIRECTION_A =0; //PB为输入模式
319 1 do{temp=PSD33_reg.DATAIN_A;} while(busy);
320 1 //do{temp=lcdport;}while(busy);
321 1 E=0;
322 1 PSD33_reg.DIRECTION_A =0xff;
323 1 }
324
325
326 /*********写命令******************/
327 void writelcdcom(uchar com)
328 {
329 1 lcdbusytest();
330 1 RS=0;
331 1 RW=0;
332 1 E=1;
333 1 PSD33_reg.DATAOUT_A = com;
334 1 //lcdport=com;
335 1 E=0;
336 1 }
337
338 /**********写数据****************/
339 void writelcddat(uchar dat)
340 {
341 1 lcdbusytest();
342 1 RS=1;
343 1 RW=0;
344 1 E=1;
345 1 PSD33_reg.DATAOUT_A = dat;
346 1 //lcdport=dat;
347 1 E=0;
348 1 }
349
350 /***********LCD清屏****************/
351 void clrlcd()
352 {writelcdcom(0x01);}
353
354 /***********LCD初始化**************/
355 void init_lcd()
356 { mdelay(15);
357 1 RS=0;
358 1 RW=0;
359 1 E=1;
360 1 PSD33_reg.DATAOUT_A = 0x38;
361 1 // lcdport=0x38;
362 1 E=0;
363 1 mdelay(5);
364 1 RS=0;
C51 COMPILER V7.50 AAA 09/12/2005 06:33:21 PAGE 7
365 1 RW=0;
366 1 E=1;
367 1 PSD33_reg.DATAOUT_A = 0x38;
368 1 //lcdport=0x38;
369 1 E=0;
370 1 mdelay(5);
371 1 RS=0;
372 1 RW=0;
373 1 E=1;
374 1 PSD33_reg.DATAOUT_A = 0x38;
375 1 // lcdport=0x38;
376 1 E=0;
377 1 writelcdcom(0x38);
378 1 writelcdcom(0x08);
379 1 clrlcd();
380 1 writelcdcom(0x06);
381 1 writelcdcom(0x0c);
382 1 }
383
384 /*********写一个字符****************/
385 void printchar(uchar xpos,uchar ypos,uchar str)
386 {uchar m=0;
387 1 switch (ypos)
388 1 { case 0: xpos|=0x80;break;
389 2 case 1: xpos|=0xc0;break;
390 2 default: break;
391 2 }
392 1 writelcdcom(xpos);
393 1 writelcddat(str);
394 1 }
395
396 /*********写字符串函数*************/
397 void printstr(uchar xpos,uchar ypos,uchar *str)
398 {
399 1 //uchar n;
400 1 uchar m=0;
401 1 switch (ypos)
402 1 { case 0: xpos|=0x80;break; //写入显示地址要求D7恒为高电平
403 2 case 1: xpos|=0xc0;break;
404 2 default: break;
405 2 }
406 1 writelcdcom(xpos); //此处的Xpos已转换为LCM的显示寄存器实际地址
407 1 for(i=0;i<strlen(str);i++)
408 1 {
409 2 writelcddat(str[m++]);
410 2 }
411 1
412 1 }
413
414
415 /*****************************************************************************
416 * ADC_EnableAll()
417 *功能:ADC使能,设置P1口通道为ADC输入,选择ADC时钟频率
418 *参数:无
419 ******************************************************************************/
420 void ADC_EnableAll(void)
421 {
422 1 ACON = 0; // 关闭ADC
423 1
424 1
425 1 ADCPS =(0x08 + 1); //使能ADC时钟,设置时钟频率
426 1 _nop_();
C51 COMPILER V7.50 AAA 09/12/2005 06:33:21 PAGE 8
427 1 _nop_();
428 1 P1SFS0 |= 0x07;
429 1 P1SFS1 |= 0x07; // 选择P1口相应位为ADC输入
430 1
431 1
432 1 ACON = 0x20;
433 1 // 使能ADC;Enable ADC
434 1
435 1 // NOTE: USER CODE MUST WAIT AT LEAST 20 MS before calling ADC_Read (Using the ADC)
436 1 }
437
438
439
440 /******************************************************************************
441 * ADC_Init(channel)
442 *功能描述:ADC初始化,选择模拟通道输入,初始化时钟,关闭ADC中断
443 *参 数:channel - uchar 选择ADC通道
444 *注 意:当ADC通道改变得时候,此子程序一定要被调用
445 *****************************************************************************/
446 void ADC_Init (unsigned char channel)
447 {
448 1 unsigned char temp;
449 1 ACON = 0;
450 1
451 1 temp = (0x01) << channel; // 选择通道
452 1 P1SFS0 |= temp;
453 1 P1SFS1 |= temp; // 设置P1口相应位为ADC输入
454 1
455 1 ADCPS =(0x08 + 1); // 使能ADC时钟,设置时钟频率
456 1 _nop_();
457 1 ACON = 0x20; // 允许ADC转换
458 1
459 1
460 1 // NOTE: USER CODE MUST WAIT AT LEAST 20 MS before calling ADC_Read (Using the ADC)
461 1 }
462
463 /******************************************************************************
464 * uint ADC_Read(channel)
465 *功能描述:读A/D转换后的数据
466 *参 数:channel,初始化程序中选择的通道
467 *返 回 值:ADC转换结果,12位
468 *注 意:该子程序调用前,ADC_Init()必须先被调用
469 *******************************************************************************/
470 unsigned int ADC_Read( unsigned char channel )
471 {
472 1 unsigned int temp_ADC_result;
473 1 ACON &= 0xE0; //清除输入通路 ~(00101110B) = (11010001B)
474 1
475 1 ACON |= (channel<<2); //选择通路
476 1 _nop_ ();
477 1 _nop_ ();
478 1
479 1 ACON |= 0x02; //开始ADC转换
480 1 _nop_ (); //延时一个机器周期: ADST: 1->0
481 1
482 1 while( (ACON & 0x01) != 1 ); //等待转换结束
483 1
484 1 // Note: For increased ADC accuracy, the while loop above should be
485 1 // replaced with code that puts the MCU into Idle mode via PCON
486 1 // and makes use of the ADC interrupt to exit the Idle mode.
487 1 // The user would need to enable the ADC int and define the ADC ISR.
488 1
C51 COMPILER V7.50 AAA 09/12/2005 06:33:21 PAGE 9
489 1 temp_ADC_result = (ADAT1<<8)+ADAT0; //Calculate ADC conversion result
490 1
491 1 return (temp_ADC_result);
492 1 }
493
494
495 /*******************************************************************************
496 * int sin_angle(long angle )
497 *功能描述:角度换算函数,使角度值控制在180以内
498 *
499 ********************************************************************************/
500
501 int sin_angle(long angle )
502 {
503 1 int Mod_data;
504 1
505 1 Mod_data = (int)angle/180;
506 1 switch (Mod_data )
507 1 {
508 2 case 0:
509 2 M_angle = sin_table[angle];
510 2 break;
511 2 case 1:
512 2 M_angle = -sin_table[angle - 180];
513 2 break;
514 2 case 2:
515 2 M_angle = sin_table[angle - 360];
516 2 break;
517 2 case 3:
518 2 M_angle = -sin_table[angle - 540];
519 2 break;
520 2 }
521 1
522 1 return(M_angle);
523 1 }
524
525 /*******************************************************************************
526 * void first(void )
527 *第一个采样点计算函数,在K=0时计算
528 *******************************************************************************/
529 void first(void )
530 {
531 1
532 1 U_angle = K*180/N; //U相在K=0时计算
533 1 V_angle = U_angle + 120;
534 1 W_angle = U_angle + 240;
535 1
536 1
537 1 U_Toff = ((Half_Ts * (0xffff - M*(sin_angle(U_angle))))>>16);
538 1 V_Toff = ((Half_Ts * (0xffff - M*(sin_angle(V_angle))))>>16);
539 1 W_Toff = ((Half_Ts * (0xffff - M*(sin_angle(W_angle))))>>16);
540 1
541 1
542 1
543 1 P_flag = 0;
544 1
545 1 }
546
547 /*------------------------------------------------------------------------------
548 timer0_isr()
549
550 This function is an interrupt service routine for TIMER 0. It should never
C51 COMPILER V7.50 AAA 09/12/2005 06:33:21 PAGE 10
551 be called by a C or assembly function. It will be executed automatically
552 when TIMER 0 overflows.
553
554 This ISR stops timer0, adjusts the counter so that another interrupt occurs in
555 10ms, and then restarts the timer.
556 ------------------------------------------------------------------------------*/
557
558 //定时器0中断服务程序
559 //定时器0用于产生采样周期的定时中断,采样周期Ts =1/2载波周期 = 278 时钟周期
560 static void timer0_isr (void) interrupt TF0_VECTOR using 1
561 {
562 1 TR0 = 0; /* stop timer 0 */
563 1 TL0 = (timer0_value & 0x00FF);
564 1 TH0 = (timer0_value >> 8);
565 1 TR0 = 1; /* start timer 0 */
566 1
567 1
568 1 ////////////////////////////////////////////
569 1 ////将上一次定时器中断计算的延时值送入TCM0,TCM1,TCM2的比较寄存器
570 1 //
571 1 //
572 1 ////取当前PCA0的计数值
573 1 PCA0 = PCACL0 + (PCACH0 << 8 );
574 1 //
575 1 ////实际延时时间应加上PCA0的当前计数值
576 1 //
577 1 U_Toff += PCA0;
578 1 V_Toff += PCA0;
579 1 W_Toff += PCA0;
580 1 U_Ton += PCA0;
581 1 V_Ton += PCA0;
582 1 W_Ton += PCA0;
583 1 //
584 1 //
585 1 ////偶数顶点采样使用Toff,奇数底点采样使用Ton
586 1 if ( P_flag==0)
587 1 {
588 2 CAPCOML0 = (U_Toff & 0x00FF);
589 2 CAPCOMH0 = (U_Toff >> 8);
590 2
591 2 CAPCOML1 = (V_Toff & 0x00FF);
592 2 CAPCOMH1 = (V_Toff >> 8);
593 2
594 2 CAPCOML2 = (W_Toff & 0x00FF);
595 2 CAPCOMH2 = (W_Toff >> 8);
596 2 }
597 1 else
598 1 {
599 2 CAPCOML0 = (U_Ton & 0x00FF);
600 2 CAPCOMH0 = (U_Ton >> 8);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -