#include <p33FJ128MC506A.h>
#include "dac.h"
#include "delay.h"
/* -------------------------------------------------------- */
/* Macros for setting device configuration registers */
/* -------------------------------------------------------- */
_FOSCSEL(FNOSC_FRCPLL); //内部快速RC振荡 & PLL
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_NONE); //时钟开关使能,时钟监视器禁止,时钟输出为数字输出,标准振荡模式
/* Clock Switching Enabled and Fail Safe Clock Monitor is disable
Primary Oscillator Mode: XT Crystal */
_FBS(BSS_NO_FLASH & BWRP_WRPROTECT_OFF); //无BOOT代码段,BOOT段写保护关
_FWDT(FWDTEN_OFF); //WDT 关
_FGS(GSS_HIGH & GCP_ON & GWRP_ON); //代码保护高级及标准代码保护开,写保护开启,
_FPOR(PWMPIN_ON & HPOL_ON & LPOL_ON & FPWRT_PWR128); //PWM 模式为 端口寄存器模式,PWM 上桥为低电平有效模式,下桥为低电平有效模式;上电复位时间为128毫秒
_FICD(ICS_PGD2 & JTAGEN_OFF); //使用 PGC3/PGD3 作为编程和调试用 ,JTAG 关闭
unsigned char time_IF=0;
unsigned int delay_data;
const unsigned int sindata[360]={
688 ,
694 ,
700 ,
705 ,
711 ,
717 ,
723 ,
729 ,
735 ,
741 ,
747 ,
753 ,
758 ,
764 ,
770 ,
776 ,
781 ,
787 ,
793 ,
798 ,
804 ,
810 ,
815 ,
820 ,
826 ,
831 ,
837 ,
842 ,
847 ,
852 ,
857 ,
863 ,
868 ,
873 ,
877 ,
882 ,
887 ,
892 ,
896 ,
901 ,
906 ,
910 ,
914 ,
919 ,
923 ,
927 ,
931 ,
935 ,
939 ,
943 ,
947 ,
951 ,
954 ,
958 ,
961 ,
965 ,
968 ,
971 ,
974 ,
977 ,
980 ,
983 ,
986 ,
988 ,
991 ,
993 ,
996 ,
998 ,
1000 ,
1002 ,
1004 ,
1006 ,
1008 ,
1010 ,
1011 ,
1013 ,
1014 ,
1016 ,
1017 ,
1018 ,
1019 ,
1020 ,
1020 ,
1021 ,
1022 ,
1022 ,
1023 ,
1023 ,
1023 ,
1023 ,
1023 ,
1023 ,
1023 ,
1022 ,
1022 ,
1021 ,
1020 ,
1020 ,
1019 ,
1018 ,
1017 ,
1016 ,
1014 ,
1013 ,
1011 ,
1010 ,
1008 ,
1006 ,
1004 ,
1002 ,
1000 ,
998 ,
996 ,
993 ,
991 ,
988 ,
986 ,
983 ,
980 ,
977 ,
974 ,
971 ,
968 ,
965 ,
961 ,
958 ,
954 ,
951 ,
947 ,
943 ,
939 ,
935 ,
931 ,
927 ,
923 ,
919 ,
914 ,
910 ,
906 ,
901 ,
896 ,
892 ,
887 ,
882 ,
877 ,
873 ,
868 ,
863 ,
857 ,
852 ,
847 ,
842 ,
837 ,
831 ,
826 ,
820 ,
815 ,
810 ,
804 ,
798 ,
793 ,
787 ,
781 ,
776 ,
770 ,
764 ,
758 ,
753 ,
747 ,
741 ,
735 ,
729 ,
723 ,
717 ,
711 ,
705 ,
700 ,
694 ,
688 ,
682 ,
676 ,
670 ,
664 ,
658 ,
652 ,
646 ,
640 ,
634 ,
628 ,
622 ,
617 ,
611 ,
605 ,
599 ,
593 ,
588 ,
582 ,
576 ,
571 ,
565 ,
559 ,
554 ,
548 ,
543 ,
537 ,
532 ,
527 ,
521 ,
516 ,
511 ,
506 ,
501 ,
496 ,
491 ,
486 ,
481 ,
476 ,
472 ,
467 ,
462 ,
458 ,
453 ,
449 ,
445 ,
440 ,
436 ,
432 ,
428 ,
424 ,
420 ,
416 ,
413 ,
409 ,
406 ,
402 ,
399 ,
395 ,
392 ,
389 ,
386 ,
383 ,
380 ,
378 ,
375 ,
372 ,
370 ,
367 ,
365 ,
363 ,
361 ,
359 ,
357 ,
355 ,
354 ,
352 ,
350 ,
349 ,
348 ,
347 ,
346 ,
345 ,
344 ,
343 ,
342 ,
342 ,
341 ,
341 ,
341 ,
340 ,
340 ,
340 ,
341 ,
341 ,
341 ,
342 ,
342 ,
343 ,
344 ,
345 ,
346 ,
347 ,
348 ,
349 ,
350 ,
352 ,
354 ,
355 ,
357 ,
359 ,
361 ,
363 ,
365 ,
367 ,
370 ,
372 ,
375 ,
378 ,
380 ,
383 ,
386 ,
389 ,
392 ,
395 ,
399 ,
402 ,
406 ,
409 ,
413 ,
416 ,
420 ,
424 ,
428 ,
432 ,
436 ,
440 ,
445 ,
449 ,
453 ,
458 ,
462 ,
467 ,
472 ,
476 ,
481 ,
486 ,
491 ,
496 ,
501 ,
506 ,
511 ,
516 ,
521 ,
527 ,
532 ,
537 ,
543 ,
548 ,
554 ,
559 ,
565 ,
571 ,
576 ,
582 ,
588 ,
593 ,
599 ,
605 ,
611 ,
617 ,
622 ,
628 ,
634 ,
640 ,
646 ,
652 ,
658 ,
664 ,
670 ,
676 ,
682
};
const unsigned int sindata2[360]={
443 ,
445 ,
447 ,
449 ,
451 ,
453 ,
455 ,
457 ,
459 ,
461 ,
463 ,
465 ,
467 ,
469 ,
471 ,
473 ,
475 ,
477 ,
479 ,
481 ,
483 ,
485 ,
487 ,
489 ,
490 ,
492 ,
494 ,
496 ,
498 ,
499 ,
501 ,
503 ,
505 ,
506 ,
508 ,
510 ,
511 ,
513 ,
514 ,
516 ,
518 ,
519 ,
521 ,
522 ,
523 ,
525 ,
526 ,
528 ,
529 ,
530 ,
532 ,
533 ,
534 ,
535 ,
536 ,
538 ,
539 ,
540 ,
541 ,
542 ,
543 ,
544 ,
545 ,
546 ,
547 ,
547 ,
548 ,
549 ,
550 ,
550 ,
551 ,
552 ,
552 ,
553 ,
554 ,
554 ,
555 ,
555 ,
555 ,
556 ,
556 ,
556 ,
557 ,
557 ,
557 ,
557 ,
557 ,
557 ,
557 ,
557 ,
557 ,
557 ,
557 ,
557 ,
557 ,
557 ,
557 ,
556 ,
556 ,
556 ,
555 ,
555 ,
555 ,
554 ,
554 ,
553 ,
552 ,
552 ,
551 ,
550 ,
550 ,
549 ,
548 ,
547 ,
547 ,
546 ,
545 ,
544 ,
543 ,
542 ,
541 ,
540 ,
539 ,
538 ,
536 ,
535 ,
534 ,
533 ,
532 ,
530 ,
529 ,
528 ,
526 ,
525 ,
523 ,
522 ,
521 ,
519 ,
518 ,
516 ,
514 ,
513 ,
511 ,
510 ,
508 ,
506 ,
505 ,
503 ,
501 ,
499 ,
498 ,
496 ,
494 ,
492 ,
490 ,
489 ,
487 ,
485 ,
483 ,
481 ,
479 ,
477 ,
475 ,
473 ,
471 ,
469 ,
467 ,
465 ,
463 ,
461 ,
459 ,
457 ,
455 ,
453 ,
451 ,
449 ,
447 ,
445 ,
443 ,
441 ,
439 ,
437 ,
435 ,
433 ,
431 ,
429 ,
427 ,
425 ,
423 ,
421 ,
419 ,
417 ,
415 ,
413 ,
411 ,
409 ,
407 ,
405 ,
403 ,
401 ,
400 ,
398 ,
396 ,
394 ,
392 ,
390 ,
388 ,
387 ,
385 ,
383 ,
381 ,
380 ,
378 ,
376 ,
375 ,
373 ,
371 ,
370 ,
368 ,
367 ,
365 ,
363 ,
362 ,
360 ,
359 ,
358 ,
356 ,
355 ,
354 ,
352 ,
351 ,
350 ,
348 ,
347 ,
346 ,
345 ,
344 ,
343 ,
342 ,
341 ,
340 ,
339 ,
338 ,
337 ,
336 ,
335 ,
334 ,
333 ,
333 ,
332 ,
331 ,
331 ,
330 ,
330 ,
329 ,
328 ,
328 ,
328 ,
327 ,
327 ,
326 ,
326 ,
326 ,
326 ,
325 ,
325 ,
325 ,
325 ,
325 ,
325 ,
325 ,
325 ,
325 ,
325 ,
325 ,
326 ,
326 ,
326 ,
326 ,
327 ,
327 ,
328 ,
328 ,
328 ,
329 ,
330 ,
330 ,
331 ,
331 ,
332 ,
333 ,
333 ,
334 ,
335 ,
336 ,
337 ,
338 ,
339 ,
340 ,
341 ,
342 ,
343 ,
344 ,
345 ,
346 ,
347 ,
348 ,
350 ,
351 ,
352 ,
354 ,
355 ,
356 ,
358 ,
359 ,
360 ,
362 ,
363 ,
365 ,
367 ,
368 ,
370 ,
371 ,
373 ,
375 ,
376 ,
378 ,
380 ,
381 ,
383 ,
385 ,
387 ,
388 ,
390 ,
392 ,
394 ,
396 ,
398 ,
400 ,
401 ,
403 ,
405 ,
407 ,
409 ,
411 ,
413 ,
415 ,
417 ,
419 ,
421 ,
423 ,
425 ,
427 ,
429 ,
431 ,
433 ,
435 ,
437 ,
439 ,
441
};
void PortInit()
{
LATB = 0x0000; // B端口清零
TRISB = 0x0000; // B端口设为输入, 0: out, 1: in
PORTB = 0x0000;
}
void Timer1Init(void)
{
T1CON = 0; // 确保T1关闭,再进行初始化
IFS0bits.T1IF = 0; // 清T1复位标志,使T1复位
IPC0bits.T1IP = 5; // 3个BIT,设置T1的中断优先级,0~7,7是做高优先级
IEC0bits.T1IE = 1; // 开T1中断
T1CONbits.TCKPS = 1; // 设置T1的预分频比是8,即T1加一次需要的时间为1/(32M/8)秒,即0.25uS
// 2个bit,00--1:1,01--1:8,10--1:64,11--1:256
PR1 = 4000; // 根据计算应该是从0开始计数,加到PR1时产生中断,跟以往的MCU溢出中断不同
// 这个寄存器的值计算结果为,400~40000分别对应10KHz到100Hz
T1CONbits.TON = 1; // 打开T1并开始计数
}
void Timer2Init(void)
{
T2CON = 0; // 确保T1关闭,再进行初始化
IFS0bits.T2IF = 0; // 清T1复位标志,使T1复位
IPC1bits.T2IP = 5; // 3个BIT,设置T1的中断优先级,0~7,7是做高优先级
IEC0bits.T2IE = 1; // 开T1中断
T2CONbits.TCKPS = 1; // 设置T1的预分频比是8,即T1加一次需要的时间为1/(32M/8)秒,即0.25uS
// 2个bit,00--1:1,01--1:8,10--1:64,11--1:256
T2CONbits.TSIDL = 0;
PR2 = 4000; // 根据计算应该是从0开始计数,加到PR1时产生中断,跟以往的MCU溢出中断不同
// 这个寄存器的值计算结果为,400~40000分别对应10KHz到100Hz
T2CONbits.TON = 1; // 打开T1并开始计数
}
void Timer3Init(void)
{
T3CON = 0; // 确保T1关闭,再进行初始化
IFS0bits.T3IF = 0; // 清T1复位标志,使T1复位
IPC2bits.T3IP = 5; // 3个BIT,设置T1的中断优先级,0~7,7是做高优先级
IEC0bits.T3IE = 1; // 开T1中断
T3CONbits.TCKPS = 1; // 设置T1的预分频比是8,即T1加一次需要的时间为1/(32M/8)秒,即0.25uS
// 2个bit,00--1:1,01--1:8,10--1:64,11--1:256
T3CONbits.TSIDL = 0;
PR3 = 4000; // 根据计算应该是从0开始计数,加到PR1时产生中断,跟以往的MCU溢出中断不同
// 这个寄存器的值计算结果为,400~40000分别对应10KHz到100Hz
T3CONbits.TON = 1; // 打开T1并开始计数
}
void Timer4Init(void)
{
T4CON = 0; // 确保T1关闭,再进行初始化
IFS1bits.T4IF = 0; // 清T1复位标志,使T1复位
IPC6bits.T4IP = 5; // 3个BIT,设置T1的中断优先级,0~7,7是做高优先级
IEC1bits.T4IE = 1; // 开T1中断
T4CONbits.TCKPS = 1; // 设置T1的预分频比是8,即T1加一次需要的时间为1/(32M/8)秒,即0.25uS
// 2个bit,00--1:1,01--1:8,10--1:64,11--1:256
T4CONbits.TSIDL = 0;
PR4 = 4000; // 根据计算应该是从0开始计数,加到PR1时产生中断,跟以往的MCU溢出中断不同
// 这个寄存器的值计算结果为,400~40000分别对应10KHz到100Hz
T4CONbits.TON = 1; // 打开T1并开始计数
}
void Timer5Init(void)
{
T5CON = 0; // 确保T1关闭,再进行初始化
IFS1bits.T5IF = 0; // 清T1复位标志,使T1复位
IPC7bits.T5IP = 5; // 3个BIT,设置T1的中断优先级,0~7,7是做高优先级
IEC1bits.T5IE = 1; // 开T1中断
T5CONbits.TCKPS = 1; // 设置T1的预分频比是8,即T1加一次需要的时间为1/(32M/8)秒,即0.25uS
// 2个bit,00--1:1,01--1:8,10--1:64,11--1:256
T5CONbits.TSIDL = 0;
PR5 = 4000; // 根据计算应该是从0开始计数,加到PR1时产生中断,跟以往的MCU溢出中断不同
// 这个寄存器的值计算结果为,400~40000分别对应10KHz到100Hz
T5CONbits.TON = 1; // 打开T1并开始计数
}
int main(void)
{
// 设置振荡方式及倍频, PLL 反馈倍频比寄存器
PLLFBD = 41; // dPLL derived in UserParms.h PLL反馈倍频比 Fosc = Fin*(M/(N1*N2))
CLKDIVbits.PLLPOST = 0; // N2=2 后分频比为2
CLKDIVbits.PLLPRE = 0; // N1=2 预分频比为2
__builtin_write_OSCCONH(0x01); // 设置带PLL的内部FRC振荡器。
__builtin_write_OSCCONL(0x01); // 请求切换到所要求的振荡器
while (OSCCONbits.COSC != 0b01); // 是否写入带PLL的内部振荡器,PLL
/
PortInit();
Timer1Init();
Timer2Init();
Timer3Init();
Timer4Init();
Timer5Init();
while(1)
{
// DAC_init(sindata2[i]); //delay(0)时正弦周期为40us
}
}
//====================定时中断服务程序======================
void __attribute__((__interrupt__,no_auto_psv)) _T1Interrupt(void)
{
// PR1=40320/Ftimer1; //计算定时器的溢出值
IFS0bits.T1IF = 0; //在软件里清中断标志
}
void __attribute__((__interrupt__,no_auto_psv)) _T2Interrupt(void)
{
// PR1=40320/Ftimer1; //计算定时器的溢出值
IFS0bits.T2IF = 0; //在软件里清中断标志
}
void __attribute__((__interrupt__,no_auto_psv)) _T3Interrupt(void)
{
// PR1=40320/Ftimer1; //计算定时器的溢出值
IFS0bits.T3IF = 0; //在软件里清中断标志
}
void __attribute__((__interrupt__,no_auto_psv)) _T4Interrupt(void)
{
// PR1=40320/Ftimer1; //计算定时器的溢出值
IFS1bits.T4IF = 0; //在软件里清中断标志
}
void __attribute__((__interrupt__,no_auto_psv)) _T5Interrupt(void)
{
// PR1=40320/Ftimer1; //计算定时器的溢出值
IFS1bits.T5IF = 0; //在软件里清中断标志
}
版权声明:本文为Augusdi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。