1. 程式人生 > >STC15微控制器驅動WS2812

STC15微控制器驅動WS2812

今夜無眠,寫此部落格吐舌頭

我們先來看時序圖!


#include <STC15F2K60S2.H>
#include "intrins.h"

sbit WS2812 = P1^7;

#define numLEDs 8   //燈的個數
unsigned char buf_R[numLEDs] = {0};//顏色快取
unsigned char buf_G[numLEDs] = {0};
unsigned char buf_B[numLEDs] = {0};

void RGB_Set_Up();  //送0碼
void RGB_Set_Down(); //送1碼



void HAL_Delay(unsigned int t)
{
		unsigned int x,y;
	  for(x=114;x>0;x--)
	  for(y=t;y>0;y--);
}


	 
//復位延時
void Delay50us()		//@22.1184MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 2;
	j = 15;
	do
	{
		while (--j);
	} while (--i);
}


//1碼,高電平850ns 低電平400ns 誤差正負150ns
void RGB_Set_Up()
{
		WS2812 = 1;
	  //經過邏輯分析儀除錯的的延時
		_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
	  _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); 
		WS2812 = 0;
}

//1碼,高電平400ns 低電平850ns 誤差正負150ns
void RGB_Set_Down()
{
		WS2812 = 1;
	  //經過邏輯分析儀除錯的的延時
		_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();  
		WS2812 = 0;
}

//傳送24位資料
void Send_2811_24bits(unsigned char G8,unsigned char R8,unsigned char B8)
{
	  
	  unsigned int n = 0;
	  //傳送G8位
		for(n=0;n<8;n++)
		{
			G8<<=n;
			if(G8&0x80 == 0x80)
			{
				RGB_Set_Up();
			}
			else  
			{
			  RGB_Set_Down();
			}
		}
		//傳送R8位
		for(n=0;n<8;n++)
		{
			R8<<=n;
			if(R8&0x80 == 0x80)
			{
				RGB_Set_Up();
			}
			else  
			{
				RGB_Set_Down();
			}
			
		}
		//傳送B8位
	  for(n=0;n<8;n++)
		{
			B8<<=n;
			if(B8&0x80 == 0x80)
			{
				RGB_Set_Up();
			}
			else  
			{
			  RGB_Set_Down();
			}
		}
}
//復位碼
void RGB_Rst()
{
		WS2812 = 0;
		Delay50us();
}
//把24位資料GRB碼轉RGB
void Set_Colour(unsigned char r,unsigned char g,unsigned char b)
{
	  unsigned char i;
		for(i=0;i<numLEDs;i++)
	  {
				buf_R[i] = r; //緩衝
			  buf_G[i] = g;
			  buf_B[i] = b;
		}
		for(i=0;i<numLEDs;i++)
		{
			Send_2811_24bits(buf_G[i],buf_R[i],buf_B[i]);//傳送顯示
		}
}
//某一個點顯示的顏色
void SetPointColour(unsigned int num,unsigned char r,unsigned char g,unsigned char b)
{
	  unsigned char i;
		for(i=0;i<numLEDs;i++)
	  {
				buf_R[num] = r;//緩衝
			  buf_G[num] = g;
			  buf_B[num] = b;
		}
		for(i=0;i<numLEDs;i++)
		{
			Send_2811_24bits(buf_G[i],buf_R[i],buf_B[i]);//傳送顯示
		}
}

//顏色交換24位不拆分發
void SetPixelColor(unsigned char num,unsigned long c)
{
	  unsigned char i;
		for(i=0;i<numLEDs;i++)
	  {
				buf_R[num] = (unsigned char)(c>>16);
			  buf_G[num] = (unsigned char)(c>>8);
			  buf_B[num] = (unsigned char)(c);
		}
		for(i=0;i<numLEDs;i++)
		{
			Send_2811_24bits(buf_G[i],buf_R[i],buf_B[i]);
		}
}

//復位
void PixelUpdate()
{
	RGB_Rst();
}
//顏色
unsigned long Color(unsigned char r, unsigned char g, unsigned char b)
{
  return ((unsigned long)r << 16) | ((unsigned long)g <<  8) | b;
}

