找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机40个流水灯如何编程呢?求思路 利用38译码器来拓展io口

[复制链接]
跳转到指定楼层
楼主
利用38译码器来拓展io口
这一方法能实现流水灯吗,能的话如何编写程序呢,望大神指导

51hei图片20191022142940.png (150.57 KB, 下载次数: 82)

51hei图片20191022142940.png

51hei截图20191022143134.png (133.1 KB, 下载次数: 73)

51hei截图20191022143134.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2019-10-22 22:02 | 只看该作者
给你写了一个示例参考
595驱动LED仿真.zip (103.94 KB, 下载次数: 27)



  1. #include<REG51.H>

  2. sbit Sh=P2^0;
  3. sbit Ds=P2^1;
  4. sbit St=P2^2;

  5. unsigned char a1=0xff,b1=0xff,c1=0xff,d1=0xff,e1=0xfe;

  6. void DelayMS(unsigned int ms)
  7. {
  8.         unsigned char i;
  9.         while(ms--)
  10.         for(i=0;i<120;i++);
  11. }

  12. void In_Data(unsigned char a,b,c,d,e)
  13. {
  14.         unsigned char i,j,k;       
  15.         for(i=0;i<5;i++)
  16.         {
  17.                 if(i==0)k=a;
  18.                 if(i==1)k=b;
  19.                 if(i==2)k=c;
  20.                 if(i==3)k=d;
  21.                 if(i==4)k=e;
  22.                 for(j=0;j<8;j++)
  23.                 {
  24.                         k<<=1;
  25.                         Ds=CY;
  26.                         Sh=0;
  27.                         Sh=1;
  28.                 }
  29.         }
  30.         St=0;
  31.         St=1;
  32. }

  33. void main()
  34. {

  35.         while(1)
  36.         {
  37.                 In_Data(a1,b1,c1,d1,e1);
  38.                 DelayMS(500);
  39.                 if(e1!=0xff)
  40.                 {
  41.                         e1=e1<<1|0x01;
  42.                         if(e1==0xff)
  43.                                 d1=0xfe;
  44.                 }
  45.                 else if(d1!=0xff)
  46.                 {
  47.                         d1=d1<<1|0x01;
  48.                         if(d1==0xff)
  49.                                 c1=0xfe;
  50.                 }
  51.                 else if(c1!=0xff)
  52.                 {
  53.                         c1=c1<<1|0x01;
  54.                         if(c1==0xff)
  55.                                 b1=0xfe;
  56.                 }
  57.                 else if(b1!=0xff)
  58.                 {
  59.                         b1=b1<<1|0x01;
  60.                         if(b1==0xff)
  61.                                 a1=0xfe;
  62.                 }
  63.                 else if(a1!=0xff)
  64.                 {
  65.                         a1=a1<<1|0x01;
  66.                         if(a1==0xff)
  67.                                 e1=0xfe;
  68.                 }
  69.         }
  70. }
复制代码



回复

使用道具 举报

板凳
ID:235200 发表于 2019-10-23 00:03 | 只看该作者
五个74138,依次控制输入CBA对应0-7的同时,P30-P35依次只控制有一根为低电平,不过你的电路是错误的,74138的E1应该接高电平
回复

使用道具 举报

地板
ID:627982 发表于 2019-10-23 21:49 | 只看该作者
wulin 发表于 2019-10-22 22:02
给你写了一个示例参考

谢谢,很有用
回复

使用道具 举报

5#
ID:627982 发表于 2019-10-23 22:19 | 只看该作者
wulin 发表于 2019-10-22 22:02
给你写了一个示例参考

能解释说明一下代码的意思吗?还有那个cY是什么意思呢
回复

使用道具 举报

6#
ID:628137 发表于 2019-10-23 22:43 来自手机 | 只看该作者
38译码可以达到要求
回复

使用道具 举报

7#
ID:235200 发表于 2019-10-24 08:12 | 只看该作者
寂寞的大饼 发表于 2019-10-23 22:19
能解释说明一下代码的意思吗?还有那个cY是什么意思呢

CY是寄存器PSW的最高位,进行移位时,会把1位数据移入到这里存储
回复

使用道具 举报

8#
ID:213173 发表于 2019-10-24 09:06 | 只看该作者
寂寞的大饼 发表于 2019-10-23 22:19
能解释说明一下代码的意思吗?还有那个cY是什么意思呢

40位数据已经超出无符号长整型数据类型32位,不能一次传输,所以用for嵌套,将8位数据连续传输5次。
特殊功能寄存器PSW中,CY表示的含义是溢出标志位。也可以写成如下代码,由高到低传输,只是效率略低。
for(j=0;j<8;j++)
{
    Ds=(k&0x80)>>7;//读取最高位
    Sh=0;
    Sh=1;
    k<<=1;
}
回复

