标题:
全彩WS2812驱动实验(8脚单片机)STC15F104W
[打印本页]
作者:
MCKK520
时间:
2018-2-16 07:34
标题:
全彩WS2812驱动实验(8脚单片机)STC15F104W
STC15F104W单片机源程序如下:
===========================
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*
,
全彩 LED ws2812 灯 驱动程序,受到论坛 zhuls 的启发,
实现了在我的8脚芯片,STC15F104W芯片上的驱动,、
修改内部晶振 @ 12MHZ, STC Y5内核,一个 _nop_(); 为 0.25 us时间为基准来驱动WS2812
此程序实验完美驱动WS2812,无闪烁,无跳灯,
,
接下来想用很长一个WS2812灯带,摆成88:88这样一个数码管形状,
然后用单片机一个IO口驱动,实现全彩数字钟,(多功能),比如说重要定时时间到了,狂闪+高亮红色,RR=0xFF;;这样
或者睡觉前,以渐色呼吸灯的方式,直到深夜,亮度自动变暗,RR=0x01;, GG=0x01; BB=0x01;
,
*/
sfr P3M1 = 0x80; // 10 000000 全部设置为双向IO口,弱上拉25K
sfr P3M0 = 0x80; // 10 000000
sbit LED1 = P3^0; // 5
sbit LED2 = P3^1; // 6
sbit LED3 = P3^2; // 7
sbit sda = P3^3; // 8
sbit KEY1 = P3^4; // 1
sbit KEY2 = P3^5; // 3
uint US100;
uint MS1;
uint ID;
bit FLAG1;
bit FLAG2;
bit FLAG3;
bit GF;
uchar i;
uchar j;
uchar d;
uchar RR; // 颜色变量0-255 就是FF以内
uchar GG;
uchar BB;
//=============================================
void delayus(uint us) // 延时n个1us @12M晶振 STC15F104W芯片
{
uint us2;
for(us2=us;us2>0;us2--) { _nop_(); _nop_(); }
}
//==================================================延时代码 12mHZ
void delayms(uint z) //X MS延时==@ 12MHZ
{
uint x,y;
for(x=z; x>0; x--)
for(y=920; y>0; y--);
}
//=========================================================================
void bit1() //H=0.7us.L=0.6us 数据1的表示 芯片STC15F104W @ 12MHZ
//1US= 4个 _nop_(); 进程序要用掉2个_nop_(); 出程序用掉2个_nop_();
{
sda=1;
_nop_();
_nop_();
_nop_();
sda=0;
_nop_();
}
void bit0()//H=0.35us.L=0.8us ==数据0的表示
{
sda=1;
_nop_();
_nop_();
sda=0;
_nop_();
_nop_();
}
//发送8位,=1颗灯的一种颜色,WS2812灯数据为24一串24位二进制数–每种颜色8位二进制数。先是绿色,然后是红色,最后是蓝色
void send_sda(uchar dat)
{
uchar count1; //位计数器,单字节为8位
for (count1=8;count1>0;count1--)
{
if(dat & 0x80) //取高位先发,则dat & 0x80
bit1();
else
bit0();
dat<<=1; //数据右移,下一个位的数据,若高位先发则dat<<=1
}
}
//=============================================
void Init (void) //中断初始化
{
TMOD = 0x01; //12M 100us
TL0 = (65536-100)%256; //设置定时初值
TH0 = (65536-100)/256; //设置定时初值
EA=1;
ET0=1;
TR0=1;
}
//=============================================
void timer0(void) interrupt 1 using 1 //---定时器t0-----
{
TL0 = (65536-100)%256; //设置定时初值
TH0 = (65536-100)/256; //设置定时初值
US100++; TF0 = 0;
if(US100>=10 ) { MS1++; US100=0; }
if( MS1>=1000) //定时器实现七彩色时序
{
RR=0xFF; //
GG=0x00; //
BB=0x00; //
}
if( MS1>=2000)
{
RR=0x00; //
GG=0xFF; //
BB=0x00; //
}
if( MS1>=3000)
{
RR=0x00; //
GG=0x00; //
BB=0xFF; //
}
if( MS1>=4000)
{
RR=0xFF; //
GG=0xFF; //
BB=0x00; //
}
if( MS1>=5000)
{
RR=0xFF; //
GG=0x00; //
BB=0xFF; //
}
if( MS1>=6000)
{
RR=0x00; //
GG=0xFF; //
BB=0xFF; //
}
if( MS1>=7000)
{
RR=0x7C; //
GG=0xFC; //
BB=0x00; //
}
if( MS1>=8000)
{
RR=0x4B; //
GG=0x00; //
BB=0x82; //
MS1=0;
}
}
//=========================================================================
//========================== 主程序开始 ==================================
void main()
{
P3M1=0x80;
P3M0=0x80; //
RR=0x00; //初始化
GG=0x00; //
BB=0x00; //
Init();
while(1) //主循环。
{
for (i=0;i<5;i++) //发送5颗灯
{
send_sda(GG); //绿
send_sda(RR); //红
send_sda(BB); //蓝
}
sda=0;
delayus(70); // 高于50US的低电平信号=复位,
}
}
//=========================================================================
//========================= END ==================================
//=========================================================================
,
,
复制代码
作者:
jmkl128
时间:
2018-2-27 00:25
人才,我顶!!!!
作者:
gspt
时间:
2020-2-15 15:29
写的真好,解决了我的疑惑
谢谢楼主大哥
作者:
CNGK
时间:
2020-4-2 23:47
大哥厉害哇,解决了我的疑惑!
作者:
13534702358
时间:
2020-12-18 00:25
厉害厉害!!!!
作者:
dongfang08
时间:
2021-3-29 09:50
厉害。收藏备用,谢谢!
作者:
缘分五月八
时间:
2021-5-17 08:17
哪位大佬帮我写一个stc15F104w单片机爆闪灯,p3.2和p3.3接爆闪灯,每个灯闪3次循环爆闪用按键可以调节爆闪频
作者:
快乐a123
时间:
2022-1-2 15:27
发个接线图
作者:
1111513
时间:
2022-3-24 17:29
没效果是为什么
作者:
快乐眼泪
时间:
2023-2-28 20:12
已收藏备用,谢谢!
作者:
wkman
时间:
2023-3-1 16:28
ws2812的灯珠,就是块头大了点,
其它都还好
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1