发 帖  
原厂入驻New

51单片机基于C语言I/O口模拟PWM输出实现呼吸灯功能

2020-9-15 13:56:50  242 单片机 c语言 呼吸灯
分享
1
本帖最后由 你猜猜1235121 于 2020-9-15 16:18 编辑

欢迎各位看官你好!本人新手,初次尝试搞代码以及写博客,有写的不对的或者有更好的建议,可以在留言处评论,谢谢哦!
先解释一下自己的思路本人把呼吸灯函数放在了定时器中断中,通过函数标志位是否被置1来控制呼吸灯功能是否打开,通过IO口模拟PWM方波来控制LED灯的亮度
  1. case Type_Breathing_LED:                                                
  2.                PWM_Flag=1;                                                
  3.                 break;
复制代码

为了简单明了,直接在主函数的状态机中把呼吸灯功能标志位置1,即呼吸灯功能一直在实现。
上代码

  1. #define  LED_Light 2        //固定LED灯的亮度
  2. #define PWM_Cycle 100//PWM周期
  3. #define Shine_Speed        100//改变占空比
  4. bit PWM_Flag;//呼吸灯功能打开标志位<div>static unsigned char PWM_count,LED_count;//PWM_count和LED_count凑成PWM的周期,如果要改变占空比,则改变LED_count        
  5. if(PWM_Flag==1)                        
  6. {               
  7. LED_count=LED_Light;        //当LED_count给定一个值,呼吸灯功能关闭,此语句用于固定灯的亮度;                                                               
  8. //若想实现呼吸灯,请把此语句屏蔽,如果想调节灯的亮度,可以在宏定义修改LED_Light的值,推荐值的数值范围为PWM_Cycle的1~1/20倍;                PWM_count++;        //用于高低电平输出时间                                                        if(PWM_count<LED_count)                        
  9. {                        
  10. OFF_A;OFF_B;OFF_C;OFF_D;OFF_E;OFF_F;OFF_G;OFF_DP;                                        }               
  11. else                 
  12. {                        
  13. ON_A;ON_B;ON_C;ON_D;ON_E;ON_F;ON_G;ON_DP;//由于我是数码管显示,所以这里直接让8位按照呼吸灯来显示,OFF代表低电平,ON代表高电平,数码管为共阳数码管,所以OFF为亮,ON为暗                        
  14. }               
  15. if(PWM_count>=PWM_Cycle)        
  16. {
  17. PWM_count=0;LED_count++;}//当PWM每次输出完一个方波,则改变一次占空比,且重新计时高低电平输出时间               
  18. if(LED_count>=Shine_Speed)        
  19. LED_count=0;//当亮度去到最大值,占空比重新计算;        
  20. }
  21. 此功能呼吸灯只是从暗到亮渐变,然后到达最大亮度则马上从最暗开始渐变到最亮,一直循环。后续更新一个呼吸灯从暗-亮-暗-亮一直循环的呼吸灯功能。谢谢大家!
  22. <b>更新</b>
  23. 以下为呼吸灯从暗-亮-暗-亮一直循环的呼吸灯功能;
  24. //以下的变量均和上面例子的变量统一的定义
  25. static unsigned char i;//用于调节占空比
  26. static unsigned int j;//用于调节占空比
  27. if(PWM_Flag==1)                                
  28. {               
  29. LED_count=2;        //亮度初始值               
  30. PWM_count++;        //计时高低电平持续时间                                                if(PWM_count<LED_count)               
  31. {                        
  32. OFF_A;OFF_B;OFF_C;OFF_D;OFF_E;OFF_F;OFF_G;OFF_DP;                                        }               
  33. else                 
  34. {                        
  35. ON_A;ON_B;ON_C;ON_D;ON_E;ON_F;ON_G;ON_DP;               
  36. }               
  37. //上面一部分代码和第一个例子的代码完全重复,在此不做解释                if(PWM_count>=(LED_count*i/1))         //模拟输出PWM,每隔1个周期(500ms)i会+1,相对应的改变了占空比,               
  38. {                        
  39. PWM_count=0;//重新计算高低电平时间                                
  40. }                //调节占空比               
  41. if(Back_Flag==0)//亮-暗的呼吸               
  42. {                        
  43. if(j++>=500)//500ms                        
  44. {                                
  45. j=0;                                
  46. i++;        //改变占空比                        
  47. }                                                
  48. if(i>=30)        //占空比最多去到1/30                        
  49. {                                
  50. j=0;        //重新计时                                
  51. Back_Flag=1;        //反方向运行                        
  52. }                        
  53. }               
  54. else if(Back_Flag==1)//暗-亮的呼吸               
  55. {                       
  56. if((j++>=500))                        
  57. {                              
  58. j=0;                                
  59. i--;                        
  60. }                        
  61. if((i<=1))                                
  62. {                                
  63. j=0;                                       
  64. Back_Flag=0;                        
  65. }               
  66. }                        
  67. }</div>
复制代码

写在最后以上便是51单片机基于C语言I/O口模拟PWM输出实现呼吸灯功能,有更好建议的同学可以留言或者评论,谢谢!

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

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