找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4954|回复: 5
收起左侧

51单片机输出3路PWM,驱动RGB LED源程序

  [复制链接]
ID:460753 发表于 2020-2-22 15:45 | 显示全部楼层 |阅读模式
用单片机中断处理PWM,控制普通三色LED,输出七种不同颜色,呼吸变化。不占用程序运行时间。 1077e5cd79fe6558cd39471b1c8e92c.jpg 169d70fc4f70d98dbb00544d22b98d1.jpg

单片机源程序如下:
  1. #include<reg52.h>

  2. sbit B_LED=P0^0;                //蓝灯引脚,高电平时点亮LED
  3. sbit R_LED=P0^1;                //红灯引脚,高电平时点亮LED
  4. sbit G_LED=P0^2;                //绿灯引脚,高电平时点亮LED

  5. unsigned char R_OUT=0,G_OUT=0,B_OUT=0;                //定义占空比计数变量
  6. unsigned int MAX=80,MIN=1;                                        //定义变色起始级数,范围最大可以0-255
  7. unsigned char T0RH=0,T0RL=0;                                //定时器中间变量
  8. void configtime0(unsigned int ms);                        //定时器0配置
  9. void configtime1();                                                        //定时器1配置
  10. void ConfigPWM(unsigned char t);                        //PWM占空比处理涵数
  11. main()
  12. {        
  13.     EA=1;
  14.         configtime0(1);
  15.     configtime1();
  16.     while(1);
  17. }

  18. //每调用一次此涵数,PWM占空比加一
  19. void ConfigPWM(unsigned char t)
  20. {
  21.         static unsigned char dir=0;                //定义变亮或变暗方向
  22.         static unsigned char index=0;        //定义变色索引
  23.         static unsigned int time=0;                //中间变量

  24.         switch(index)
  25.         {
  26.                 case 0:            if(dir==0)                //红色由暗变亮
  27.                                         {
  28.                                                 time+=t;
  29.                                                 R_OUT=time;
  30.                                                 if(time>=MAX)
  31.                                                 {
  32.                                                         dir=1;
  33.                                                 }
  34.                                         }
  35.                                         else                        //红色由亮变暗
  36.                                         {
  37.                                                 time-=t;
  38.                                                 R_OUT=time;
  39.                                                 if(time<=MIN)
  40.                                                 {
  41.                                                         dir=0;
  42.                                                         time=0;
  43.                                                         index=1;
  44.                                                 }
  45.                                         }
  46.                                         break;
  47.                                        
  48.                 case 1:            if(dir==0)                //黄色由暗变亮
  49.                                         {
  50.                                                 time+=t;
  51.                                                 G_OUT=time/2;
  52.                                                 R_OUT=time;
  53.                                                 if(time>=MAX)
  54.                                                 {
  55.                                                         dir=1;
  56.                                                 }
  57.                                         }
  58.                                         else                        //黄色由亮变暗
  59.                                         {
  60.                                                 time-=t;
  61.                                                 G_OUT=time/2;
  62.                                                 R_OUT=time;
  63.                                                 if(time<=MIN)
  64.                                                 {
  65.                                                         dir=0;
  66.                                                         time=0;
  67.                                                         index=2;
  68.                                                 }
  69.                                         }
  70.                                         break;
  71.                                        
  72.                 case 2:            if(dir==0)                //橙色由暗变亮
  73.                                         {
  74.                                                 time+=t;
  75.                                                 G_OUT=time;
  76.                                                 R_OUT=time;
  77.                                                 if(time>=MAX)
  78.                                                 {
  79.                                                         dir=1;
  80.                                                 }
  81.                                         }
  82.                                         else                        //橙色由亮变暗
  83.                                         {
  84.                                                 time-=t;
  85.                                                 G_OUT=time;
  86.                                                 R_OUT=time;
  87.                                                 if(time<=MIN)
  88.                                                 {
  89.                                                         dir=0;
  90.                                                         time=0;
  91.                                                         index=3;
  92.                                                 }
  93.                                         }
  94.                                         break;
  95.                                        
  96.                 case 3:            if(dir==0)                //绿色由暗变亮
  97.                                         {
  98.                                                 time+=t;
  99.                                                 G_OUT=time;
  100.                                                 if(time>=MAX)
  101.                                                 {
  102.                                                         dir=1;
  103.                                                 }
  104.                                         }
  105.                                         else                        //绿色由亮变暗
  106.                                         {
  107.                                                 time-=t;
  108.                                                 G_OUT=time;
  109.                                                 if(time<=MIN)
  110.                                                 {
  111.                                                         dir=0;
  112.                                                         time=0;
  113.                                                         index=4;
  114.                                                 }
  115.                                         }
  116.                                         break;
  117.                                        
  118.                 case 4:            if(dir==0)                //青色由暗变亮
  119.                                         {
  120.                                                 time+=t;
  121.                                                 G_OUT=time;
  122.                                                 B_OUT=time;
  123.                                                 if(time>=MAX)
  124.                                                 {
  125.                                                         dir=1;
  126.                                                 }
  127.                                         }
  128.                                         else                        //青色由亮变暗
  129.                                         {
  130.                                                 time-=t;
  131.                                                 G_OUT=time;
  132.                                                 B_OUT=time;
  133.                                                 if(time<=MIN)
  134.                                                 {
  135.                                                         dir=0;
  136.                                                         time=0;
  137.                                                         index=5;
  138.                                                 }
  139.                                         }
  140.                                         break;
  141.                                        
  142.                 case 5:            if(dir==0)                //蓝色由暗变亮
  143.                                         {
  144.                                                 time+=t;
  145.                                                 B_OUT=time;
  146.                                                 if(time>=MAX)
  147.                                                 {
  148.                                                         dir=1;
  149.                                                 }
  150.                                         }
  151.                                         else                        //蓝色由亮变暗
  152.                                         {
  153.                                                 time-=t;
  154.                                                 B_OUT=time;
  155.                                                 if(time<=MIN)
  156.                                                 {
  157.                                                         dir=0;
  158.                                                         time=0;
  159.                                                         index=6;
  160.                                                 }
  161.                                         }
  162.                                         break;
  163.                                        
  164.                 case 6:            if(dir==0)                //紫色由暗变亮
  165.                                         {
  166.                                                 time+=t;
  167.                                                 B_OUT=time;
  168.                                                 R_OUT=time;
  169.                                                 if(time>=MAX)
  170.                                                 {
  171.                                                         dir=1;
  172.                                                 }
  173.                                         }
  174.                                         else                        //紫色由亮变暗
  175.                                         {
  176.                                                 time-=t;
  177.                                                 B_OUT=time;
  178.                                                 R_OUT=time;
  179.                                                 if(time<=MIN)
  180.                                                 {
  181.                                                         dir=0;
  182.                                                         time=0;
  183.                                                         index=7;
  184.                                                 }
  185.                                         }
  186.                                         break;
  187.                                        
  188.                 case 7:            if(dir==0)                //白色由暗变亮
  189.                                         {
  190.                                                 time+=t;
  191.                                                 G_OUT=time;
  192.                                                 B_OUT=time;
  193.                                                 R_OUT=time;
  194.                                                 if(time>=MAX)
  195.                                                 {
  196.                                                         dir=1;
  197.                                                 }
  198.                                         }
  199.                                         else                        //白色由亮变暗
  200.                                         {
  201.                                                 time-=t;
  202.                                                 G_OUT=time;
  203.                                                 B_OUT=time;
  204.                                                 R_OUT=time;
  205.                                                 if(time<=MIN)
  206.                                                 {
  207.                                                         dir=0;
  208.                                                         time=0;
  209.                                                         index=0;
  210.                                                 }
  211.                                         }
  212.                                         break;
  213.         }
  214. }
  215. //定时器1配置
  216. void configtime1()
  217. {
  218.         TH1=0x80;
  219.         TL1=TH1;
  220.         TMOD&=0x0f;
  221.         TMOD|=0x20;
  222.         TR1=1;
  223.         ET1=1;
  224. }
  225. //定时器0配置
  226. void configtime0(unsigned int ms)
  227. {
  228.         unsigned long tmp;
  229.         tmp=11059200/12;
  230.         tmp=tmp*ms/1000;
  231.         tmp=65536-tmp;
  232.         T0RH=(unsigned char)(tmp>>8);
  233.         T0RL=(unsigned char)tmp;
  234.         TH0=T0RH;
  235.         TL0=T0RL;
  236.         TMOD&=0xf0;
  237.         TMOD|=0x01;
  238.         TR0=1;
  239.         ET0=1;
  240. }
  241. //定时器0中断涵数,每5ms刷新一次占空比
  242. void timer0() interrupt 1
  243. {
  244.         static unsigned int tmr;
  245.         TH0=T0RH;
  246.         TL0=T0RL;
  247.         tmr++;
  248.         if(tmr>=5)
  249.         {
  250.                 tmr=0;
  251.                 ConfigPWM(1);
  252.         }
  253. }
  254. //定时器1中断涵数,输出占空比
  255. void timer1() interrupt 3
  256. {
  257.     unsigned char cnt;
  258.         
  259.     for(cnt=0;cnt<MAX;cnt++)
  260.     {
  261.                 if(cnt<R_OUT)
  262.             R_LED=1;        //红色占空比大于计数值时红灯亮
  263.         else
  264.                         R_LED=0;        //否则就关闭红色
  265.                
  266.         if(cnt<G_OUT)               
  267.                         G_LED=1;                //绿色占空比大于计数值时绿灯亮
  268.         else
  269.                         G_LED=0;                //否则就关闭绿色
  270.                
  271.         if(cnt<B_OUT)
  272.                         B_LED=1;                //蓝色占空比大于计数值时蓝灯亮
  273.         else
  274.                         B_LED=0;                //否则就关闭蓝色
  275.     }
  276. }
复制代码

全部资料51hei下载地址:
PWM_LED.zip (2.9 KB, 下载次数: 121)

评分

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

查看全部评分

回复

使用道具 举报

ID:734224 发表于 2020-4-21 11:32 | 显示全部楼层
如果想用传感器控制PWM的变化,请问怎么做
回复

使用道具 举报

ID:620287 发表于 2020-4-24 00:25 来自手机 | 显示全部楼层
是共阳的LED吗
回复

使用道具 举报

ID:765564 发表于 2020-6-20 10:25 | 显示全部楼层
大佬 有原理图吗
回复

使用道具 举报

ID:718821 发表于 2020-6-20 11:59 | 显示全部楼层
不错,谢谢分享!
回复

使用道具 举报

ID:230742 发表于 2020-8-12 19:34 | 显示全部楼层
我感觉怎么是1路PWM呢。好像应该把标题改一下。PWM控制RGB灯。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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