找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1886|回复: 21
收起左侧

51单片机如何制作有拖影的流水灯?新手请教实现思路

  [复制链接]
ID:871926 发表于 2022-2-23 16:28 | 显示全部楼层 |阅读模式
想写一个51单片机控制8个LED有拖影的流水灯,第一颗亮度100%,第二颗亮度75%,第3颗亮度50%,最后25%亮度,请教一下程序设计思路,感谢!!!
回复

使用道具 举报

ID:624769 发表于 2022-2-23 18:23 来自手机 | 显示全部楼层
你牵涉到频占比,肯定要开一个定时器,设置4个变量,temp1-temp4,初始值分别0xf0,0xf8,0xfc,0xfe。在定时器中段中每隔1ms,把四个变量轮流赋值led,然后,按标准流水灯的做法,在合适时机,同时给这4个变量,做移位。
回复

使用道具 举报

ID:57657 发表于 2022-2-23 18:36 | 显示全部楼层
在main函数内产生8路不同占空比的PWM,用于控制8颗LED的不同亮度,然后用定时器中断进行二维数组查表即可。
回复

使用道具 举报

ID:161164 发表于 2022-2-24 10:43 | 显示全部楼层
饭要一口一口吃,代码要一个字一个字敲
A1.点亮第一颗Led
A2.用Delay令Led闪烁
A3.不用Delay令Led闪烁
A4.不用Delay令Led短亮长暗
A5.加速闪烁到肉眼看不出
A6.调节亮暗时间以控制Led亮度
A7.把亮暗时改为自动增减,形成一个呼吸灯
B1.点亮第二颗Led
B2.用Delay依次点亮其他Led
B3.不用Delay依次点亮其他Led
B4.重复B3,点亮第二颗Led时熄灭前一颗
B5.当最后一颗熄灭时,点亮第一颗,形成流水灯循环
B6.重复B3,点亮第三颗Led时熄灭第一颗形成拖尾
C1.A6+B3以半光亮度依次点亮Led
C2.A7+B6以渐暗方式形成拖尾达成目标
回复

使用道具 举报

ID:1003226 发表于 2022-2-24 10:59 | 显示全部楼层
PWM 控制灯亮度  cross移位
回复

使用道具 举报

ID:213173 发表于 2022-2-24 14:54 | 显示全部楼层
给你一个示例参考
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit P1_0 = P1^0;   
  6. sbit P1_1 = P1^1;
  7. sbit P1_2 = P1^2;
  8. sbit P1_3 = P1^3;
  9. sbit P1_4 = P1^4;
  10. sbit P1_5 = P1^5;
  11. sbit P1_6 = P1^6;
  12. sbit P1_7 = P1^7;

  13. unsigned char PWM0 = 15;//改变初值即改变初始状态
  14. unsigned char PWM1 = 17;     
  15. unsigned char PWM2 = 19;
  16. unsigned char PWM3 = 21;
  17. unsigned char PWM4 = 23;     
  18. unsigned char PWM5 = 25;
  19. unsigned char PWM6 = 27;     
  20. unsigned char PWM7 = 29;
  21. unsigned char counter=0;  
  22. unsigned char tt1=0;   
  23. unsigned int count=0;//计数变量
  24. bit sign=0;                        //暂停标志

  25. void main()
  26. {
  27.         TMOD=0x01;
  28.         TH0=(65536-500)/256;      
  29.         TL0=(65536-500)%256;
  30.         TR0=1;
  31.         EA=1;
  32.         ET0=1;
  33.         while(1)
  34.         {  
  35.                 if(tt1>=55)
  36.                 {
  37.                         tt1=0;
  38.                         PWM7++;PWM6++;PWM5++;PWM4++;
  39.                         PWM3++;PWM2++;PWM1++;PWM0++;
  40.                         if(PWM7==30) PWM7=0;
  41.                         if(PWM6==30) PWM6=0;
  42.                         if(PWM5==30) PWM5=0;
  43.                         if(PWM4==30) PWM4=0;
  44.                         if(PWM3==30) PWM3=0;
  45.                         if(PWM2==30) PWM2=0;
  46.                         if(PWM1==30) PWM1=0;
  47.                         if(PWM0==30) PWM0=0;
  48.                         if(PWM0==16) sign=1;//PWM0=16时关闭所有PWM
  49.                 }
  50.         }
  51. }
  52. void Timer0(void) interrupt 1
  53. {                           
  54.         TH0=(65536-500)/256;   
  55.         TL0=(65536-500)%256;
  56.         if(sign==1)
  57.         {
  58.                 count++;
  59.                 if(count>=2000)//1秒
  60.                 {
  61.                         count=0;
  62.                         sign=0;//开启所有PWM
  63.                 }
  64.         }
  65.         else
  66.         {
  67.                 counter++;
  68.                 tt1++;
  69.                 if(counter >= 15) counter = 0;  
  70.                 if(counter >= PWM7) P1_0 = 0; else P1_0 = 1;
  71.                 if(counter >= PWM6) P1_1 = 0; else P1_1 = 1;
  72.                 if(counter >= PWM5) P1_2 = 0; else P1_2 = 1;
  73.                 if(counter >= PWM4) P1_3 = 0; else P1_3 = 1;
  74.                 if(counter >= PWM3) P1_4 = 0; else P1_4 = 1;
  75.                 if(counter >= PWM2) P1_5 = 0; else P1_5 = 1;
  76.                 if(counter >= PWM1) P1_6 = 0; else P1_6 = 1;
  77.                 if(counter >= PWM0) P1_7 = 0; else P1_7 = 1;
  78.         }
  79. }
