注意:采用1T 51单片机 晶振采用24M
内部有注释,WS2812灯带采用单IO口驱动 此处不附带原理图
单片机源程序如下:
- /********************************************************/
- /*作 者:Dyingstraw
- /*版 本:V1.0
- /*程序功能:用51单片机控制ws2812 RGB输出,显示全色彩
- /*备 注:51单片机晶振24M
- /********************************************************/
-
- #include<STC12C5A60S2.h>
- #include<intrins.h> //写入头文件
- #define uchar unsigned char
- sbit Send_Dat=P3^7; //数据输出,接IN脚
- sbit key3=P2^1;
- sbit key2=P2^4;
- sbit key1=P2^7;
- uchar show[720]; // 8*3*30
- uchar color[30][3]={
- 0xff,0x01,0x00, //0
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00, //10
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00, //20
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00,
- 0xff,0x01,0x00, //29
-
- }; //G R B
- uchar code GRB[7][3]={
- 0XFF,0X00,0X00,//绿
- 0XFF,0XFF,0X00,//黄
- 0X00,0XFF,0X00,//红
- 0X00,0XFF,0XFF,//品红
- 0X00,0X00,0XFF,//蓝
- 0XFF,0X00,0XFF,//青
- 0XFF,0XFF,0XFF,//白
- };
- void delay();
- void delays();
-
- /*写入数据时序*/
- void Send_A_bit(uchar VAL)
- {
- if (VAL==1)
- {
-
- Send_Dat=1;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();
-
- Send_Dat=0;
- _nop_();_nop_();
- }
- else
- {
- Send_Dat=1;
- _nop_();_nop_();_nop_();_nop_();
-
- Send_Dat=0;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- }
-
- }
- void SendAllData()
- {
- unsigned int i;
- for(i=0;i<720;i++)
- Send_A_bit(show[i]);
-
- }
- void WriteData()
- {
- unsigned char i,j;
- for(i=0;i<30;i++)
- {
- for(j=0;j<3;j++)
- {
- show[24*i+8*j+0]=color[i][j]/128%2;
- show[24*i+8*j+1]=color[i][j]/64%2;
- show[24*i+8*j+2]=color[i][j]/32%2;
- show[24*i+8*j+3]=color[i][j]/16%2;
- show[24*i+8*j+4]=color[i][j]/8%2;
- show[24*i+8*j+5]=color[i][j]/4%2;
- show[24*i+8*j+6]=color[i][j]/2%2;
- show[24*i+8*j+7]=color[i][j]%2;
- }
- }
- }
- void change1(unsigned char k)
- {
- unsigned char i,j;
- for(i=0;i<30;i++)
- {
- for(j=0;j<3;j++)
- color[i][j]=GRB[k][j];
-
- }
-
- }
-
- void change2()
- {
- unsigned char i;
- for(i=0;i<30;i++)
- {
- if(color[i][0]>0&&color[i][2]==0)
- {
- color[i][0]--;color[i][1]++;
- }
- if(color[i][1]>0&&color[i][0]==0)
- {
- color[i][1]--;color[i][2]++;
- }
- if(color[i][2]>0&&color[i][1]==0)
- {
- color[i][2]--;color[i][0]++;
- }
- }
- }
-
- /*主函数*/
- unsigned char main()
- {
-
- uchar k=0;
- P2=0XFF;
- change1(0);
- while(1)
- {
- change1(k);
- Send_Dat=0;
- WriteData();SendAllData();
- Send_Dat=0;
- delays();
- k++;if(k>=7)k=0;
- if(key1==0) return 0;
- if(key2==0)
- {
- change1(0);
- while(key3==1)
- {
- change2();
-
-
- Send_Dat=0;
- WriteData();SendAllData();
- Send_Dat=0; //发送数据
-
-
- }
- }
- }
- }
-
-
-
-
-
- /*小延时函数*/
- /*大概1S吧,随便写的*/
- void delay() //100ms
- {
- unsigned char i, j, k;
- i = 10;
- j = 31;
- // k = 147;
- k=14;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
-
-
- /*大延时函数*/
- /*十几秒*/
- void delays()
- {
- delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
- delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
- delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
- }
复制代码
所有资料51hei提供下载:
跑马灯.zip
(42.81 KB, 下载次数: 252)
|