//顏色演算法
unsigned long Wheel(unsigned char WheelPos)
{
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) 
	{
    return Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

//彩虹
void rainbow(unsigned int wait)
{
  unsigned int i, j;

  for(j=0; j<256; j++) 
	{
    for(i=0; i<numLEDs; i++)
		{
      SetPixelColor(i, Wheel((i+j) & 255));
    }
		PixelUpdate();
    HAL_Delay(wait);
  }
}

//稍微不同的是,這使得彩虹均勻分佈
void rainbowCycle(unsigned int wait) 
{
  unsigned int i, j;

  for(j=0;j<256*5;j++) 
	{ // 5 cycles of all colors on wheel  車輪上所有顏色的5個迴圈
    for(i=0;i<numLEDs;i++) 
	 {
     SetPixelColor(i, Wheel(((i * 256 / numLEDs) + j) & 255));
    }
	  PixelUpdate();
    HAL_Delay (wait);
  }
}

//Theatre-style crawling lights.呼吸燈
void theaterChase(unsigned long c, unsigned int wait) 
{
	int j,q;
	unsigned int i;
  for (j=0; j<10; j++) 
	{  //do 10 cycles of chasing  做10個迴圈
    for (q=0; q < 3; q++) 
		{
      for (i=0; i<numLEDs; i=i+3)
			{
        SetPixelColor(i+q, c);    //turn every third pixel on  把每一個第三個畫素
      }
			PixelUpdate();
      HAL_Delay(wait);

      for (i=0; i<numLEDs; i=i+3) 
			{
       SetPixelColor(i+q, 0);        //turn every third pixel off   把每一個第三個畫素關掉
      }
			PixelUpdate();
    }
  }
}

//Theatre-style crawling lights with rainbow effect
//帶有彩虹效果的戲劇式爬行燈
void theaterChaseRainbow(unsigned int wait) 
{
	int j,q;
	unsigned int i;
  for (j=0; j < 256; j++) 
	{     // cycle all 256 colors in the wheel 在輪子上迴圈所有256色
    for (q=0; q < 3; q++)
		{
      for (i=0; i < numLEDs; i=i+3) 
			{
        SetPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel off 把每一個第三個畫素
      }
      PixelUpdate();

      HAL_Delay(wait);

      for (i=0; i < numLEDs; i=i+3)
			{
        SetPixelColor(i+q, 0);        //turn every third pixel off  把每一個第三個畫素關掉
      }
    }
  }
}

// Fill the dots one after the other with a color
//用一種顏色填充這些圓點
void colorWipe(unsigned long c, unsigned int wait) 
{
	unsigned int i=0;
  for( i=0; i<numLEDs; i++) 
	{
    SetPixelColor(i, c);
    PixelUpdate();
    HAL_Delay(wait);
  }
}

void main()
{
	  
		while(1)
		{
			  rainbow(45);
        rainbowCycle(40);
        theaterChase(Color(0,0,255),80); // Blue
			  theaterChase(Color(0,255,0),80); // Blue
			  theaterChase(Color(255,0,0),80); // Blue
    		theaterChaseRainbow(40);
				colorWipe(255,255);
		}
}
以上是全部程式碼




相關推薦

STC15微控制器驅動WS2812

今夜無眠,寫此部落格! 我們先來看時序圖! #include <STC15F2K60S2.H> #include "intrins.h" sbit WS2812 = P1^7; #define numLEDs 8 //燈的個數 unsigned ch

STC15微控制器使用HC-SR04超聲波測距模組

目錄 【HC-SR04】 基本工作原理 時序圖 【程式】 【HC-SR04】 HC-HR04超聲波測距可提供2cm-400cm的非接觸式距離感測功能,測距精度可達3mm。 基本工作原理 1、採用IO口TRIG觸發測距,給最少10us的高電平信呈。 2、模組

【程式】STM32F407VE微控制器驅動Marvell 88W8801 WiFi模組的程式(20181010版)

本程式所用的微控制器型號為:STM32F407VE PD14埠為復位引腳(PDN),請務必連線! 晶振用的是8MHz,請注意檢查自己的開發板,看看晶振是不是8MHz。如果是25MHz,請修改system_stm32f4xx.c檔案! 程式支援連線無密碼的熱點以及WEP、

微控制器驅動段式液晶屏

//************************Initialization function defined here*********************** void initialization(void) { // Declare your local variables here // C

51微控制器驅動HC-SR04超聲波測距模組(LED1602顯示結果)

HC-SR04超聲波測距模組的使用時非常廣泛的,而且驅動它的微控制器也有很多。在這裡我主要說一下51微控制器的程式碼。 51微控制器雖然簡單,但是實際操作起來也會碰到很多問題: 1.ECHO返回的電平用什麼方式去判斷 2.20us的演示函式怎麼編寫 3.距離怎麼用自己的方法

51微控制器驅動1602液晶顯示器的小例子

首先附上1602的相關資料: 引腳功能: 1602採用標準的16腳介面,其中: 第1腳:VSS為電源地 第2腳:VCC接5V電源正極 第3腳:V0為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會 產生“鬼影”,使用時可以通過一個10K的電

51微控制器驅動無源蜂鳴器

在學習過程中遇到如下例題:8個發光管由上至下間隔1s流動,其中每個管亮500ms,滅500ms,亮時蜂鳴器響,滅時關閉蜂鳴器,一直重複下去。 流水燈的程式相對我個人來說比較簡單,但是蜂鳴器有些難度,正常給I/0口一個訊號,蜂鳴器既然不響,後經查證是無源蜂鳴器; 無源

nrf51822微控制器驅動ESP8266模組中遇到的問題總結

作者:李大闖    2017/08/26 18:01 在實際工作中,原本是使用nrf51822作為核心mcu,但是由於大批量資料傳輸的需要,所以外掛了一個ESP8266的模組,用於批量資料傳輸。本篇文章總結了在使用nrf51822微控制器驅動ESP8266模組時遇到的一些問

基於STC15微控制器,ATK-AS608,LCD12864的指紋識別系統

自己做的指紋識別小模組,自己畫的板子,經測試已經可以正常執行,在這裡記錄一下,並且給大家開源共享一下~~~ 也參考了很多資料以及程式,謝謝。另外如果大家發現什麼問題還請多多討論~~~ 1. 準備工作 微控制器型號:IAP15W4K58S4,STC15系列的也可以替換。

STM32用PWM +DMA驅動 WS2812

參考的程式碼: ------------------------------------WS2812B.c------------------------------------ #include "WS2812B.h" /* Buffer that holds one

微控制器驅動能力

在微控制器中﹐I/O能夠驅動8個TTL﹐或能驅動4個TTL 一般晶片都允許帶多個負載,但是到底能帶幾個呢?每種晶片輸入都不同。因此、業內就按能帶幾個標準TTL負載來說明此晶片的負載能力。一般的標準TTL低電平吸入電流Iilmax是-3.2mA。如果I/O口的驅動能力能帶4個標準TTL負載,那就說

51微控制器入門_使用keil新建工程以及串列埠驅動下載和程式燒寫教程

        51微控制器是很簡單的一款微控制器,適合於新手的入門學習,但是也只能作為初學者繼續往上學習的一個墊腳石。這篇部落格我主要的目的是寫給我們學校社團的萌新閱覽的,方便他們入門51,繼續堅持學習下去。假如你有一個51微控

滿足LED驅動微控制器晶片低功耗需求

隨著大家環保意識的增強,在購買LED燈時更注重能耗問題。LED能耗問題可以通過低功耗的LED驅動微控制器晶片來實現。LED燈泡能耗遠低於傳統白熾燈泡,被廣泛應用在日常生活中。 光對我們的心情和健康有著重要影響。如果家中照明效果恰到好處如,不僅能為實際工作照明,更能讓人感覺舒適。無論室外天

WS2812燈珠(二)-- STM32 SPI+DMA方式驅動

    通過硬體SPI的可以很巧妙的模擬出WS2812的通訊時序,用spi的8位資料模擬ws281x的一位資料。 要將系統時鐘設定為56M,SPI分頻數設定為8,則SPI的通訊頻率為7M,1s/7M≈143ns 即傳輸一位資料的時間約為143納秒(ns)  3*14

WS2812燈珠(一)-- STM32 普通IO方式驅動

      相信大家在看到這篇文章的時候一定對WS2812晶片的時序有了一定的瞭解,這裡對於WS2812硬體通訊方面就不做過多的介紹了。驅動WS2812需要的實現納秒級別的電平翻轉,像一般主頻較低的MCU很難實現這種級別的電平翻轉。我在這裡使用的MCU是STM32F10

微控制器高階裸機程式設計(一)-- 資料驅動程式

我理解的所謂資料驅動程式的方法,簡單而言:將資料與程式分析,將程式碼邏輯的組織轉換成數字規律的統計。即將資料作為一個要處理的指令碼(當做資料庫),然後程式作為直譯器,將指令碼的內容用程式碼邏輯解釋出來,實現程式設計功能。 這就要求我們將程式碼邏輯分解出其內在資料關係,這樣我們就可以寫出與資料

STM32微控制器硬體I2C驅動程式(查詢方式)

本文章原始地址:http://feotech.com/?p=69 本程式主要用於驅動STM32微控制器晶片的硬體I2C暫存器,實現通過使用晶片自帶的I2C暫存器進行資料的傳送與接收. 本例程中採用I2C暫存器查詢的方式來實現資料傳輸,當I2C對應暫存器指定狀態時方可執行下一步操作.

STM32微控制器硬體I2C驅動程式(軟體輪詢方式)---摘自:FeoTech

感謝原作者:FeoTech   原文網址:http://feotech.com/?p=69 本程式主要用於驅動STM32微控制器晶片的硬體I2C暫存器,實現通過使用晶片自帶的I2C暫存器進行資料的傳送與接收. 本例程中採用I2C暫存器查詢的方式來實現資料傳輸,當I2C對應

微控制器中使用三極體驅動蜂鳴器

【背景知識】 NPN型三極體,由三塊半導體構成,其中兩塊N型和一塊P型半導體組成,P型半導體在中間,兩塊N型半導體在兩側。PNP型三極體,是由兩塊P型半導體中間夾著一塊N型半導體所組成的三極體,所以稱為PNP型三極體。也可以描述成,電流從發射極E流入的三極體。三極體最主要的功能就是電流放大和

51微控制器基於74HC595級聯驅動16X16LED點陣

電路圖:   原理:   首先Protues基礎庫件裡是沒有16X16的點陣的,需要從網上下載或者是自己DIY出來一個,我就是對著百度DIY出來的,建議大家有條件的話也嘗試DIY一下,增強對點陣電路的瞭解。不想DIY的話就去下載吧,有時間我會把這套電路圖和16x16設計的電路圖放上來。