找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9214|回复: 10
打印 上一主题 下一主题
收起左侧

单片机+WS2812灯带驱动程序源码

  [复制链接]
跳转到指定楼层
楼主
ID:293743 发表于 2019-4-17 17:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
注意:采用1T 51单片机 晶振采用24M
内部有注释,WS2812灯带采用单IO口驱动 此处不附带原理图

单片机源程序如下:
  1. /********************************************************/
  2. /*作 者:Dyingstraw
  3. /*版    本:V1.0
  4. /*程序功能:用51单片机控制ws2812 RGB输出,显示全色彩
  5. /*备        注:51单片机晶振24M
  6. /********************************************************/

  7. #include<STC12C5A60S2.h>
  8. #include<intrins.h>             //写入头文件
  9. #define uchar unsigned char
  10. sbit Send_Dat=P3^7;               //数据输出,接IN脚
  11. sbit key3=P2^1;
  12. sbit key2=P2^4;
  13. sbit key1=P2^7;
  14. uchar show[720]; // 8*3*30
  15. uchar  color[30][3]={
  16.         0xff,0x01,0x00,    //0
  17.         0xff,0x01,0x00,
  18.         0xff,0x01,0x00,
  19.         0xff,0x01,0x00,
  20.         0xff,0x01,0x00,
  21.         0xff,0x01,0x00,
  22.         0xff,0x01,0x00,
  23.         0xff,0x01,0x00,
  24.         0xff,0x01,0x00,
  25.         0xff,0x01,0x00,
  26.         0xff,0x01,0x00,   //10
  27.         0xff,0x01,0x00,
  28.         0xff,0x01,0x00,
  29.         0xff,0x01,0x00,
  30.         0xff,0x01,0x00,
  31.         0xff,0x01,0x00,
  32.         0xff,0x01,0x00,
  33.         0xff,0x01,0x00,
  34.         0xff,0x01,0x00,
  35.         0xff,0x01,0x00,
  36.         0xff,0x01,0x00,  //20
  37.         0xff,0x01,0x00,
  38.         0xff,0x01,0x00,
  39.         0xff,0x01,0x00,
  40.         0xff,0x01,0x00,
  41.         0xff,0x01,0x00,
  42.         0xff,0x01,0x00,
  43.         0xff,0x01,0x00,
  44.         0xff,0x01,0x00,
  45.         0xff,0x01,0x00,  //29
  46.        
  47. };  //G   R   B
  48. uchar code GRB[7][3]={
  49.         0XFF,0X00,0X00,//绿
  50.         0XFF,0XFF,0X00,//黄
  51.         0X00,0XFF,0X00,//红
  52.         0X00,0XFF,0XFF,//品红
  53.         0X00,0X00,0XFF,//蓝
  54.         0XFF,0X00,0XFF,//青  
  55.         0XFF,0XFF,0XFF,//白
  56. };
  57. void delay();
  58. void delays();      

  59. /*写入数据时序*/
  60. void Send_A_bit(uchar VAL)
  61. {
  62.        if (VAL==1)
  63.        {
  64.       
  65.               Send_Dat=1;
  66.               _nop_();_nop_();_nop_();_nop_();_nop_();
  67.                                                         _nop_();_nop_();_nop_();_nop_();_nop_();
  68.                                                         _nop_();_nop_();_nop_();_nop_();_nop_();
  69.                                                         _nop_();_nop_();
  70.          
  71.               Send_Dat=0;         
  72.                                                         _nop_();_nop_();
  73.        }
  74.        else
  75.        {  
  76.               Send_Dat=1;
  77.                                                         _nop_();_nop_();_nop_();_nop_();
  78.          
  79.               Send_Dat=0;           
  80.               _nop_();_nop_();_nop_();_nop_();_nop_();
  81.                                                         _nop_();_nop_();_nop_();_nop_();
  82.        }           
  83.       
  84. }
  85. void SendAllData()
  86. {
  87.         unsigned int i;
  88.         for(i=0;i<720;i++)
  89.                 Send_A_bit(show[i]);
  90.        
  91. }
  92. void WriteData()
  93. {
  94.         unsigned char i,j;
  95.         for(i=0;i<30;i++)
  96.         {
  97.                 for(j=0;j<3;j++)
  98.                 {
  99.                 show[24*i+8*j+0]=color[i][j]/128%2;
  100.                 show[24*i+8*j+1]=color[i][j]/64%2;
  101.                 show[24*i+8*j+2]=color[i][j]/32%2;
  102.                 show[24*i+8*j+3]=color[i][j]/16%2;
  103.                 show[24*i+8*j+4]=color[i][j]/8%2;
  104.                 show[24*i+8*j+5]=color[i][j]/4%2;
  105.                 show[24*i+8*j+6]=color[i][j]/2%2;
  106.                 show[24*i+8*j+7]=color[i][j]%2;
  107.                 }       
  108.         }
  109. }

  110. void change1(unsigned char k)
  111. {
  112.                 unsigned char i,j;
  113.                 for(i=0;i<30;i++)
  114.         {
  115.                 for(j=0;j<3;j++)
  116.                 color[i][j]=GRB[k][j];
  117.                
  118.         }
  119.                
  120. }
  121.        
  122. void change2()
  123. {
  124.         unsigned char i;
  125.                 for(i=0;i<30;i++)
  126.         {
  127.                 if(color[i][0]>0&&color[i][2]==0)
  128.                 {
  129.                                 color[i][0]--;color[i][1]++;
  130.                 }
  131.                 if(color[i][1]>0&&color[i][0]==0)
  132.                 {
  133.                                 color[i][1]--;color[i][2]++;
  134.                 }
  135.                 if(color[i][2]>0&&color[i][1]==0)
  136.                 {
  137.                                 color[i][2]--;color[i][0]++;
  138.                 }
  139.         }
  140. }

  141. /*主函数*/
  142. unsigned char main()
  143. {

  144.        uchar k=0;
  145.              P2=0XFF;
  146.                          change1(0);
  147.        while(1)
  148.        {
  149.                                         change1(k);
  150.                                         Send_Dat=0;
  151.                                         WriteData();SendAllData();
  152.                                         Send_Dat=0;   
  153.                                         delays();
  154.                                         k++;if(k>=7)k=0;
  155.                                         if(key1==0) return 0;
  156.                                         if(key2==0)
  157.                                         {
  158.                                                 change1(0);
  159.                                                 while(key3==1)
  160.                                                 {
  161.                                                         change2();
  162.                                                        
  163.                                                        
  164.                                                         Send_Dat=0;
  165.                                                         WriteData();SendAllData();
  166.                                                         Send_Dat=0; //发送数据
  167.                                        

  168.                                                        
  169.                                                 }
  170.                                         }
  171.        }
  172. }






  173. /*小延时函数*/
  174. /*大概1S吧,随便写的*/
  175. void delay()  //100ms
  176. {


  177.         unsigned char i, j, k;

  178.         i = 10;
  179.         j = 31;
  180. //        k = 147;
  181.         k=14;
  182.         do
  183.         {
  184.                 do
  185.                 {
  186.                         while (--k);
  187.                 } while (--j);
  188.         } while (--i);
  189. }


  190. /*大延时函数*/
  191. /*十几秒*/
  192. void delays()
  193. {
  194.   delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
  195.         delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
  196.         delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
  197. }
