找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 5873|回复: 16
打印 上一主题 下一主题
收起左侧

想用单片机延时方式做一个WS2811流水灯,如何修改程序

  [复制链接]
跳转到指定楼层
楼主
ID:805132 发表于 2020-7-18 15:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,用80c51通过延时的方式驱动WS2811灯带,想做成流水灯的效果,灯带的基础程序如下
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define nop _nop_()
  4. #define unchar unsigned char
  5. #define unint unsigned int
  6. #define size 20
  7. sbit Din = P2^2;
  8. unchar bdata LED_DAT;
  9. sbit bit0=LED_DAT^0;
  10. sbit bit1=LED_DAT^1;
  11. sbit bit2=LED_DAT^2;
  12. sbit bit3=LED_DAT^3;
  13. sbit bit4=LED_DAT^4;
  14. sbit bit5=LED_DAT^5;
  15. sbit bit6=LED_DAT^6;
  16. sbit bit7=LED_DAT^7;
  17. unchar RR,GG,BB;
  18. unint t;
  19. unint Mod;
  20. void delay(unint z)
  21. {
  22.         unchar a,b;
  23.         while(z--)
  24.         for(b = 0;b<=118;b++)
  25.         for(a = 0;a<=18;a++)
  26.         ;
  27. }
  28. void h_dat0()
  29. {
  30.         Din = 1;nop;               
  31.         Din = 0;nop;nop; nop;                                                                  
  32. }


  33. void h_dat1()
  34. {
  35.         Din = 1;nop;nop;nop;                                                                                                      
  36.         Din = 0;nop;                  
  37. }


  38. void Reset(void)
  39. {
  40.   Din = 0;
  41.   delay(1);      
  42. }


  43. void SendData()
  44. {
  45.   LED_DAT = GG;
  46.         if(bit0 == 1) {h_dat1();} else {h_dat0();}   
  47.         if(bit1 == 1) {h_dat1();} else {h_dat0();}   
  48.         if(bit2 == 1) {h_dat1();} else {h_dat0();}   
  49.         if(bit3 == 1) {h_dat1();} else {h_dat0();}   
  50.         if(bit4 == 1) {h_dat1();} else {h_dat0();}   
  51.         if(bit5 == 1) {h_dat1();} else {h_dat0();}   
  52.         if(bit6 == 1) {h_dat1();} else {h_dat0();}   
  53.         if(bit7 == 1) {h_dat1();} else {h_dat0();}  
  54.   LED_DAT = RR;
  55.         if(bit0 == 1) {h_dat1();} else {h_dat0();}   
  56.         if(bit1 == 1) {h_dat1();} else {h_dat0();}   
  57.         if(bit2 == 1) {h_dat1();} else {h_dat0();}   
  58.         if(bit3 == 1) {h_dat1();} else {h_dat0();}   
  59.         if(bit4 == 1) {h_dat1();} else {h_dat0();}   
  60.         if(bit5 == 1) {h_dat1();} else {h_dat0();}   
  61.         if(bit6 == 1) {h_dat1();} else {h_dat0();}   
  62.         if(bit7 == 1) {h_dat1();} else {h_dat0();}  
  63.   LED_DAT = BB;
  64.         if(bit0 == 1) {h_dat1();} else {h_dat0();}   
  65.         if(bit1 == 1) {h_dat1();} else {h_dat0();}   
  66.         if(bit2 == 1) {h_dat1();} else {h_dat0();}   
  67.         if(bit3 == 1) {h_dat1();} else {h_dat0();}   
  68.         if(bit4 == 1) {h_dat1();} else {h_dat0();}   
  69.         if(bit5 == 1) {h_dat1();} else {h_dat0();}   
  70.         if(bit6 == 1) {h_dat1();} else {h_dat0();}   
  71.         if(bit7 == 1) {h_dat1();} else {h_dat0();}  
  72.   
  73. }




  74. void send_string_data()
  75. {
  76.         unchar i;
  77.         for (i= 0;i<size;i++)
  78.         {
  79.            SendData();
  80.            
  81.            }
  82.               Reset();     
  83. }



  84. void main()
  85. {   


  86.         while(1)                       
  87. }
复制代码


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

举报

沙发
ID:748788 发表于 2020-7-19 14:29 | 只看该作者
这个是修改过的程序吧,主循环都是空的。发原程序上来看看,才好帮你改。
回复

举报

板凳
ID:642281 发表于 2020-7-19 14:55 | 只看该作者
while(1)里边的程序都没有调用,不会执行你编写的子函数
回复

举报

地板
ID:687694 发表于 2020-7-19 17:45 | 只看该作者
80C51貌似驱动不了吧,周期太长。
回复

举报

5#
ID:475444 发表于 2020-7-19 17:59 | 只看该作者
80C51不行,周期长,用宏晶,20M晶振可以玩一下
回复

举报

6#
ID:67199 发表于 2020-7-19 21:04 | 只看该作者
用STC15F104W玩过,  内部时间频率:33.1176Mh,定时中断方式。
回复

举报

7#
ID:805132 发表于 2020-7-20 09:20 | 只看该作者
lyxing 发表于 2020-7-19 21:04
用STC15F104W玩过,  内部时间频率:33.1176Mh,定时中断方式。

大佬能给个代码看看吗,我这种写法不知道怎么才能让灯珠自己动并且变色,只能做成一起变色一起灭灯
回复

举报

8#
ID:748788 发表于 2020-7-21 08:26 | 只看该作者
你的问题应该找卖家,卖家都会炫耀自家的灯带能这样那样的花式亮灯,你的却不行,第一时间就是找卖家
回复

举报

9#
ID:889424 发表于 2021-3-25 15:02 | 只看该作者
很好,很实用的资料,学习了
回复

举报

10#
ID:267932 发表于 2021-3-27 17:13 | 只看该作者
建议SPI  加DMA控制。
回复

举报

11#
ID:47286 发表于 2021-3-27 23:22 | 只看该作者
80C51不行 也不是必须33M或者20M频率 11.0592肯定行 实测的 但至少得1T的单片机 不然就如楼上各位说的 通讯时间搞不定 我当时用的204s片子 11.0592的频率 推了70多个灯
回复

举报

12#
ID:89515 发表于 2021-3-28 06:33 来自触屏版 | 只看该作者
8m晶振,振荡频率125ns就可以了,这个协议的容错率很高的,好像是+-130吧
回复

举报

13#
ID:207421 发表于 2021-3-28 13:22 | 只看该作者
至少用STC的1T单片机才能胜任。
12T的单片机也只能死撑,没必要这么干。
回复

举报

14#
ID:766282 发表于 2021-7-6 09:06 | 只看该作者
错误,编译不了
回复

举报

15#
ID:161164 发表于 2021-7-7 09:21 | 只看该作者
512-DZ 发表于 2021-7-6 09:06
错误,编译不了

while(1)少了一个分号";"而已

SendData可以改成这样:
  1. void SendData()
  2. {
  3.         char i,j;
  4.         char LED_DATA[3];
  5.   LED_DATA[0] = GG;
  6.   LED_DATA[1] = RR;
  7.   LED_DATA[2] = BB;
  8.        
  9.         for(i = 0;i<3;i++){
  10.                 for(j = 0;j<8;j++){
  11.                         if(LED_DATA[i] & 0x01){h_dat1();} else {h_dat0();}
  12.                         LED_DATA[i]>>=1;
  13.                 }
  14.         }  
  15. }
复制代码
回复

举报

16#
ID:418515 发表于 2022-5-29 23:17 | 只看该作者
挺好,正好有两款跑飞了的程序
回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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