|
|
這種燈帶的價(jià)格比WS2812便宜很多,功能也很單一,不能流水,不能獨(dú)立控制某一位,簡(jiǎn)單模擬。代碼是論壇網(wǎng)友的,不用定時(shí)器的PWM,稍微修改了一下。
可以順序點(diǎn)亮,可以隨機(jī)點(diǎn)亮。
制作出來的實(shí)物圖如下:
51hei圖片_20220310141406.jpg (84.61 KB, 下載次數(shù): 93)
下載附件
2022-3-10 14:14 上傳
單片機(jī)源程序如下:
#include<reg52.h> //包含特殊功能寄存器的定義
#include <stdlib.h> //隨機(jī)函數(shù)包含
#include<LED.H>
#include<PWM.H>
#define uchar unsigned char
#define uint unsigned int
void Init_Timer0(void) //定時(shí)器初始化子程序
{
TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
TH0=0x00; //給定初值,這里使用定時(shí)器最大值從0開始計(jì)數(shù)一直到65535溢出
TL0=0x00;
EA=1; //總中斷打開
ET0=1; //定時(shí)器中斷打開
TR0=1; //定時(shí)器開關(guān)打開
}
void main()
{
Init_Timer0();
while(1)
{
PWMdis();
}
}
/*
********************************************************************************
** 函數(shù)名稱 : Timer0_isr(void) interrupt 1 using 1
** 函數(shù)功能 : 定時(shí)器中斷程序
********************************************************************************
*/
void Timer0_isr(void) interrupt 1 using 1
{
TH0=0x00; //重新賦值,方式1是16位計(jì)數(shù)器,不能硬件重裝初始值
TL0=0x00;
x1++;;
if(x1>=35){x1=0; x2=rand()%7; } //獲得0~8之間的隨機(jī)數(shù),函數(shù)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 三個(gè)都亮
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調(diào)光
修改:無
內(nèi)容:通過PWM(脈寬調(diào)制)調(diào)節(jié)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); //特意加延時(shí),可以看到熄滅的過程
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
{ //PWM_LOW表示低
//電平時(shí)間,這個(gè)循環(huán)中低電平時(shí)長(zhǎng)從1累加到CYCLE(周期)的值,即600次
// ledr=0;
P0=table[x2];
PWMDelay(PWM_LOW);//延時(shí)長(zhǎng)度,600次循環(huán)中從1加至599
// ledr=1;
P0=0XFF;
PWMDelay(CYCLE-PWM_LOW);//延時(shí)長(zhǎng)度,600次循環(huán)中從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);
}
//主循環(huán)中添加其他需要一直工作的程序
}
#endif
|
評(píng)分
-
查看全部評(píng)分
|