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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8單片機+DS3231+WS2812做的全彩RGB掛鐘程序原理圖資料

  [復制鏈接]
跳轉到指定樓層
樓主
A、紅色常亮表示時針,綠色慢呼吸燈表示分針、藍色每秒走一燈。
B、長按Set鍵開始調時,短按Set選擇時、分、秒,再長按Set退出。紅色快閃是調時針、綠色快閃是調分針、藍色快閃是調秒針
C、短按+鍵 時間增進、短按-鍵 時間減回。
D、短按LED鍵,調整背景色 紅、綠、藍、黃、青、紫
F、可以自己編寫其他WS2812相關程序,如流水燈、流星燈效果
源代碼的文件太多了 所以用壓縮包形式提供
制作出來的實物圖如下:


電路原理圖如下:


單片機源程序如下:
  1. //時鐘程序,2020年9月,汪祁緒原創。
  2. //店鋪:祁緒電子
  3. #include "all.h"
  4. u8 xdata Set_Mode=Set_Timer_OFF;                                        //設置時間狀態變量
  5. u8 xdata LED_Mode=Set_Back_OFF;                                                //設置背景狀態變量
  6. u8 xdata LD_hour=LED_LD;                                                        //默認最大128亮度
  7. u8 xdata LD_min=LED_LD;                                                                //默認最大128亮度
  8. u8 xdata LD_sec=LED_LD;                                                                //默認最大128亮度
  9. u8 xdata Back_R=0;                                                                        //背景亮度R
  10. u8 xdata Back_G=0;                                                                        //背景亮度G
  11. u8 xdata Back_B=0;                                                                        //背景亮度B

  12. //根據調整的時針、分針、秒針 分別讓R\G\B快速閃爍顯示(快速呼吸)
  13. void LED_PWM_Allot()
  14. {
  15.         static u8 xdata sec_count;
  16.         static bit PWM_Flag;
  17.         switch(Set_Mode)
  18.         {
  19.                 case Set_Timer_OFF         :                                                //默認狀態,直接顯示時間,分針是呼吸燈效果
  20.                 {
  21.                         sec_count++;
  22.                         if(sec_count==255)
  23.                         {
  24.                                 if(PWM_Flag==0)                                                //PWM增加
  25.                                 {
  26.                                         LD_min++;
  27.                                         if(LD_min>=LED_LD)                                //默認最大128亮度
  28.                                         {
  29.                                                 PWM_Flag=1;
  30.                                         }
  31.                                 }
  32.                                 if(PWM_Flag==1)                                                //PWM減少
  33.                                 {
  34.                                         LD_min--;
  35.                                         if(LD_min==0)
  36.                                         {
  37.                                                 PWM_Flag=0;
  38.                                         }
  39.                                 }
  40.                         }
  41.                         LD_hour=LED_LD;                                                        //時針保持最大亮度128
  42.                         LD_sec=LED_LD;                                                        //秒針保持最大亮度128
  43.                 }break;
  44.                
  45.                 case Set_Timer_hour :                                                //時針調整模式,時針快速閃爍
  46.                 {
  47.                         sec_count++;
  48.                         if(sec_count==255)
  49.                         {
  50.                                 if(PWM_Flag==0)                                                //PWM增加
  51.                                 {
  52.                                         LD_hour+=10;
  53.                                         if(LD_hour>=LED_LD)                                //默認最大128亮度
  54.                                         {
  55.                                                 PWM_Flag=1;
  56.                                         }
  57.                                 }
  58.                                 if(PWM_Flag==1)                                         //PWM減少
  59.                                 {
  60.                                         LD_hour-=10;
  61.                                         if(LD_hour<=10)
  62.                                         {
  63.                                                 PWM_Flag=0;
  64.                                         }
  65.                                 }
  66.                         }
  67.                         LD_min=LED_LD;                                                        //分針保持最大亮度128
  68.                         LD_sec=LED_LD;                                                        //秒針保持最大亮度128
  69.                 }break;
  70.                
  71.                 case Set_Timer_min :                                                //分針設置模式,分針快速閃爍
  72.                 {
  73.                         sec_count++;
  74.                         if(sec_count==255)
  75.                         {
  76.                                 if(PWM_Flag==0)                                                //PWM增加
  77.                                 {
  78.                                         LD_min+=10;
  79.                                         if(LD_min>=LED_LD)                                //默認最大128亮度
  80.                                         {
  81.                                                 PWM_Flag=1;
  82.                                         }
  83.                                 }
  84.                                 if(PWM_Flag==1)                                         //PWM減少
  85.                                 {
  86.                                         LD_min-=10;
  87.                                         if(LD_min<=10)
  88.                                         {
  89.                                                 PWM_Flag=0;
  90.                                         }
  91.                                 }
  92.                         }
  93.                         LD_hour=LED_LD;                                                        //時針保持最大亮度128
  94.                         LD_sec=LED_LD;                                                        //秒針保持最大亮度128
  95.                 }break;
  96.                
  97.                 case Set_Timer_sec :                                                //秒針設置模式、秒針快速閃爍
  98.                 {
  99.                         sec_count++;
  100.                         if(sec_count==255)
  101.                         {
  102.                                 if(PWM_Flag==0)                                                //PWM增加
  103.                                 {
  104.                                         LD_sec+=10;
  105.                                         if(LD_sec>=LED_LD)                                //默認最大128亮度
  106.                                         {
  107.                                                 PWM_Flag=1;
  108.                                         }
  109.                                 }
  110.                                 if(PWM_Flag==1)                                         //PWM減少
  111.                                 {
  112.                                         LD_sec-=10;
  113.                                         if(LD_sec<=10)
  114.                                         {
  115.                                                 PWM_Flag=0;
  116.                                         }
  117.                                 }
  118.                         }
  119.                         LD_hour=LED_LD;                                                        //時針保持最大亮度128                                                       
  120.                         LD_min=LED_LD;                                                        //分針保持最大亮度128
  121.                 }break;
  122.         }
  123. }

  124. //讓所以燈珠都使用背景值,然后讓時間決定那顆燈點亮
  125. void WS2812_Allot()
  126. {
  127.         u8 xdata WS2812_hour;
  128.         u8 xdata WS2812_min;
  129.         u8 xdata WS2812_sec;
  130.         static u8 data i;
  131.         i=i%180;
  132.         i++;
  133.         WS2812_Write_Buffer[i]=Back_R;                                        //先寫入背景色
  134.         WS2812_Write_Buffer[i+1]=Back_G;                                //先寫入背景色
  135.         WS2812_Write_Buffer[i+2]=Back_B;                                //先寫入背景色
  136.         i++;
  137.         i++;
  138.        
  139.         WS2812_hour=DS3231_Timer.hour;                                        //當前時間賦值給2812小時
  140.         WS2812_hour=WS2812_hour%12;                                                //24小時制轉換成12小時制
  141.         WS2812_hour--;                                                                        //先把小時減少1
  142.         if(WS2812_hour>24)                                                                //如果是0減去1=255,255大于24
  143.         {
  144.                 WS2812_hour=12;                                                                //說明當前時間是12點(也就是0點)因為WS2812是沒有0號燈,只有60號燈
  145.         }
  146.         else
  147.         {
  148.                 WS2812_hour++;                                                                //否則,增加1,保持當前小時
  149.         }
  150.         WS2812_Write_Buffer[(WS2812_hour)*15-2]=LD_hour;//一個小時是5個燈,每個燈三種顏色
  151.         WS2812_min=DS3231_Timer.min;                                                        //當前時間賦值給2812分鐘
  152.         WS2812_min=WS2812_min%60;                                                //最多60分鐘
  153.         WS2812_min--;                                                                        //先把分鐘減少1
  154.         if(WS2812_min>=240)                                                                //如果是0減去1=255,255大于250
  155.         {
  156.                 WS2812_min=60;                                                                //說明當前時間是60分(也就是0分)因為WS2812是沒有0號燈,只有60號燈
  157.         }
  158.         else
  159.         {
  160.                 WS2812_min++;                                                                //否則,增加1,保持當前分鐘
  161.         }
  162.         WS2812_Write_Buffer[(WS2812_min)*3-1]=LD_min;        //每個燈三種顏色
  163.         WS2812_sec=DS3231_Timer.sec;                                                        //當前時間賦值給2812分鐘
  164.         WS2812_sec=WS2812_sec%60;                                                //最多60秒
  165.         WS2812_sec--;                                                                        //先把秒減少1
  166.         if(WS2812_sec>=240)                                                                //如果是0減去1=255,255大于100
  167.         {
  168.                 WS2812_sec=60;                                                                //說明當前時間是60秒(也就是0秒)因為WS2812是沒有0號燈,只有60號燈
  169.         }
  170.         else
  171.         {
  172.                 WS2812_sec++;                                                                //否則,增加1,保持當前秒
  173.         }
  174.         WS2812_Write_Buffer[(WS2812_sec)*3]=LD_sec;                //每個燈三種顏色       
  175.        
  176.         WS2812_Display_Drive();                                                        //WS2812刷新顯示
  177. }

  178. // DS3231 數據分配
  179. void Calendar_allot()
  180. {
  181.         /*static u16 xdata count=0;
  182.         count++;
  183.         if(count==100)
  184.         {
  185.                 count=0;*/
  186.                 DS3231_Read_Time_Drive();
  187.                 Calendar_Modify_Timer_Ser();
  188.         //}
  189. }

  190. //按鍵掃描
  191. void ROTARY_Allot()
  192. {
  193.         KEY_Scan_Drive_Up();
  194.         KEY_Scan_Drive_Down();
  195.         KEY_Scan_Drive_Set();
  196.         KEY_Scan_Drive_LED();
  197. }

  198. //LED背景設置 PWM是1,黑、紅、綠、藍、黃、青、紫、白
  199. void LED_Back_Set()
  200. {
  201.         if(Key_Read_LED==1)                                               
  202.         {
  203.                 Key_Read_LED=0;                                                                                //按鍵清除歸位
  204.                 LED_Mode++;                                                                                        //狀態機加一次
  205.                 LED_Mode=LED_Mode%Set_Back_RGB;
  206.         }
  207.         switch(LED_Mode)
  208.         {
  209.                 case Set_Back_OFF:Back_R=0;Back_G=0;Back_B=0;break;
  210.                 case Set_Back_R  :Back_R=1;Back_G=0;Back_B=0;break;
  211.                 case Set_Back_G  :Back_R=0;Back_G=1;Back_B=0;break;
  212.                 case Set_Back_B  :Back_R=0;Back_G=0;Back_B=1;break;
  213.                 case Set_Back_RG :Back_R=1;Back_G=1;Back_B=0;break;
  214.                 case Set_Back_GB :Back_R=0;Back_G=1;Back_B=1;break;
  215.                 case Set_Back_BR :Back_R=1;Back_G=0;Back_B=1;break;
  216.                 case Set_Back_RGB:Back_R=1;Back_G=1;Back_B=1;break;
  217.         }
  218.         Uart1_Up_Num_Buffer[4]=LED_Mode%100%10;
  219. }//*/

  220. //主函數
  221. void main()
  222. {
  223.         WS2812_Init();
  224.         Key_Init();
  225.         IIC_Init();
  226.         Uart1_Init();
  227.         while(1)
  228.         {
  229.                 LED_PWM_Allot();
  230.                 WS2812_Allot();
  231.                 Calendar_allot();
  232.                 ROTARY_Allot();
  233.                 Uart1_Up_Data_Drive();
  234.                 LED_Back_Set();
  235.         }
  236. }