复制代码
回复

使用道具 举报

ID:401564 发表于 2022-2-24 21:35 | 显示全部楼层
板凳的方法最简单
8路PWM,数组查表控制,通过占空比的控制达到位移的效果,连位移都不需要了
回复

使用道具 举报

ID:123289 发表于 2022-2-26 14:24 | 显示全部楼层
1、能控制一个任意一个LED的明灭。
2、能控制一个任意一个LED的亮度。
3、能按随意控制任意一个LED的明灭时间
4、规划一个图表,在表中规划好8个LED的明、灭、亮度时间、时序。让它们看上去如同流水一样。
提示:分成许多步(N),每步定义出各个LED的明、灭、亮度时间,以序做N步显示,就完成了一次流水显示。
5、重复4、就可以了,但要注意,让第一步,与第N步的显示方案接近,即看不出明显的跳动。当然,你决定就是要让人感觉到跳动,也行。
回复

使用道具 举报

ID:977804 发表于 2022-2-26 15:22 来自手机 | 显示全部楼层
lkc8210 发表于 2022-2-24 10:43
饭要一口一口吃,代码要一个字一个字敲
A1.点亮第一颗Led
A2.用Delay令Led闪烁

高手,循序渐进
回复

使用道具 举报

ID:871926 发表于 2022-3-1 23:43 | 显示全部楼层
这几天忙工作 ,没有来得及回复,感谢各位大佬细心教导,按照各位的方法完成了目标,初学者望大家不要见笑
回复

使用道具 举报

ID:871926 发表于 2022-3-1 23:49 | 显示全部楼层
lkc8210 发表于 2022-2-24 10:43
饭要一口一口吃,代码要一个字一个字敲
A1.点亮第一颗Led
A2.用Delay令Led闪烁

刚刚学习纯C语言基础转单片机2个月,A1-B6学会了,c1-c2可能有些逻辑思路还没有转回来 让各位见笑了
回复

使用道具 举报

ID:871926 发表于 2022-3-1 23:52 | 显示全部楼层
188610329 发表于 2022-2-23 18:23
你牵涉到频占比,肯定要开一个定时器,设置4个变量,temp1-temp4,初始值分别0xf0,0xf8,0xfc,0xfe。在定 ...

谢谢指导 ,让我学到很多, 思路逐渐清晰。
回复

使用道具 举报

ID:871926 发表于 2022-3-1 23:54 | 显示全部楼层
npn 发表于 2022-2-23 18:36
在main函数内产生8路不同占空比的PWM,用于控制8颗LED的不同亮度,然后用定时器中断进行二维数组查表即可。

非常感谢!学习了,有那种感觉了
回复

使用道具 举报

ID:871926 发表于 2022-3-1 23:56 | 显示全部楼层
wulin 发表于 2022-2-24 14:54
给你一个示例参考

非常感谢!
回复

使用道具 举报

ID:871926 发表于 2022-3-1 23:57 | 显示全部楼层
Y_G_G 发表于 2022-2-24 21:35
板凳的方法最简单
8路PWM,数组查表控制,通过占空比的控制达到位移的效果,连位移都不需要了

非常感谢!都是高手
回复

使用道具 举报

ID:871926 发表于 2022-3-2 00:00 | 显示全部楼层
yzwzfyz 发表于 2022-2-26 14:24
1、能控制一个任意一个LED的明灭。
2、能控制一个任意一个LED的亮度。
3、能按随意控制任意一个LED的明灭 ...

感谢!刚开始学习,每个单步运行基本掌握了,就是组合运行时逻辑思维转得有点慢
回复

使用道具 举报

ID:121859 发表于 2022-3-2 07:28 | 显示全部楼层
如果进一步就可以实现“流星雨”效果,软件上需要用一个定时器,利用PWM控制原理来实现。要想效果逼真,电路上可以加LC或RLC电路。
回复

使用道具 举报

ID:1007767 发表于 2022-3-2 16:14 | 显示全部楼层
这种需要一点一点调节PWM'的 占空比,不同的灯占空比不一样。
回复

使用道具 举报

ID:871926 发表于 2022-3-29 23:53 | 显示全部楼层
初来乍到,想学东西,我这里也有许多拆机的mcu,(stm32f0系列,at32系列,飞思卡尔等,还有其他品牌的)功能没有问题,有需要的朋友可以联系我,免费送,但是邮费自理
回复

使用道具 举报

ID:775776 发表于 2022-3-30 14:04 | 显示全部楼层
开个定时器 对每个led占空比设置不同的初始值 没个灯都自己的 自加或自减循环
回复

使用道具 举报

ID:977831 发表于 2022-3-30 14:48 | 显示全部楼层
fangdong0602 发表于 2022-3-29 23:53
初来乍到,想学东西,我这里也有许多拆机的mcu,(stm32f0系列,at32系列,飞思卡尔等,还有其他品牌的)功 ...

感谢楼主,顶顶顶
回复

使用道具 举报

ID:480627 发表于 2022-4-11 16:00 | 显示全部楼层
地板适合新手入门,其他的适合高手技术交流。。。鉴定完毕
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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