找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3081|回复: 6
打印 上一主题 下一主题
收起左侧

关于单片机呼吸灯的新想法设计

[复制链接]
跳转到指定楼层
楼主
        看过一些用单片机做的呼吸灯,很多都是利于延时做的。如果用延时做,会有大量的延时处理。这是非常落后的程序,再想扩展别的功能就可能得不到正确的响应。我想到一个方法来做,并且已实现同时多路LED 的呼吸灯;
原理图见附件。
利用一个定时器产生20US的中断。每500个中断时间就是10ms,利用500个中断控制这10ms的高低电平(占空比),如250个中断高,250个中断低,就是50%的占空比。10MS的周期刚好是100HZ,LED 100HZ刷新足够了。利用另一个定时器来控制占空比的时间,这样就产生的呼吸效果。而且可以同时控制多路。
单片机源码:
  1. #ifndef _CONFIG_H
  2. #define _CONFIG_H
  3. #include "STC15W40XXX.H"
  4. #include <intrins.h>
  5. //定义主时钟
  6. #define FOSC 24000000UL           //20MHZ
  7. #define T1000Hz (FOSC / 12 / 1000)
  8. #define CCP_S0 0x10 //P_SW1.4
  9. #define CCP_S1 0x20 //P_SW1.5

  10. /* 数据类型定义 */
  11. typedef  signed    char    uchar;    // 8位有符号整型数
  12. typedef  signed    int     uint;   //16位有符号整型数
  13. typedef  signed    long    ulong;   //32位有符号整型数
  14. //定时器T0用作脉冲发生器,定时20us
  15. void Timer0Init(void)  //20微秒@24.000MHz
  16. {
  17. AUXR &= 0x7F;  //定时器时钟12T模式
  18. TMOD &= 0xF0;  //设置定时器模式
  19. TL0 = 0xD8;  //设置定时初值
  20. TH0 = 0xFF;  //设置定时初值
  21. TF0 = 0;  //清除TF0标志
  22. TR0 = 1;  //定时器0开始计时
  23. ET0=1;
  24. }
  25. #endif

  26. #include "main.h"
  27. sbit LEDAll = P3^5;
  28. sbit LEDA = P3^2;
  29. sbit LEDB = P3^3;
  30. sbit LEDC = P5^5;
  31. sbit LEDD = P5^4;
  32. sbit KEY_On=P3^4;
  33. bit Power_on=0;
  34. uchar KeySta = 1;     //全部按键的当前状态
  35. uchar backup = 1;     //按键值备份,保存前一次的值

  36. uint cnt;
  37. uint value;
  38. uint PWM_Cont=0;

  39. //--------------------
  40. void UartInit();           [url=]//9600bps@33.1776MHz[/url]
  41. void Timer0Init();           //Timer0 set
  42. void PCATimerInit();        //Timer0 set
  43. void Key_scan();       //按键扫描函数
  44. void Key_Function();             //按键功能函数

  45. void Delay500ms()  [url=]//@33.1776MHz[/url]
  46. {
  47. unsigned char i, j, k;
  48. _nop_();
  49. _nop_();
  50. i = 64;
  51. j = 9;
  52. k = 179;
  53. do
  54. {
  55.   do
  56.   {
  57.    while (--k);
  58.   } while (--j);
  59. } while (--i);
  60. }

  61. /**********************************************/
  62. void main()
  63. {
  64. PCATimerInit();   //PCA定时器初始化
  65. Timer0Init();    //定时器0初始化
  66. UartInit();     //串口初始化
  67. EA = 1;           //打开总中断
  68. Delay500ms();
  69. SBUF=0XFF;
  70. LEDAll=0;
  71. LEDA=0;
  72. LEDB=0;
  73. LEDC=0;
  74. LEDD=0;
  75. P1=0X00;


  76. while(1)
  77. {
  78.     if(Power_on )
  79. {
  80. //  LEDAll=0;
  81. }
  82. else
  83. {
  84.   //LEDAll=1;
  85. }


  86. }
  87. }
  88. /********************** Timer0 20us中断函数 ************************/
  89. //定义20us的中断,因为10ms的周期信号100hz控制LED频频, 在10MS内分成500分占空比。每20US一次。

  90. void timer0 (void) interrupt 1
  91. {  
  92.    static uint P_20us=0;
  93.    EA=0;
  94.    P_20us++;
  95. if(P_20us>=500)
  96. {
  97.   LEDAll=1;
  98.   P_20us=0;
  99.       
  100. }
  101. else
  102. {
  103.   if(P_20us==PWM_Cont)
  104.   LEDAll=0;
  105. }
  106.   EA=1;
  107. }
  108. //PCA定时器中断 1ms的中断时间
  109. void PCA_isr() interrupt 7 using 1
  110. {

  111.   static bit i=0;
  112.   static uchar j=0;
  113.    
  114.   j++;
  115.     CCF0 = 0;                       //清中断标志
  116.     CCAP0L = value;
  117.     CCAP0H = value >> 8;            //更新比较值
  118.     value += T1000Hz;
  119. Key_scan();
  120. Key_Function();
  121.    if(j>=5)
  122.    {
  123.      j=0;
  124. if(i==0)
  125. {
  126.   PWM_Cont++;
  127.   if(PWM_Cont==500)
  128.   {
  129.    i=1;
  130.   }  
  131. }
  132. else
  133. {
  134.   PWM_Cont--;
  135.   if(PWM_Cont==20)
  136.   {
  137.    i=0;
  138.   }
  139. }
  140. }

  141. }
复制代码

电路原理图如下:


下载:
直径105MM的三色呼吸灯.pdf (104.15 KB, 下载次数: 16)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301968 发表于 2018-9-10 17:00 | 只看该作者
按键部份已删除
回复

使用道具 举报

板凳
ID:384937 发表于 2018-9-11 14:38 | 只看该作者
学习学习,不错不错
回复

使用道具 举报

地板
ID:384937 发表于 2018-9-11 14:38 | 只看该作者
学习学习,看看看看,见过大佬
回复

使用道具 举报

5#
ID:392628 发表于 2018-9-11 20:02 | 只看该作者
延时做的太占资源,芯片就干不了其它事了;用中断来做,所占的资源很少,芯片可处理其它事情。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:66287 发表于 2018-9-12 08:37 | 只看该作者
专业呼吸灯可以,要是在其他应用中,20uS中断一次,单片机什么也干不了
回复

使用道具 举报

7#
ID:301968 发表于 2019-1-25 10:15 | 只看该作者
单片机的频率可以尽量设置最高的,比较24M或 以上,20US还是可以的,中断里面不要做过多的事就可以

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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