复制代码

所有资料51hei提供下载:
跑马灯.zip (42.81 KB, 下载次数: 248)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:562991 发表于 2019-6-15 11:32 | 只看该作者
支持谢谢啊
回复

使用道具 举报

板凳
ID:717943 发表于 2020-3-29 09:15 | 只看该作者
感谢分享
回复

使用道具 举报

地板
ID:299054 发表于 2020-5-9 10:37 | 只看该作者
谢谢分享!
回复

使用道具 举报

5#
ID:64089 发表于 2020-7-16 23:34 | 只看该作者
亲测可用,谢谢分享
回复

使用道具 举报

6#
ID:56960 发表于 2020-7-17 08:42 | 只看该作者
多谢楼主分享,要是上一张实物图就更完美了
回复

使用道具 举报

7#
ID:735961 发表于 2020-9-27 20:58 | 只看该作者
请问,这个程序文件,我编译了,怎么不能用
回复

使用道具 举报

8#
ID:242298 发表于 2021-11-23 00:46 | 只看该作者
3个KEY按键控制什么呢
回复

使用道具 举报

9#
ID:991413 发表于 2021-12-12 21:31 | 只看该作者
3个KEY按键控制什么呢
回复

使用道具 举报

10#
ID:399179 发表于 2021-12-21 18:30 来自手机 | 只看该作者
按键没用上吗?
回复

使用道具 举报

11#
ID:998804 发表于 2022-1-2 17:17 | 只看该作者
程序中用数组来定义颜色真是个好办法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表