标题: 奇怪了 真奇怪了 关于74hc595驱动LED的问题 [打印本页]

作者: sq8422779    时间: 2019-10-8 17:08
标题: 奇怪了 真奇怪了 关于74hc595驱动LED的问题
显示效果应该是 011111111 11111111 11111111 01111111 11111111 11111111
但是实际效果是 011111111 11111111 11111111 11111111 11111111 11111111

第二行应该是 101111111 11111111 11111111 10111111 11111111 11111111
实际效果是    101111111 11111111 11111111 01111111 11111111 11111111

导致最后显示到最后一个的时最后2个LED一起灭

void In_Data(unsigned char a,b,c)
{
        unsigned char i,j,u;
for(u=0;u<6;u++)
  {
  if(u==0){j=a;}
  if(u==1){j=b;}
  if(u==2){j=c;}
  if(u==3){j=a;}
  if(u==4){j=b;}
  if(u==5){j=c;}
        for(i=0;i<8;i++)
        {
                j<<=1;
                _nop_();_nop_();
                Ds=CY;
               _nop_();_nop_();
                Sh=0;
                _nop_();_nop_();
                Sh=1;
        }
  }
        St=0;
        _nop_();_nop_();
        St=1;
}




if(i==0){In_Data(0x7F,0xFF,0xFF);}//01111111 11111111 11111111
if(i==1 || i==45){In_Data(0xBF,0xFF,0xFF);}//10111111 11111111 11111111
if(i==2 || i==44){In_Data(0xDF,0xFF,0xFF);}//11011111 11111111 11111111
if(i==3 || i==43){In_Data(0xEF,0xFF,0xFF);}//11101111 11111111 11111111
if(i==4 || i==42){In_Data(0xF7,0xFF,0xFF);}//11110111 11111111 11111111
if(i==5 || i==41){In_Data(0xFB,0xFF,0xFF);}//11111011 11111111 11111111
if(i==6 || i==40){In_Data(0xFD,0xFF,0xFF);}//11111101 11111111 11111111
if(i==7 || i==39){In_Data(0xFE,0xFF,0xFF);}//11111110 11111111 11111111
if(i==8 || i==38){In_Data(0xFF,0x7F,0xFF);}//11111111 01111111 11111111
if(i==9 || i==37){In_Data(0xFF,0xBF,0xFF);}//11111111 10111111 11111111
if(i==10 || i==36){In_Data(0xFF,0xDF,0xFF);}//11111111 11011111 11111111
if(i==11 || i==35){In_Data(0xFF,0xEF,0xFF);}//11111111 11101111 11111111
if(i==12 || i==34){In_Data(0xFF,0xF7,0xFF);}//11111111 11110111 11111111
if(i==13 || i==33){In_Data(0xFF,0xFB,0xFF);}//11111111 11111011 11111111
if(i==14 || i==32){In_Data(0xFF,0xFD,0xFF);}//11111111 11111101 11111111
if(i==15 || i==31){In_Data(0xFF,0xFE,0xFF);}//11111111 11111110 11111111
if(i==16 || i==30){In_Data(0xFF,0xFF,0x7F);}//11111111 11111111 01111111
if(i==17 || i==29){In_Data(0xFF,0xFF,0xBF);}//11111111 11111111 10111111
if(i==18 || i==28){In_Data(0xFF,0xFF,0xDF);}//11111111 11111111 11011111
if(i==19 || i==27){In_Data(0xFF,0xFF,0xEF);}//11111111 11111111 11101111
if(i==20 || i==26){In_Data(0xFF,0xFF,0xF7);}//11111111 11111111 11110111
if(i==21 || i==25){In_Data(0xFF,0xFF,0xFB);}//11111111 11111111 11111011
if(i==22 || i==24){In_Data(0xFF,0xFF,0xFD);}//11111111 11111111 11111101
if(i==23){In_Data(0xFF,0xFF,0xFE);}//11111111 11111111 11111110
DelayMS(1200);
i++;
if(i==46){i=0;}


