这种灯带的价格比WS2812便宜很多,功能也很单一,不能流水,不能独立控制某一位,简单模拟。代码是论坛网友的,不用定时器的PWM,稍微修改了一下。
可以顺序点亮,可以随机点亮。
制作出来的实物图如下:
单片机源程序如下:
#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
|