找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2835|回复: 2
收起左侧

51单片机控制RGB灯带源程序(4线-1电源3原色)

[复制链接]
ID:977804 发表于 2022-3-10 14:16 | 显示全部楼层 |阅读模式
这种灯带的价格比WS2812便宜很多,功能也很单一,不能流水,不能独立控制某一位,简单模拟。代码是论坛网友的,不用定时器的PWM,稍微修改了一下。
可以顺序点亮,可以随机点亮。
制作出来的实物图如下:
51hei图片_20220310141406.jpg

单片机源程序如下:
#include<reg52.h> //包含特殊功能寄存器的定义
#include <stdlib.h>           //随机函数包含
#include<LED.H>
#include<PWM.H>
#define uchar unsigned char
#define uint  unsigned int


void Init_Timer0(void)                  //定时器初始化子程序
{
        TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
        TH0=0x00;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
        TL0=0x00;
        EA=1;            //总中断打开
        ET0=1;           //定时器中断打开
        TR0=1;           //定时器开关打开
}
void main()
{         
        Init_Timer0();

        while(1)
        {
        PWMdis();
        }
}




/*
********************************************************************************
** 函数名称 : Timer0_isr(void) interrupt 1 using 1
** 函数功能 : 定时器中断程序
********************************************************************************
*/
void Timer0_isr(void) interrupt 1 using 1
{
        TH0=0x00;                  //重新赋值,方式1是16位计数器,不能硬件重装初始值
        TL0=0x00;
        x1++;;        
        if(x1>=35){x1=0;        x2=rand()%7;  }  //获得0~8之间的随机数,函数rand()在stdlib.h}
        //if(x2>=7)x2=0;




        
}


#ifndef _LED_H_
#define _LED_H_

#define uchar unsigned char
uchar code table[]={0xfe,0xfb,0xfd,  0XF9, 0XFA,  0XFC,        0XF8        };
                                //  亮R, 亮G, 亮B, 亮RG, 亮rb   亮GB        三个都亮

sbit ledr=P0^0;
sbit ledg=P0^1;
sbit ledb=P0^2;

uchar x1,x2;

#define ledr_on ledr=0;
#define ledr_off ledr=1;

#define ledg_on ledg=0;
#define ledg_off ledg=1;

#define ledb_on ledb=0;
#define ledb_off ledb=1;









#endif


/*-----------------------------------------------
  名称:PWM调光
  修改:无
  内容:通过PWM(脉宽调制)调节LED的亮度
------------------------------------------------*/
#ifndef __PWM_H__
#define __PWM_H__


unsigned int CYCLE=260,PWM_LOW=0;//定义周期并赋值
void PWMDelay(unsigned int t)
{
while(--t);
}

void PWMdis()
{

PWMDelay(6000);        //特意加延时,可以看到熄灭的过程
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
         { //PWM_LOW表示低
         //电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次         
                //        ledr=0;
        
                P0=table[x2];
                           PWMDelay(PWM_LOW);//延时长度,600次循环中从1加至599
                //        ledr=1;
                P0=0XFF;
                      PWMDelay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
            
           }

         for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
                 { //与逐渐变亮相反的过程
               

                        //        ledr=0;
                        P0=table[x2];
                                   PWMDelay(PWM_LOW);

                                //ledr=1;
                                P0=0XFF;
                              PWMDelay(CYCLE-PWM_LOW);
                     
                   }
                     //主循环中添加其他需要一直工作的程序
}



#endif
Honeycam 2022-03-10 14-11-34.gif

评分

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

查看全部评分

回复

使用道具 举报

ID:977804 发表于 2022-3-11 16:11 来自手机 | 显示全部楼层
上图是驱动的5v的灯带,上午查了些资料,下午用光耦驱动12v的灯带。
回复

使用道具 举报

ID:977804 发表于 2022-3-11 18:40 来自手机 | 显示全部楼层
电压不同的场合,用:光耦非常方便
DSC_0039.JPG
DSC_0040.JPG
DSC_0041.JPG
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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