復制代碼
全部資料51hei下載地址:
WS2812全彩掛鐘 程序源碼 最簡單的RGB測試.zip (68.17 KB, 下載次數: 246)
WS2812全彩掛鐘 程序源碼 DS3231時鐘.zip (174.92 KB, 下載次數: 333)
WS2812全彩掛鐘 電路原理圖STC8G.pdf (73.69 KB, 下載次數: 196)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:78901 發表于 2021-1-7 23:35 | 只看該作者
謝謝分享,正好有一個60個轉盤的ws2811,仿制一個試試
回復

使用道具 舉報

板凳
ID:390416 發表于 2021-1-10 11:49 | 只看該作者
fsj5098 發表于 2021-1-7 23:35
謝謝分享,正好有一個60個轉盤的ws2811,仿制一個試試

嗯 記得IIC要上拉電阻
回復

使用道具 舉報

地板
ID:60656 發表于 2021-1-12 20:49 | 只看該作者
多謝分享 原理圖弄得漂亮
回復

使用道具 舉報

5#
ID:876085 發表于 2021-1-13 12:19 來自手機 | 只看該作者
你好,有編譯好的固件嗎?
回復

使用道具 舉報

6#
ID:876085 發表于 2021-1-13 14:43 來自手機 | 只看該作者
你好,有編譯好的固件嗎?
回復

