注意:采用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, 下載次數: 253)
2019-4-17 17:13 上傳
點擊文件名下載附件
|