久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1834|回復: 0
打印 上一主題 下一主題
收起左側

STC15F104W 51單片機同系列芯片驅動WS2812彩燈程序

[復制鏈接]
跳轉到指定樓層
樓主
使用的芯片為STC15F104W同系列的IRC15F107W,只有該型號的芯片能驅動WS2812的RGB彩燈!
因為該型號的芯片使用內置24Mhz時鐘,而WS2812的時序要求精確到ns級別,于是對時鐘的最低要求就是24Mhz
而且IRC15F107W同STC15F104W,只有8個引腳的簡單封裝,并且內部自帶震蕩源無須外部晶振,插上電直接就能用
最重要的是和其它C51單片機通用頭文件,所以引用的時候只需要包含reg52.h文件即可!
所以該單片機非常適合新手入門,即便是小白看了也能學會!
/*
IRC15F107W 管腳(默認內部震蕩源24Mhz)
1 P3.4
2 VCC  3.8--5.5V
3 P3.5
4 GND
5 P3.0 接燒錄器的TXD
6 P3.1 接燒錄器的RXD
7 P3.2
8 P3.3
*/

然后是代碼部分,我用的雙色流水燈做的范例
  1. #include "reg52.h"
  2. #include "intrins.h"
  3. #define WS2812_NUM 60  //燈的數量
  4. sbit Led_Pin = P3^0;    //控制燈的引腳
  5. unsigned short G_0=191;//流水燈第一個顏色定義
  6. unsigned short R_0=98;
  7. unsigned short B_0=10;
  8. unsigned short G_1=11;//流水燈第二個顏色定義
  9. unsigned short B_1=45;
  10. unsigned short R_1=14;
復制代碼
然后就是用STC燒錄軟件自帶的延時計算器一鍵推出的延遲函數
  1. void delay_ms(unsigned int ms)        //@24.000MHz
  2. {
  3.         unsigned char data i, j;
  4.   while(ms--){
  5.         _nop_();
  6.         i = 24;
  7.         j = 85;
  8.         do
  9.         {
  10.                 while (--j);
  11.         } while (--i);
  12. }
  13. }
  14. void Delay75us(void)        //@24.000MHz
  15. {
  16.         unsigned char data i, j;

  17.         i = 2;
  18.         j = 189;
  19.         do
  20.         {
  21.                 while (--j);
  22.         } while (--i);
  23. }
復制代碼
然后是WS2812寫入0和1的程序
  1. void ws2812_writebit1(void){
  2. Led_Pin=1;
  3. _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  4. _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  5.         Led_Pin=!Led_Pin;
  6. //_nop_();_nop_();_nop_();
  7. }

  8. void ws2812_writebit0(void){
  9. Led_Pin=1;
  10. _nop_();_nop_();_nop_();_nop_();_nop_();
  11. Led_Pin=!Led_Pin;
  12. _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  13. _nop_();_nop_();_nop_();_nop_();
  14. }
復制代碼
然后是寫入單個顏色和總體顏色的程序
  1. void ws2812_writecolor(unsigned short dat){
  2. //由于STC8G1K08執行左移或者右移等移位操作耗時太久(2us,無符號短整型都這樣),導致時序嚴重落后,所以用原始的if-else代碼進行代替
  3.         if(dat&0x80)
  4.   ws2812_writebit1();
  5. else
  6.   ws2812_writebit0();
  7. if(dat&0x40)
  8.          ws2812_writebit1();
  9. else
  10.   ws2812_writebit0();
  11. if(dat&0x20)
  12.          ws2812_writebit1();
  13. else
  14.   ws2812_writebit0();
  15. if(dat&0x10)
  16.          ws2812_writebit1();
  17. else
  18.   ws2812_writebit0();
  19. if(dat&0x08)
  20.          ws2812_writebit1();
  21. else
  22.   ws2812_writebit0();
  23. if(dat&0x04)
  24.          ws2812_writebit1();
  25. else
  26.   ws2812_writebit0();
  27. if(dat&0x02)
  28.          ws2812_writebit1();
  29. else
  30.   ws2812_writebit0();
  31. if(dat&0x01)
  32.          ws2812_writebit1();
  33. else
  34.   ws2812_writebit0();
  35. }
  36. void ws2812_writeled(unsigned short green,unsigned short red,unsigned short blue){
  37. ws2812_writecolor(green);
  38. ws2812_writecolor(red);
  39. ws2812_writecolor(blue);
  40. }        
復制代碼
然后是WS2812執行到最后一顆燈用的結尾程序,以及清屏程序
  1. void ws2812_rest()
  2. {
  3.         Led_Pin=0;
  4.         
  5.         Delay75us();
  6. }
  7. void ws2812_clear()
  8. {
  9.         static int j=0;
  10.         for(j=0;j<WS2812_NUM;j++)
  11.         {
  12.                 ws2812_writeled(0,0,0);
  13.         }
  14.         ws2812_rest();
  15.         ws2812_rest();
  16.         ws2812_rest();
  17. }
復制代碼
流水燈主程序
  1. void WS2812_DIS()
  2. {
  3.         static int j=0;
  4.         int i;

  5.         j%=WS2812_NUM;
  6.         j++;

  7.         for(i=0;i<WS2812_NUM;i++)
  8.         {
  9.                 if(i>j&&(i<j+10))
  10.                 {
  11.                         ws2812_writeled(G_0,R_0,B_0);
  12.                 }
  13.                 else
  14.                 {
  15.                         ws2812_writeled(G_1,R_1,B_1);
  16.                         
  17.                 }
  18.         }
  19.         
  20. }

  21. void main(void)
  22. {
  23.         ws2812_clear();
  24.         while(1)
  25.   {
  26.                 WS2812_DIS();
  27.                 delay_ms(50);
  28.         }
  29. }
復制代碼

希望大家能學到東西!完整代碼在壓縮包里!

20181222194755537.png (69.11 KB, 下載次數: 126)

WS2812時序圖

WS2812時序圖

STC15F104_WS2812.rar

24.59 KB, 下載次數: 46, 下載積分: 黑幣 -5

代碼本體

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频手机在线 | 欧美一区二区小视频 | 欧美一区二区成人 | 日日干夜夜操 | 欧美精品一区二区三区蜜臀 | 日韩精品一区二区三区视频播放 | 久久999 | av一级一片| 日日碰狠狠躁久久躁96avv | 伊人婷婷 | 亚洲精品不卡 | 天堂在线免费视频 | 亚洲精品18 | 精品日本久久久久久久久久 | 日韩一区二区在线免费观看 | 久久久999成人 | 国产成人jvid在线播放 | 国产一区二区在线免费视频 | 中文视频在线 | 亚洲国产精品一区 | 国产亚洲精品久久久优势 | 欧美视频1区 | 亚洲人成网亚洲欧洲无码 | 欧美极品视频在线观看 | 中文字幕1区| 少妇特黄a一区二区三区88av | www.se91| 精品一区二区三区在线观看 | 国产精品永久免费 | 亚洲日本视频 | 91精品国产色综合久久 | 一区二区三区四区在线视频 | 久久中文字幕一区 | 一级做a爰片久久毛片免费看 | 国产乱码精品一区二区三区五月婷 | 欧美日韩国产一区二区三区不卡 | 亚洲视频www | 伊人伊人伊人 | 韩国理论电影在线 | 在线第一页 | 国产原创视频 |