使用道具 舉報

7#
ID:250631 發表于 2021-1-13 17:02 | 只看該作者
編譯通過。感謝樓主的無私分享
回復

使用道具 舉報

8#
ID:65956 發表于 2021-1-14 08:51 | 只看該作者
很牛,曾經也有這樣的想法,可是一時也條件作,如果你這個中間再加1個數碼顯示的時鐘,那就更完美了,就可作商業銷售了
回復

使用道具 舉報

9#
ID:872598 發表于 2021-1-17 19:33 | 只看該作者
建議在每個LED再加一條導光柱,這樣看起來更像一個時鐘。
回復

使用道具 舉報

10#
ID:91165 發表于 2021-1-20 16:16 | 只看該作者
劉工程 發表于 2021-1-17 19:33
建議在每個LED再加一條導光柱,這樣看起來更像一個時鐘。

不做批量的話,自己做導光柱困難吧
回復

使用道具 舉報

11#
ID:78901 發表于 2021-1-20 16:59 | 只看該作者
可以用15WK104單片機做嗎
回復

使用道具 舉報

12#
ID:390416 發表于 2021-1-20 17:00 | 只看該作者
aking991 發表于 2021-1-14 08:51
很牛,曾經也有這樣的想法,可是一時也條件作,如果你這個中間再加1個數碼顯示的時鐘,那就更完美了,就可 ...

