发新帖本帖赏金 3.00元(功能说明)我要提问
12下一页
返回列表
打印

8的595联级移位输出控制60只LED灯的迷茫!!!

[复制链接]
2599|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fang355|  楼主 | 2016-6-14 14:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

//单片机89C51控制,由8个74HC595联级控制60只LED灯,模拟实现的圆盘闹钟的60秒, 按照每秒移动一只LED,计划使用595移位功能
//但是如此之多的595联级移位, 网络上总是找不到先例,自己琢磨了多日还是实现不了, 本人笨拙的程序如下, 希望有此经验的高手
//指教一二,提出我更改!有何妙计! 有缘关注的朋友先感谢了!!!
#include <reg51.h>
#include<intrins.h>
#define uint  unsigned int
#define uchar unsigned char       
sbit DS= P0^1;
sbit STCP= P0^2;
sbit SHCP= P0^0;
uchar unm1, h,m,second=0;
uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; // 其中一个字节的输出码表

//------延时函数---------------
void delay(uint z)
{
uint x,y;
for(x=0;x<z;x++)
  { for(y=0;y<120;y++);
  }
}
//-------1字节数据串行输入---------------
void In595(uchar num)
{
        uint j;
        for(j=0;j<8;j++)
     { num=table[ ]; //此处若写成unm<<1; 那就是一个灯在一个字节内移位了,8个595的输出口 八处都是同样的移位
           DS = CY;     //  对于此程序,还要CY标志吗?好像只能代表一个595溢出高位然后写数据,我要求是60口同时输出的  
                  SHCP = 1; // 移位时钟线输出低
                  SHCP = 0; // 移位时钟线输出       
        }
}
//-------并行输出-------------------
void Out595()
{
        STCP = 0; _nop_();_nop_();
        STCP = 1; _nop_();_nop_();
        STCP = 0; _nop_();_nop_();
}
//--------所有8个595同时处理------------------------------
void  load_595 ()          // 此处的处理, 就是计划所有口 同时能输出        或60口移位到输出 ??
{ uchar  i, j, temp;
  for(i=0;i<60;i++)           //外循环60个LED又重来
        { for(j=0; j<8+temp;j++) //内循环8个 是一个595的移位循环
          for(temp=0;temp<8;temp++)
           { j=table[j+8];
            In595(table[j]);
            delay(100);
                temp++;
            if(temp==8)
             {temp=0;}
            }
        }       
}
//------初始函数--------------
void init()
{
  TMOD=0x01;
  TH0=(65536-8000)/256;
  TL0=(65536-8000)%256;
  EA=1;
  ET0=1;
  TR0=1;
}
//------T0中断函数-------------
void timer0() interrupt 1
{
  unm1++;
TH0=(65536-38000)/256;
TL0=(65536-38000)%256;
  if(unm1==16)
   {
           second++;
        Out595();   //每秒锁存输出一次 本人计划的,但不成功
    unm1=0;

         if(second==60)
          {
                  m++;
            second=0;
       
                 if(m==60)
                  {
                   h++;
                   m=0;
                   if(h==24) h=0;       
                  }
          }
   }
}
//------------主函数-------------------
void main()
{       

  init();
  while(1)
        {
         TR0=1;
         load_595();
        }
}

相关帖子

沙发
fang355|  楼主 | 2016-6-14 15:47 | 只看该作者
这个电路原理, 能不能实现我这个要求,  也就是多个595可以好控制数码管, 因为刚好是8位, 而我这个60口  如何60/8  有余数的, 是不是本就不能实现!?

使用特权

评论回复
板凳
ningling_21| | 2016-6-14 16:05 | 只看该作者
fang355 发表于 2016-6-14 15:47
这个电路原理, 能不能实现我这个要求,  也就是多个595可以好控制数码管, 因为刚好是8位, 而我这个60口  ...

可以实现,只不过数据移位是在单片机的RAM中实现,移位后再送595,不是直接在595上移位

使用特权

评论回复
地板
bkn1860| | 2016-6-14 16:29 | 只看该作者
常见的LED广告屏都是用74595或者74164这么连起来控制的,所以硬件上应该没有问题

使用特权

评论回复
5
fang355|  楼主 | 2016-6-15 08:09 | 只看该作者
ningling_21 发表于 2016-6-14 16:05
可以实现,只不过数据移位是在单片机的RAM中实现,移位后再送595,不是直接在595上移位 ...

