微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 74HC595控制8个LED流水灯 实现不了功能

74HC595控制8个LED流水灯 实现不了功能

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp;
uint i;
void delay(uint);
void WR_5951();
void OUT_5951();
sbit SH_CP=P0^0;
sbit ST_CP=P0^2;
sbit DS=P0^1;
uchar code TB[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/*将数据输入移位寄存器*/
void WR_5951()
{ SH_CP=0;
  for(i=0;i<8;i++)
   {temp=temp<<1;
    DS=CY;
    SH_CP=1;
    SH_CP=0;
   }
}
/*将数据输入寄存器并输出*/
void OUT_5951()
{ ST_CP=0;
  ST_CP=1;
  delay(1);
  ST_CP=0;
  delay(1);
}
/*延时子程序delay(100)约延时1S*/     
void delay(uint z)
{
   uint x,y;
   for(x=1760;x>0;x--)
   for(y=z;y>0;y--);

}
/*主程序*/
void main()
{   
for(i=0;i<8;i++)
        {
            temp=TB[i];
                 WR_5951();
                 OUT_5951();
       delay(1000);
        }
}

这是图   仿真开始8个LED一起亮 并不是逐一亮 并延时10秒


#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit SH_CP=P0^0;
sbit ST_CP=P0^2;
sbit DS=P0^1;
uchar code TB[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/*延时子程序delay(100)约延时1S*/     
void delay(uint z)
{
   uint x,y;
   for(x=1760;x>0;x--)
   for(y=z;y>0;y--);
}
/*将数据输入移位寄存器*/
void WR_5951(uchar temp)
{
  for(i=0;i<8;i++)
   {
    SH_CP=0;
    DS=CY&0x01;
    temp>>=1;
    SH_CP=1;   
   }
}
/*将数据输入寄存器并输出*/
void OUT_5951()
{
  ST_CP=0;
  _nop_();
  ST_CP=1;
}
/*主程序*/
void main()
{
uchar i;
whlie(1)
{
for(i=0;i<8;i++)
        {            
         WR_5951(TB[i];);
          OUT_5951();
         delay(1000);
        }
}
}
试下看行不!

P0口要上拉电阻才行!换其端口试一下!

那个CY不知道会不会有问题,你试试不用CY先

上拉电阻会不会是一个因素呢?

不用声明 WR_5951 和 OUT子函数么?  除了这些 还有些小错误  我刚刚编译仿真了 和我原来的那个结果是一样的 一下全亮了

想我这样改一下
uchar code TB[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

不行 还是一样的结果  刚刚想学单片机就遇到解决不了的问题

那这样,先送一个固定的值,看亮的对不对

/*主程序*/
void main()
  {
      temp=0xfe;
    WR_5951();
    OUT_5951();
    delay(1000);
}用您说的方法,我只设定第一个LED亮,但是仿真的结果是 开始8个全亮,然后7个熄灭 只有第一个亮,会不会单片机上电之后P2口默认为高电平使SHPC=H STCP=H
OE=L所以 74HC595自己输出一个0000 0000 使8个灯亮 单片机执行指令后使第一个亮。
注: 我单独的使74HC595复位 它也能点亮8个灯

谢谢帮顶 ,可以帮忙解决这个问题吗?

ds=cy   cy是什么?来自: Android客户端

CY是PSW程序状态字的D7位,移位类指令temp=temp<<1被移除来的 最高位 会存放在CY里面 所以DS=CY就是将TEMP被移除的哪一位送给DS然后串行输入给74HC595

子涵数在主涵数前面不用声明!

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit SH_CP=P0^0;
sbit ST_CP=P0^2;
sbit DS=P0^1;
uchar code TB[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void Delay100us()                //@12.000MHz
{
        unsigned char i;
        _nop_();
        i = 47;
        while (--i);
}
/*延时子程序约延时1S*/     
void Delay1000ms()                //@12.000MHz
{
        unsigned char i, j, k;
        _nop_();
        i = 8;
        j = 154;
        k = 122;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
/*将数据输入移位寄存器*/
void WR_5951(uchar temp)
{
unsigned char i;
  for(i=0;i<8;i++)
   {
    SH_CP=0;
        Delay100us();
    DS=temp&0x01;
    temp>>=1;
    SH_CP=1;
        Delay100us();   
   }
   SH_CP=0;
}
/*将数据输入寄存器并输出*/
void OUT_5951()
{
  ST_CP=0;
  Delay100us();
  ST_CP=1;
}
/*主程序*/
void main()
{
uchar i;
while(1)
{
for(i=0;i<8;i++)
        {            
                 WR_5951(TB[i]);
         OUT_5951();
         Delay1000ms();
        }
}
}
//试下看行不!


可以流水只是顺序不对  ,为什么是右移temp>>=1  为了让第一个灯亮  我们不是要将0XFE(1111 1110)左移8位吗? 这样Q7Q6Q5Q4Q3Q2Q1Q0才是(1111 1110)啊

好哇,继续努力

看自己的要求而定嘛!举一反三啦!

我也是遇到这个问题,一上电全部都亮

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top