74HC595控制8个LED流水灯 实现不了功能
#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)啊
好哇,继续努力
看自己的要求而定嘛!举一反三啦!
我也是遇到这个问题,一上电全部都亮