使用道具 举报

9#
ID:627982 发表于 2019-10-25 12:58 | 只看该作者
wulin 发表于 2019-10-24 09:06
40位数据已经超出无符号长整型数据类型32位,不能一次传输,所以用for嵌套,将8位数据连续传输5次。
特 ...

能不能通篇说一下,尤其是整个原理的工作流程,如何实现流水灯的
回复

使用道具 举报

10#
ID:213173 发表于 2019-10-25 14:36 | 只看该作者
寂寞的大饼 发表于 2019-10-25 12:58
能不能通篇说一下,尤其是整个原理的工作流程,如何实现流水灯的

由于40个流水灯是轮流点亮的,编程就极其简单,与8个流水灯的程序几乎一样。主循环周期约500ms,也就是0.5s左移1位,初始e1=0xfe;1111 1110,左移1位后+1=1111 1101,以此类推,循环8次就是1111 1111,以0xff作为进位判断条件,重复5次就完成一轮40个LED流水。如果把40个LED做成花样流水就比较复杂些,需要事先设计几个二维数组保存预定花样,由按键或其它方法控制和调用这些数组完成花样流水。
回复

使用道具 举报

11#
ID:401564 发表于 2019-10-25 14:36 | 只看该作者
哥们,你不会连流水灯怎么实现都不知道吧?
不要折腾那么多了,直接上一个引脚多的STC单片机就可以了,什么译码器都不要,只要串联电阻LED就可以了的
程序就一个一个亮过去就可以了,完了就有流水的效果了
回复

使用道具 举报

12#
ID:630052 发表于 2019-10-25 15:06 | 只看该作者
先看一下基础吧
回复

使用道具 举报

13#
ID:627982 发表于 2019-10-25 15:29 | 只看该作者
Y_G_G 发表于 2019-10-25 14:36
哥们,你不会连流水灯怎么实现都不知道吧?
不要折腾那么多了,直接上一个引脚多的STC单片机就可以了,什么译 ...

老哥,师傅要求用32个I/O口的单片机并通过数电知识拓展口来点亮40个流水灯,俺是新手,基本不会。
回复

使用道具 举报

14#
ID:627982 发表于 2019-10-25 16:19 | 只看该作者
wulin 发表于 2019-10-25 14:36
由于40个流水灯是轮流点亮的,编程就极其简单,与8个流水灯的程序几乎一样。主循环周期约500ms,也就是0. ...

大佬能将每一段小程序解释一下吗,谢谢啦,惭愧了
回复

使用道具 举报

15#
ID:401564 发表于 2019-10-26 08:26 | 只看该作者
寂寞的大饼 发表于 2019-10-25 15:29
老哥,师傅要求用32个I/O口的单片机并通过数电知识拓展口来点亮40个流水灯,俺是新手,基本不会。

我也不会,我从来都没有用过74138,端口扩展也没有用过
但就算我没有用过,我也可以说这很简单
当你学到单片机编程这一块的时候,你就应该在这之前把数字电路和模拟电路的基础打好,如果你现在还不会这些,那就说你不会就可以了,"我不会"这三个字说出来不丢人,人都是从不会学过来的,如果你还想在这条路上走下去,那就还得回去学数字电路
你在这问,人家给了你代码和电路,你依然还是不会的
当然,如果你没有在这条路继续走下去的打算,就当我什么也没说
回复

使用道具 举报

16#
ID:383215 发表于 2019-10-27 11:36 | 只看该作者
单片机扩展40个输出口点亮流水灯,用5片74138是最差方案,只能做到同时亮5个LED,最佳方案是用5片CD4094,最多占用单片机4个I/O口,就是扩展100个输出口也是占用单片机4个I/O口,可以做到40个LED全亮全灭,想编出什么花样都可以。
回复

使用道具 举报

17#
ID:914959 发表于 2021-5-2 14:30 | 只看该作者
kmsj 发表于 2019-10-27 11:36
单片机扩展40个输出口点亮流水灯,用5片74138是最差方案,只能做到同时亮5个LED,最佳方案是用5片CD4094, ...

cd4094可以用什么代替吗?
回复

使用道具 举报

18#
ID:383215 发表于 2021-5-2 18:38 | 只看该作者
dugu@520 发表于 2021-5-2 14:30
cd4094可以用什么代替吗?

CD4094可以用74HC595代替,楼上已经有介绍,只是74HC595我很少用,CD4094用习惯了,现在发现74HC595布线更容易,速度应该更快。
回复

使用道具 举报

19#
ID:89515 发表于 2021-5-2 19:58 | 只看该作者
就只是做流水灯的话,用4017不是更简单,一个时钟信号就行了,非用单片机的话,循环程序就一句。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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