有道理!  有理论支持就好, 我没有瞎忙活。 更希望有具体的细节推出  

使用特权

评论回复
6
fang355|  楼主 | 2016-6-15 08:16 | 只看该作者
bkn1860 发表于 2016-6-14 16:29
常见的LED广告屏都是用74595或者74164这么连起来控制的,所以硬件上应该没有问题 ...

本人见识有限,谢谢你指出, 硬件上有此先例, 我更有信心了 ,  再追问一下 有否此软件程序(或流程图示)参考一下呢 ?!

使用特权

评论回复
7
duhemayi| | 2016-6-15 08:33 | 只看该作者
8个595级联是没有问题的,我已用过了!哈哈!

楼主的思路是没有问题的,可以实现

使用特权

评论回复
8
Adu0227| | 2016-6-15 09:03 | 只看该作者
怎么没有限流电阻

使用特权

评论回复
9
fang355|  楼主 | 2016-6-15 09:17 | 只看该作者
Adu0227 发表于 2016-6-15 09:03
怎么没有限流电阻

是i的   我忘记加上 限流了

使用特权

评论回复
10
fang355|  楼主 | 2016-6-15 09:22 | 只看该作者
duhemayi 发表于 2016-6-15 08:33
8个595级联是没有问题的,我已用过了!哈哈!

楼主的思路是没有问题的,可以实现

看到你说使用过  很高兴 !方便的话, 请大师 留个电话或什么的,  我想多多请教

使用特权

评论回复
11
张允| | 2016-6-15 09:42 | 只看该作者
12
tenme1| | 2016-6-15 09:57 | 只看该作者
//--------所有8个595同时处理------------------------------
void  load_595 ()          // 此处的处理, 就是计划所有口 同时能输出        或60口移位到输出 ??
{ uchar  i, j, temp;
  for(i=0;i<60;i++)           //外循环60个LED又重来
        { for(j=0; j<8+temp;j++) //内循环8个 是一个595的移位循环
          for(temp=0;temp<8;temp++)
           { j=table[j+8];
            In595(table[j]);
            delay(100);
                temp++;
            if(temp==8)
             {temp=0;}
            }
        }        
}


         table[j+8]  j是增大的,j+8已经超出了table序号了!! 所以这个数法是有问题的!!

使用特权

评论回复
13
ta1ent| | 2016-6-15 10:16 | 只看该作者
用8个74HC595肯定是可以的。程序实现上貌似不太对

使用特权

评论回复
14
fang355|  楼主 | 2016-6-15 10:19 | 只看该作者
tenme1 发表于 2016-6-15 09:57
//--------所有8个595同时处理------------------------------
void  load_595 ()          // 此处的处理 ...

是的    有误  谢谢指教!   

使用特权

评论回复
15
fang355|  楼主 | 2016-6-15 10:21 | 只看该作者
张允 发表于 2016-6-15 09:42
给你个例子看看:
http://user.qzone.qq.com/54165018/blog/1273460885
http://user.qzone.qq.com/54165018 ...

太感谢了, 张兄! 我要看看

使用特权

评论回复
16
懒人| | 2016-6-15 11:11 | 只看该作者
思路无问题,肯定能实现。
595的OE,最好用单片机控制。

使用特权

评论回复
17
fang355|  楼主 | 2016-6-15 11:32 | 只看该作者
懒人 发表于 2016-6-15 11:11
思路无问题,肯定能实现。
595的OE,最好用单片机控制。

OE 如若单片机控制 那就要多一个595,控制8个OE,也是移位输出了,这个移位SHCP与前8的595的SHCP, 又怎么协同呢?!

使用特权

评论回复
18
懒人| | 2016-6-15 11:38 | 只看该作者
不必多一个595,集中控制控制就可以。

使用特权

评论回复
19
fang355|  楼主 | 2016-6-15 11:44 | 只看该作者
懒人 发表于 2016-6-15 11:38
不必多一个595,集中控制控制就可以。

你好!笨人我 再追问, 不解你的“集中控制”的意思,  烦请具体多言明白     谢谢了

使用特权

评论回复
20
懒人| | 2016-6-15 12:02 | 只看该作者
595的oe不直接接地,而是连在一起用单片机的一个脚控制,反正那么多管脚也没用到

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

48

帖子

0

粉丝