分享

PIC单片机

 共同成长888 2020-05-28

 一、编写程序,使用RC2的PWM功能生成频率250Hz的正弦波

  1. #include <htc.h>
  2. #define uint8 unsigned char
  3. #define uint16 unsigned int
  4. __CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位
  5. //WDTE_OFF:disable watchdog timer 看门狗禁止
  6. //LVP_OFF:low voltage programming disabled 低电压编程禁止
  7. //FOSC_HS:high speed crystal/resonator 4M以上晶振选择HS高速
  8. //PWRTDIS:disable power up timer
  9. //BOREN_OFF:disable brown out reset
  10. uint8 gDutycount = 0;
  11. const char SINETABLE[40] = {50, 55, 60, 65, 70, 75, 80, 85, 90, 95,
  12. 100, 95, 90, 85, 80, 75, 70, 65, 60, 55,
  13. 50, 45, 40, 35, 30, 25, 20, 15, 10, 5,
  14. 0, 5, 10, 15, 20, 25, 30, 35, 40, 45
  15. };
  16. /*******************************************************************************
  17. * 函 数 名: PWM_Init(void)
  18. * 函数功能: PWM初始化设置
  19. * 入口参数: 无
  20. * 返 回: 无
  21. *******************************************************************************/
  22. void PWM_Init(void)
  23. {
  24. CCPR1L = 0x7F; //初始值,通过调节CCPR1L:CCP1[5:4]的值来达到调节占空比的目的
  25. CCP1CON = CCP1CON | 0x3C; //CCP1[5:4] = 11
  26. TRISC2 = 0; //设置RC2为输出模式
  27. }
  28. /*******************************************************************************
  29. * 函 数 名: Time2_Init(void)
  30. * 函数功能: 定时器2初始化
  31. * 入口参数: 无
  32. * 返 回: 无
  33. *******************************************************************************/
  34. void Time2_Init(void)
  35. {
  36. T2CON = 0x0C; //启用后分频器,分频比1:2,TIMER2计数允许,前置分频器分频比1:1
  37. PR2 = 255; //正弦波周期为250Hz
  38. TMR2IF = 0; //定时器2中断标志位清零
  39. GIE = 1; //开总中断
  40. PEIE = 1; //开外设中断
  41. TMR2IE = 1; //开定时器中断
  42. }
  43. /*******************************************************************************
  44. * 函 数 名: main(void)
  45. * 函数功能: 用PWM输出,调节占空比来调节LED灯的亮度
  46. * 入口参数: 无
  47. * 返 回: 无
  48. *******************************************************************************/
  49. void main(void)
  50. {
  51. PWM_Init();
  52. Time2_Init();
  53. while(1)
  54. {
  55. }
  56. }
  57. /******************************************************************************
  58. * 函 数 名: Timer2_ISR(void)
  59. * 函数功能: 中断函数
  60. * 入口参数: 无
  61. * 返 回: 无
  62. *******************************************************************************/
  63. void interrupt Timer2_ISR(void)
  64. {
  65. if(TMR2IF)
  66. {
  67. ++gDutycount;
  68. if(gDutycount == 39)
  69. {
  70. gDutycount = 0;
  71. }
  72. CCPR1L = SINETABLE[gDutycount]; // 根据sin表改变PWM波周期
  73. TMR2IF = 0;
  74. }
  75. }

电路接法:PIC单片机生成正弦波

二、编写程序,实现呼吸灯

利用上述程序,动态改变PWM占空比,以实现动态改变LED供给电压的大小,加以适当延时,即可实现呼吸灯。

跳线接法:取下RC2和RD0的短接帽,用杜邦线一头接RC2里面,一头接RD0外面,再短接P14。

  1. #include <htc.h>
  2. #define uint8 unsigned char
  3. #define uint16 unsigned int
  4. __CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位
  5. //WDTE_OFF:disable watchdog timer 看门狗禁止
  6. //LVP_OFF:low voltage programming disabled 低电压编程禁止
  7. //FOSC_HS:high speed crystal/resonator 4M以上晶振选择HS高速
  8. //PWRTDIS:disable power up timer
  9. //BOREN_OFF:disable brown out reset
  10. uint8 gDutycount = 0;
  11. uint16 count = 0 ;
  12. const char SINETABLE[40] = {50, 55, 60, 65, 70, 75, 80, 85, 90, 95,
  13. 100, 95, 90, 85, 80, 75, 70, 65, 60, 55,
  14. 50, 45, 40, 35, 30, 25, 20, 15, 10, 5,
  15. 0, 5, 10, 15, 20, 25, 30, 35, 40, 45
  16. };
  17. /*******************************************************************************
  18. * 函 数 名: PWM_Init(void)
  19. * 函数功能: PWM初始化设置
  20. * 入口参数: 无
  21. * 返 回: 无
  22. *******************************************************************************/
  23. void PWM_Init(void)
  24. {
  25. CCPR1L = 0x7F; //初始值,通过调节CCPR1L:CCP1[5:4]的值来达到调节占空比的目的
  26. CCP1CON = CCP1CON | 0x3C; //CCP1[5:4] = 11
  27. TRISC2 = 0; //设置RC2为输出模式
  28. }
  29. /*******************************************************************************
  30. * 函 数 名: Time2_Init(void)
  31. * 函数功能: 定时器2初始化
  32. * 入口参数: 无
  33. * 返 回: 无
  34. *******************************************************************************/
  35. void Time2_Init(void)
  36. {
  37. T2CON = 0x0C; //启用后分频器,分频比1:2,TIMER2计数允许,前置分频器分频比1:1
  38. PR2 = 255; //正弦波周期为250Hz
  39. TMR2IF = 0; //定时器2中断标志位清零
  40. GIE = 1; //开总中断
  41. PEIE = 1; //开外设中断
  42. TMR2IE = 1; //开定时器中断
  43. }
  44. /*******************************************************************************
  45. * 函 数 名: main(void)
  46. * 函数功能: 用PWM输出,调节占空比来调节LED灯的亮度
  47. * 入口参数: 无
  48. * 返 回: 无
  49. *******************************************************************************/
  50. void main(void)
  51. {
  52. PWM_Init();
  53. Time2_Init();
  54. while(1)
  55. {
  56. }
  57. }
  58. /******************************************************************************
  59. * 函 数 名: Timer2_ISR(void)
  60. * 函数功能: 中断函数
  61. * 入口参数: 无
  62. * 返 回: 无
  63. *******************************************************************************/
  64. void interrupt Timer2_ISR(void)
  65. {
  66. if(TMR2IF)
  67. {
  68. ++count;
  69. if(count == 75)
  70. {
  71. ++gDutycount;
  72. if(gDutycount == 39)
  73. {
  74. gDutycount = 0;
  75. }
  76. CCPR1L = SINETABLE[gDutycount]; // 根据sin表改变PWM波周期
  77. count = 0;
  78. }
  79. TMR2IF = 0;
  80. }
  81. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多