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設計的電路圖放上來。