标题:
想用单片机延时方式做一个WS2811流水灯,如何修改程序
[打印本页]
作者:
丸子田
时间:
2020-7-18 15:33
标题:
想用单片机延时方式做一个WS2811流水灯,如何修改程序
如题,用80c51通过延时的方式
驱动WS2811灯带,想做成流水灯的效果,灯带的基础程序如下
#include <reg51.h>
#include <intrins.h>
#define nop _nop_()
#define unchar unsigned char
#define unint unsigned int
#define size 20
sbit Din = P2^2;
unchar bdata LED_DAT;
sbit bit0=LED_DAT^0;
sbit bit1=LED_DAT^1;
sbit bit2=LED_DAT^2;
sbit bit3=LED_DAT^3;
sbit bit4=LED_DAT^4;
sbit bit5=LED_DAT^5;
sbit bit6=LED_DAT^6;
sbit bit7=LED_DAT^7;
unchar RR,GG,BB;
unint t;
unint Mod;
void delay(unint z)
{
unchar a,b;
while(z--)
for(b = 0;b<=118;b++)
for(a = 0;a<=18;a++)
;
}
void h_dat0()
{
Din = 1;nop;
Din = 0;nop;nop; nop;
}
void h_dat1()
{
Din = 1;nop;nop;nop;
Din = 0;nop;
}
void Reset(void)
{
Din = 0;
delay(1);
}
void SendData()
{
LED_DAT = GG;
if(bit0 == 1) {h_dat1();} else {h_dat0();}
if(bit1 == 1) {h_dat1();} else {h_dat0();}
if(bit2 == 1) {h_dat1();} else {h_dat0();}
if(bit3 == 1) {h_dat1();} else {h_dat0();}
if(bit4 == 1) {h_dat1();} else {h_dat0();}
if(bit5 == 1) {h_dat1();} else {h_dat0();}
if(bit6 == 1) {h_dat1();} else {h_dat0();}
if(bit7 == 1) {h_dat1();} else {h_dat0();}
LED_DAT = RR;
if(bit0 == 1) {h_dat1();} else {h_dat0();}
if(bit1 == 1) {h_dat1();} else {h_dat0();}
if(bit2 == 1) {h_dat1();} else {h_dat0();}
if(bit3 == 1) {h_dat1();} else {h_dat0();}
if(bit4 == 1) {h_dat1();} else {h_dat0();}
if(bit5 == 1) {h_dat1();} else {h_dat0();}
if(bit6 == 1) {h_dat1();} else {h_dat0();}
if(bit7 == 1) {h_dat1();} else {h_dat0();}
LED_DAT = BB;
if(bit0 == 1) {h_dat1();} else {h_dat0();}
if(bit1 == 1) {h_dat1();} else {h_dat0();}
if(bit2 == 1) {h_dat1();} else {h_dat0();}
if(bit3 == 1) {h_dat1();} else {h_dat0();}
if(bit4 == 1) {h_dat1();} else {h_dat0();}
if(bit5 == 1) {h_dat1();} else {h_dat0();}
if(bit6 == 1) {h_dat1();} else {h_dat0();}
if(bit7 == 1) {h_dat1();} else {h_dat0();}
}
void send_string_data()
{
unchar i;
for (i= 0;i<size;i++)
{
SendData();
}
Reset();
}
void main()
{
while(1)
}
复制代码
作者:
wwh2382
时间:
2020-7-19 14:29
这个是修改过的程序吧,主循环都是空的。发原程序上来看看,才好帮你改。
作者:
15951917887
时间:
2020-7-19 14:55
while(1)里边的程序都没有调用,不会执行你编写的子函数
作者:
lovexulu
时间:
2020-7-19 17:45
80C51貌似驱动不了吧,周期太长。
作者:
就你****
时间:
2020-7-19 17:59
80C51不行,周期长,用宏晶,20M晶振可以玩一下
作者:
lyxing
时间:
2020-7-19 21:04
用STC15F104W玩过, 内部时间频率:33.1176Mh,定时中断方式。
作者:
丸子田
时间:
2020-7-20 09:20
lyxing 发表于 2020-7-19 21:04
用STC15F104W玩过, 内部时间频率:33.1176Mh,定时中断方式。
大佬能给个代码看看吗,我这种写法不知道怎么才能让灯珠自己动并且变色,只能做成一起变色一起灭灯
作者:
wwh2382
时间:
2020-7-21 08:26
你的问题应该找卖家,卖家都会炫耀自家的灯带能这样那样的花式亮灯,你的却不行,第一时间就是找卖家
作者:
MTG51
时间:
2021-3-25 15:02
很好,很实用的资料,学习了
作者:
zhai1995
时间:
2021-3-27 17:13
建议SPI 加DMA控制。
作者:
dzbj
时间:
2021-3-27 23:22
80C51不行 也不是必须33M或者20M频率 11.0592肯定行 实测的 但至少得1T的单片机 不然就如楼上各位说的 通讯时间搞不定 我当时用的204s片子 11.0592的频率 推了70多个灯
作者:
mengzhixinheng
时间:
2021-3-28 06:33
8m晶振,振荡频率125ns就可以了,这个协议的容错率很高的,好像是+-130吧
作者:
lwh999995
时间:
2021-3-28 13:22
至少用STC的1T单片机才能胜任。
12T的单片机也只能死撑,没必要这么干。
作者:
512-DZ
时间:
2021-7-6 09:06
错误,编译不了
作者:
lkc8210
时间:
2021-7-7 09:21
512-DZ 发表于 2021-7-6 09:06
错误,编译不了
while(1)少了一个分号";"而已
SendData可以改成这样:
void SendData()
{
char i,j;
char LED_DATA[3];
LED_DATA[0] = GG;
LED_DATA[1] = RR;
LED_DATA[2] = BB;
for(i = 0;i<3;i++){
for(j = 0;j<8;j++){
if(LED_DATA[i] & 0x01){h_dat1();} else {h_dat0();}
LED_DATA[i]>>=1;
}
}
}
复制代码
作者:
liqiangcom
时间:
2022-5-29 23:17
挺好,正好有两款跑飞了的程序
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1