找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2816|回复: 3
收起左侧

关于pic16f1828单片机制作的呼吸灯,但是渐亮和渐暗过程效果不顺畅

[复制链接]
ID:383379 发表于 2018-8-7 16:57 | 显示全部楼层 |阅读模式
新手刚接触单片机,用的是PIC16f1828芯片,参考着做了个呼吸灯,用PWM输出,在中断部分的程序没看明白,可以帮我解释下吗?而且在灯渐亮和渐暗过程中不是很流畅,在暗亮之间的停顿时间过短。大家能帮我看看该怎么调整吗?如果配置完PWM后不用中断,想让占空比通过逐渐增加和减少来实现渐亮到渐灭来实现呼吸灯功能又该怎么写?谢谢以下是我参考所写的程序:
  1. #include <pic16f1828.h>
  2. #define uint8 unsigned char
  3. #define uint16 unsigned int
  4. uint8 gDutycount = 0;
  5. uint16 count=0;
  6. const char SINETABLE[38]={50,55,60,65,70,75,80,85,90,95,100,95,90,85,80,75,70,60,60,55,50,45,40,35,30,25,20,15,10,5,10,15,20,25,30,35,40,45};
  7. void PWM_Init(void)
  8. {  
  9.     OSCCONbits.IRCF=1110;//8M晶振
  10.     CCPR1L=0x32;
  11.     CCP1CON=0b00001100;
  12.     TRISC5=0;
  13. }
  14. void Time2_Init(void)
  15. {
  16.    T2CON=0x05;
  17.    PR2=99;
  18.    TMR2IF=0;
  19.    GIE=1;
  20.    PEIE=1;
  21.    TMR2IE=1;
  22. }
  23. void main(void)
  24. {
  25.    PWM_Init();
  26.    Time2_Init();
  27.   while(1)
  28.    {

  29.      }
  30. }
  31. void interrupt Tmer2_isr(void)
  32. {
  33.    if(TMR2IF)
  34.   {
  35.     ++count;
  36.      if(count==35)
  37.     {
  38.        ++gDutycount;
  39.         if(gDutycount==75)
  40.        {
  41.           gDutycount=0;
  42.         }
  43.       CCPR1L=SINETABLE[gDutycount];
  44.       count=0;
  45.     }
  46.     TMR2IF=0;
  47.   }
  48. }
复制代码
回复

使用道具 举报

ID:463457 发表于 2019-1-15 19:17 | 显示全部楼层
楼主有仿真么
回复

使用道具 举报

ID:18297 发表于 2018-8-10 10:15 | 显示全部楼层
  1. <blockquote>
复制代码
1)pic16F1828的CCP1的PWM输出可以设置time2,time4,time6定时器。
     CCPTMRS0=0;      //选择CCP1设置为time2定时器
2)time2已经用于CCP1定时器,不能在用于普通的定时器。
3)以上程序,经过proteus仿真,可以看如附件视频。


QQ视频20180810101052.rar

5.42 MB, 下载次数: 26

回复

使用道具 举报

ID:383379 发表于 2018-8-9 16:39 | 显示全部楼层
这是用一个数组按照5%的占空比的关系列出来的,慢慢调节亮度时候回感觉那种跳变的,程序该怎么修改才能让占空比的变化是缓慢进行的而不是阶梯性跳变的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表