用51单片机+74HC595控制LED,程序怎样实现整体渐变?(595不接OE脚)
现在我就只能控制LED亮或灭,看到别人可以写出让LED渐变的程序,自己很想搞明白,但是熬了几个晚上都写不出来,哎、、、求高手帮忙啊,给个思路或程序模板也行,分数不是问题!...
现在我就只能控制LED亮或灭,看到别人可以写出让LED渐变的程序,自己很想搞明白,但是熬了几个晚上都写不出来,哎、、、求高手帮忙啊,给个思路或程序模板也行,分数不是问题!
期待高人出现啊,74HC595的0E脚接地,是可以写出LED整体渐变的程序的,这个我见过别人做的效果,应该是程序写法的问题,高人快快来啊,有程序模板或好的程序参考也可发我邮箱365465732@QQ。COM, 分数继续往上加+++++++ 展开
期待高人出现啊,74HC595的0E脚接地,是可以写出LED整体渐变的程序的,这个我见过别人做的效果,应该是程序写法的问题,高人快快来啊,有程序模板或好的程序参考也可发我邮箱365465732@QQ。COM, 分数继续往上加+++++++ 展开
6个回答
展开全部
如果你是静态显示,那么灰度是没戏了。如果是动态显示,那就先点亮一个LED,再将595的数据刷新,令所有的LED灭掉,然后亮第二个LED,再将595的数据刷新,令所有的LED灭掉,如此循环,来控制LED点亮的占空比就可以控制灰度了。但这个办法的关键是你刷新的频率一定要足够高,不然就会产生闪烁。
其实,你电路中最大的问题就是OE脚被你锁死了,通常的产品都是靠这个引脚来控制灰度的。另外,595到LED之间最好再加一级驱动芯片,例如,2003,2803,否则595驱动电流不足,很容易烧坏。
其实,你电路中最大的问题就是OE脚被你锁死了,通常的产品都是靠这个引脚来控制灰度的。另外,595到LED之间最好再加一级驱动芯片,例如,2003,2803,否则595驱动电流不足,很容易烧坏。
展开全部
建议采用pwm控制 ,就是 脉宽调制。
把led按照周期开启和关闭,但是每个周期开启的时间受到控制,你就能看到渐变效果了。
实施方案:最简单就是设定一个控制变量,每个周期开始,检查该变量,不为0则开启led并缓存该变量,在周期内的每个节拍时间,对缓存值进行递减,减到0,关闭led。
如果想多个同时控制,就多设几个变量,分别计数控制pwm就可以了。
把led按照周期开启和关闭,但是每个周期开启的时间受到控制,你就能看到渐变效果了。
实施方案:最简单就是设定一个控制变量,每个周期开始,检查该变量,不为0则开启led并缓存该变量,在周期内的每个节拍时间,对缓存值进行递减,减到0,关闭led。
如果想多个同时控制,就多设几个变量,分别计数控制pwm就可以了。
追问
好像不是我想要的答案。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK=P1^7;
sbit STB=P1^6;
sbit DATA=P1^5;
sbit OE=P1^2;
void init_sys();
void delay(uint t);
void delayms(uint t);
unsigned char ZKB;
void send_data(uint temp1,temp2)
{
uchar i;
CLK=0;
STB=0;
for(i=0;i<8;i++)
{
if(temp1>=0x80)DATA=1;
else DATA=0;
CLK=0;
delay(15);
CLK=1;
delay(15);
temp1=temp1<<1;
}
for(i=0;i<8;i++)
{
if(temp2>=0x80)DATA=1;
else DATA=0;
CLK=0;
delay(15);
CLK=1;
delay(15);
temp2=temp2<<1;
}
STB=0;
delay(15);
STB=1;
delay(15);
CLK=0;
STB=0;
DATA=0;
}
void delayms(uint t)
{
uint x,y;
for(x=t;x>0;x--)
for(y=100;y>0;y--);
}
void delay(unsigned int t)
{
unsigned int i;
for(i=0;i<t;i++)
{
;
}
}
void init_sys()
{
TMOD=0x01;
TH0=0xFF;
TL0=0XF6;
TR0=1;
ET0=1;
EA=1;
}
void timer0(void) interrupt 1
{
static uchar click=0;
TH0=0xFF;
TL0=0xF6;
++click;
if (click>=100)
click=0;
if (click<=ZKB)
OE=0;
else
OE=1;
}
void main ()
{
init_sys();
send_data(0x00,0x00);
while(1)
{
for(ZKB=0;ZKB<100;ZKB=ZKB+1)
{
delayms(100);
}
for(ZKB=100;ZKB>0;ZKB=ZKB-1)
{
delayms(100);
}
}
}
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK=P1^7;
sbit STB=P1^6;
sbit DATA=P1^5;
sbit OE=P1^2;
void init_sys();
void delay(uint t);
void delayms(uint t);
unsigned char ZKB;
void send_data(uint temp1,temp2)
{
uchar i;
CLK=0;
STB=0;
for(i=0;i<8;i++)
{
if(temp1>=0x80)DATA=1;
else DATA=0;
CLK=0;
delay(15);
CLK=1;
delay(15);
temp1=temp1<<1;
}
for(i=0;i<8;i++)
{
if(temp2>=0x80)DATA=1;
else DATA=0;
CLK=0;
delay(15);
CLK=1;
delay(15);
temp2=temp2<<1;
}
STB=0;
delay(15);
STB=1;
delay(15);
CLK=0;
STB=0;
DATA=0;
}
void delayms(uint t)
{
uint x,y;
for(x=t;x>0;x--)
for(y=100;y>0;y--);
}
void delay(unsigned int t)
{
unsigned int i;
for(i=0;i<t;i++)
{
;
}
}
void init_sys()
{
TMOD=0x01;
TH0=0xFF;
TL0=0XF6;
TR0=1;
ET0=1;
EA=1;
}
void timer0(void) interrupt 1
{
static uchar click=0;
TH0=0xFF;
TL0=0xF6;
++click;
if (click>=100)
click=0;
if (click<=ZKB)
OE=0;
else
OE=1;
}
void main ()
{
init_sys();
send_data(0x00,0x00);
while(1)
{
for(ZKB=0;ZKB<100;ZKB=ZKB+1)
{
delayms(100);
}
for(ZKB=100;ZKB>0;ZKB=ZKB-1)
{
delayms(100);
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在等全亮的情况下,用pwm来控制 OE这个脚,调整PWM的占空比来实现led灯的渐亮效果,当然pwm的频率要稍微高些,免得led灯闪烁。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
利用PWM方法,可以实现LED亮度渐变,但是在PROTEUS中观察,并不是很鲜明。
更多追问追答
追问
我焊接又硬件电路,
可是74HC595怎样用PWM来控制???
追答
/****************************************************
* 51单片机模拟PWM输出控制灯的10个亮度级 ,还可驱动小舵机
****************************************************/
#include
#define uint unsigned int
#define uchar unsigned char
uchar PWM_T = 0; //占空比控制变量
//-------------------------------------------------
void main(void)
{
bit flag = 1; //渐亮渐熄.
uint n;
TMOD = 0x02; //T0,定时模式2
TH0 = 241; //15us@12MHz
TL0 = 241; //
TR0 = 1; //启动.
ET0 = 1; //允许T0中断.
EA = 1; //允许总中断.
while(1) {
if(flag == 1) PWM_T++; //递增, 渐亮.
else PWM_T--; //递减, 渐熄.
if(PWM_T >= 10) flag = 0; //为10,改为递减.
if(PWM_T == 0) flag = 1; //到 0,改为递增.
for(n = 0; n < 300; n++); //延时.
}
}
//-------------------------------------------------
///////////////////定时器0中断模拟PWM////////////////////
timer0() interrupt 1 using 2
{
static uchar t; //静态变量t, 中断次数.
t++; //
if(t == 10) { //中断了10次.
P1 = 0x00; //就开灯.
t = 0;
}
else if(t == PWM_T)
P1 = 0xff;
//不到10次,但是到了关灯的次数,就关灯.
}
//-------------------------------------------------
你把上述程序中的P1口输出,改成你的对595输出,试试看。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询