現在有條件 可以做了啊 這個簡單點就用WS2812燈帶做
回復

使用道具 舉報

13#
ID:390416 發表于 2021-1-20 17:03 | 只看該作者
本帖最后由 人人學會單片機 于 2021-1-20 17:04 編輯
fsj5098 發表于 2021-1-20 16:59
可以用15WK104單片機做嗎

可以,修改一下WS2812的延遲,IIC總線必須外部上拉電阻就行。因為STC8G和STC8H 有內部上拉,所以原理圖沒有外部上拉。
回復

使用道具 舉報

14#
ID:3802 發表于 2021-6-22 15:10 | 只看該作者
謝謝分享,正好有一個60個轉盤的ws2811,仿制一個試試
回復

使用道具 舉報

15#
ID:59830 發表于 2022-1-19 21:22 | 只看該作者
也有一個WS2812 時鐘程序,60燈驅動. 參考學習一下.
回復

使用道具 舉報

16#
ID:515930 發表于 2022-1-20 14:01 | 只看該作者

也有一個WS2812 時鐘程序,60燈驅動. 參考學習一下.
回復

使用道具 舉報

17#
ID:102189 發表于 2023-5-26 20:34 | 只看該作者
為什么我的不行呀
回復

使用道具 舉報

18#
ID:102189 發表于 2023-5-26 21:06 | 只看該作者
回復

使用道具 舉報

19#
ID:102189 發表于 2023-5-26 21:07 | 只看該作者
單片機需要加上拉電阻嗎
回復

使用道具 舉報

20#
ID:339520 發表于 2023-6-19 13:39 | 只看該作者
1毛錢的應廣PMS150G驅動WS2812代碼寫出來了。
回復

使用道具 舉報

21#
ID:339520 發表于 2023-6-19 13:41 | 只看該作者
1毛錢的應廣單片機PMS150G驅動WS2812代碼我寫完了。
回復

使用道具 舉報

22#
ID:224580 發表于 2023-9-28 17:33 | 只看該作者
向高手致敬
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 视频一二三区 | 色综合美女 | 一区2区 | 久久精品成人 | 日韩国产一区二区三区 | 久久看精品 | 一级做a爰片久久毛片 | 亚洲一区二区三区免费在线观看 | 久久久久国产精品 | 久久精品国产一区 | 日本久久久一区二区三区 | 久久精品二区亚洲w码 | 瑞克和莫蒂第五季在线观看 | www.玖玖玖 | 麻豆av网| 亚洲草草视频 | 国产欧美日韩综合精品一区二区 | 欧美国产日韩一区 | 亚洲精品乱 | 玖玖玖在线观看 | 亚洲一区精品在线 | 国产精品大片 | 在线观看国产wwwa级羞羞视频 | 久久九| 天天看天天爽 | 免费的黄色片子 | 精区3d动漫一品二品精区 | www.亚洲精品 | 99久久日韩精品免费热麻豆美女 | 自拍偷拍在线视频 | 欧美精品一区免费 | 一片毛片| 亚洲欧美视频一区 | 精品美女视频在免费观看 | 国产精品成人一区二区三区夜夜夜 | 久久综合入口 | 亚洲精品美女在线观看 | 国产欧美精品区一区二区三区 | 丝袜久久 | 久久伊 | 精品国产乱码久久久久久牛牛 |