控制 1903 或 WS2811 芯片,我参照别人的写的,怎么都控制不了灯,晶振 12M 24M都试过了,新手搞不明白怎么回事
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DIN=P1^2;//输出信号端口
void Delay50us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 1;
j = 134;
do
{
while (--j);
} while (--i);
}
void delay (uint z)//延时函数1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void DIN_bit_0()//发送0码函数
{
DIN=1;
_nop_();_nop_();
DIN=0;
_nop_();_nop_();_nop_();
}
void DIN_bit_1()//1码
{
DIN=1;
_nop_();_nop_();_nop_();
DIN = 0;
_nop_();_nop_();
}
/*************reset码*******************/
void reset()//reset码 低电平时间要大于30us
{
DIN=0;
Delay50us();//延时50us
}
void write_data(unsigned long dat)//写码
{
uchar i;
for (i = 8; i>0;i--)//发送8位码
{
if (dat & 0x80)
{
DIN_bit_1();
}
else //否则传输位 0
{
DIN_bit_0();
}
dat = dat << 1;
}
}
void main(void)//主函数,控制红光的亮灭
{
uchar i,n;
while (1)
{
for(i=0;i<255;i++)//255是光的灰度,0-255,255时最亮
{
for(n = 20;n>0;n--)//20颗灯
{
write_data(i);//红光8位码
write_data(0);//绿光8位码
write_data(0);//蓝光8位码
}
reset();
delay(3000);
}
}
}
#include<reg52.h>//头文件
#include <intrins.h>//头文件
#define uchar unsigned char
#define uint unsigned int
sbit DIN=P1^2;//输出信号端口
void Delay50us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 1;
j = 134;
do
{
while (--j);
} while (--i);
}
void delay (uint z)//延时函数1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void DIN_bit_0()//发送0码函数
{
DIN=1;//0码高电平
_nop_();_nop_();//0码高电平时间空指令 0.5us
DIN=0;//0码低电平
_nop_();_nop_();_nop_();//0码低电平时间空指令 1us
}
void DIN_bit_1()//1码
{
DIN=1;//1码高电平
_nop_();_nop_();_nop_();//1码高电平时间空指令 1us
DIN = 0;//1码低电平
_nop_();_nop_();//0码低电平时间空指令 0.5us
}
/*************reset码*******************/
void reset()//reset码 低电平时间要大于30us
{
DIN=0;
Delay50us();//延时50us
}
void write_data(unsigned long dat)//写8位 控制码
{
uchar i;
for (i = 8; i>0;i--)//发送8位码
{
if (dat & 0x80) // 传输位1 dat与 1000000为1的话 传送1码
{
DIN_bit_1();
}
else //否则传输位 0
{
DIN_bit_0();
}
dat = dat << 1;//一位一位传
}
}
void main(void)//主函数,控制红光的亮灭
{
uchar i,n;
while (1)
{
for(i=0;i<255;i++)//255是光的灰度,0-255,255时最亮
{
for(n = 20;n>0;n--)//20颗灯
{
write_data(i);//红光8位码
write_data(0);//绿光8位码
write_data(0);//蓝光8位码
}
reset();//发完24位码 发 reset码
delay(3000);//延时3秒,红光慢慢亮 慢慢灭
}
}
}
|