作者: wulin    时间: 2019-10-9 11:04
楼主描述的奇怪现象不存在,有图为证。

  1. #include <reg51.h>
  2. #include <intrins.h>

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

  6. void DelayMS(unsigned int z)
  7. {
  8.         unsigned char x;
  9.         while(z--)
  10.                 for(x=120;x>0;x--);
  11. }

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

  38. void main()
  39. {
  40.         unsigned char i;
  41.         while(1)
  42.         {
  43.                 if(i==0)          {In_Data(0x7F,0xFF,0xFF);}//01111111 11111111 11111111
  44.                 if(i==1 || i==45) {In_Data(0xBF,0xFF,0xFF);}//10111111 11111111 11111111
  45.                 if(i==2 || i==44) {In_Data(0xDF,0xFF,0xFF);}//11011111 11111111 11111111
  46.                 if(i==3 || i==43) {In_Data(0xEF,0xFF,0xFF);}//11101111 11111111 11111111
  47.                 if(i==4 || i==42) {In_Data(0xF7,0xFF,0xFF);}//11110111 11111111 11111111
  48.                 if(i==5 || i==41) {In_Data(0xFB,0xFF,0xFF);}//11111011 11111111 11111111
  49.                 if(i==6 || i==40) {In_Data(0xFD,0xFF,0xFF);}//11111101 11111111 11111111
  50.                 if(i==7 || i==39) {In_Data(0xFE,0xFF,0xFF);}//11111110 11111111 11111111
  51.                 if(i==8 || i==38) {In_Data(0xFF,0x7F,0xFF);}//11111111 01111111 11111111
  52.                 if(i==9 || i==37) {In_Data(0xFF,0xBF,0xFF);}//11111111 10111111 11111111
  53.                 if(i==10 || i==36){In_Data(0xFF,0xDF,0xFF);}//11111111 11011111 11111111
  54.                 if(i==11 || i==35){In_Data(0xFF,0xEF,0xFF);}//11111111 11101111 11111111
  55.                 if(i==12 || i==34){In_Data(0xFF,0xF7,0xFF);}//11111111 11110111 11111111
  56.                 if(i==13 || i==33){In_Data(0xFF,0xFB,0xFF);}//11111111 11111011 11111111
  57.                 if(i==14 || i==32){In_Data(0xFF,0xFD,0xFF);}//11111111 11111101 11111111
  58.                 if(i==15 || i==31){In_Data(0xFF,0xFE,0xFF);}//11111111 11111110 11111111
  59.                 if(i==16 || i==30){In_Data(0xFF,0xFF,0x7F);}//11111111 11111111 01111111
  60.                 if(i==17 || i==29){In_Data(0xFF,0xFF,0xBF);}//11111111 11111111 10111111
  61.                 if(i==18 || i==28){In_Data(0xFF,0xFF,0xDF);}//11111111 11111111 11011111
  62.                 if(i==19 || i==27){In_Data(0xFF,0xFF,0xEF);}//11111111 11111111 11101111
  63.                 if(i==20 || i==26){In_Data(0xFF,0xFF,0xF7);}//11111111 11111111 11110111
  64.                 if(i==21 || i==25){In_Data(0xFF,0xFF,0xFB);}//11111111 11111111 11111011
  65.                 if(i==22 || i==24){In_Data(0xFF,0xFF,0xFD);}//11111111 11111111 11111101
  66.                 if(i==23)         {In_Data(0xFF,0xFF,0xFE);}//11111111 11111111 11111110
  67.                 DelayMS(1200);
  68.                 i++;
  69.                 if(i==46){i=0;}
  70.         }
  71. }
复制代码




作者: yzwzfyz    时间: 2019-10-9 16:19
用示波器看,走单步。
作者: sq8422779    时间: 2019-10-9 20:18
wulin 发表于 2019-10-9 11:04
楼主描述的奇怪现象不存在,有图为证。

用的是我贴出来的代码?硬件接线不会有问题,我有视频为证
作者: wulin    时间: 2019-10-10 10:24
sq8422779 发表于 2019-10-9 20:18
用的是我贴出来的代码?硬件接线不会有问题,我有视频为证

把你的完整程序和硬件接线图发出来分析才能知道问题所在
作者: sq8422779    时间: 2019-10-12 09:03
wulin 发表于 2019-10-10 10:24
把你的完整程序和硬件接线图发出来分析才能知道问题所在

按照图片顺序跳线的





090320z8tbbob07bjco6j2.jpg (864.29 KB, 下载次数: 24)

090320z8tbbob07bjco6j2.jpg

作者: sq8422779    时间: 2019-10-12 13:25
74HC595流水灯 - 48灯.rar (68.64 KB, 下载次数: 15)
这个是代码  麻烦看下,....很奇怪的问题

作者: sq8422779    时间: 2019-10-12 13:26
wulin 发表于 2019-10-10 10:24
把你的完整程序和硬件接线图发出来分析才能知道问题所在

595的引脚 只接了11 12 14
作者: wulin    时间: 2019-10-12 15:08
sq8422779 发表于 2019-10-12 13:26
595的引脚 只接了11 12 14

软件都是基于硬件条件编写的。你的仿真电路图与程序风马牛不相及。
作者: sq8422779    时间: 2019-10-13 10:01
wulin 发表于 2019-10-12 15:08
软件都是基于硬件条件编写的。你的仿真电路图与程序风马牛不相及。

仿真文件不是的,我直接下载到硬件上测试的,还有我问下,595的11 12 14 中间最长多远,我放在2个地方,中间差不多有3米,会不会行为这个原因
作者: wulin    时间: 2019-10-15 11:20
本帖最后由 wulin 于 2019-10-15 13:58 编辑
sq8422779 发表于 2019-10-13 10:01
仿真文件不是的,我直接下载到硬件上测试的,还有我问下,595的11 12 14 中间最长多远,我放在2个地方, ...

单片机与595之间3根线就可以了,但两块板子必须共地,所有595的10、16脚接VCC,8、13脚接GND。先用短线调试,成功后再改长线试。从你的程序看单片机用的是STC15系列芯片,流水灯已改成对称方式,已设置3个输出口为推挽模式,端口有足够的带负载能力和抗干扰能力。如果还不行把单片机的3个输出口接510欧上拉电阻,连线换成屏蔽线。 595驱动LED仿真.zip (110.42 KB, 下载次数: 19)









欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1