打印

菜鸟问题:有关LED灯的小问题

[复制链接]
3193|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yeshaozhu|  楼主 | 2009-12-13 17:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yeshaozhu 于 2009-12-13 17:44 编辑

问题1:用89c51芯片控制LED灯如图所示(另一端连到单片机P2^6口上)

此时,在主函数里写P2^6=0,LED等只闪烁了一下就暗了(程序中没有其他对该IO口操作的语句)。后来如下图接法,状态正确。我想这样接会直接烧坏LED(当时是因为接错了才接成这样的),但是为什么会闪烁一下就暗了呢?



问题2:在Proteus里仿真的时候,对数码管进行动态显示操作,总是不能正确显示,如想显示76543210,就出现了如下情况:

同样的程序放在实物上测试显示稳定,能实现效果。程序显示部分如下:
void display()
{ uchar i;
  for(i=0;i<8;i++)   //为了让8个数码管轮流亮一遍过去
  {
   P0=b;//b中存放的为数字的编码,P0口为段选
   P2=i;//P2口为位选
   delay(2);
  }
}
若将程序改成如下(加长延时时间):
void display()
{ uchar i;
  for(i=0;i<8;i++)   //为了让8个数码管轮流亮一遍过去
  {
   P0=b;//b中存放的为数字的编码,P0口为段选
   P2=i;//P2口为位选
   delay(2000);
  }
}
则依次出现如下状态:



……

请问为什么会出现这种现象?怎么样才能消除这种现象呢?

相关帖子

沙发
Coolgo| | 2009-12-13 18:41 | 只看该作者
我觉得是因为上电后,led就烧坏了,所以一闪而过。我也是菜鸟,坐等大侠出现。

使用特权

评论回复
板凳
chunyang| | 2009-12-13 18:59 | 只看该作者
LED问题是你的程序有误,仿真需要仿真元件和实物具有相同的特性和操作方法,编程要针对特定的仿真元件,否则就不是“仿真”了,**和鸭都是鸟,你不能用**来仿真鸭是怎么游泳的。

使用特权

评论回复
地板
RISCM| | 2009-12-13 19:23 | 只看该作者
我记得S51是需要上拉电阻的~~
我也是菜鸟。

使用特权

评论回复
5
hezengliang| | 2009-12-13 19:49 | 只看该作者
电流过大,只闪了一下。就烧毁了呀。

使用特权

评论回复
6
chunyang| | 2009-12-13 20:49 | 只看该作者
除非MCU IO口的驱动能力足够,否则是不会烧毁LED的,因IO内阻较大的关系,IO本身也不会轻易烧毁,楼主说IO用的是P2口,则基本上可以判断出MCU是普通51系的,其IO驱动能力有限,即使是增强型的也要通过相关设置后才能打开强下拉输出功能,从楼主的表述和问题的深度而言,即使MCU支持楼主也多半不会进行相关操作,所以还是去检查程序为先吧。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
yeshaozhu + 1
7
yeshaozhu|  楼主 | 2009-12-13 21:00 | 只看该作者
本帖最后由 yeshaozhu 于 2009-12-13 21:08 编辑

回复2楼和5楼:经过测试,LED并没有烧坏。。。。
回复6楼:大致看明白意思了,谢谢!

申明:问题1和问题2无关!
还有问题2。。。。。。

使用特权

评论回复
8
chunyang| | 2009-12-13 21:16 | 只看该作者
问题2仍然是编程错误。

使用特权

评论回复
9
yeshaozhu|  楼主 | 2009-12-13 21:21 | 只看该作者
能简单提示一下如何修改程序才能正常运行吗? 8# chunyang

使用特权

评论回复
10
不亦心| | 2009-12-13 22:54 | 只看该作者
位选搞错了,
试一下LS的移位法

使用特权

评论回复
11
电子学徒| | 2009-12-14 08:49 | 只看该作者
一般红色LED,额定电压在2V左右,如果2端电压超过就会出现楼主所说的情况,但即使电压是10V闪过后一般也不会烧毁.

使用特权

评论回复
12
zhaoyu2005| | 2009-12-14 09:02 | 只看该作者
我来回答LZ的问题吧,估计春阳大侠不用proteus:
1.就是仿真软件,判断为电流超限了,类似的里边的灯泡也能烧毁;另外proteus仿真软件,单片机的口驱动并不是严格的20mA(25mA),有可能是一个很大的的值,之前仿真过一个电路,加了个电阻,状态不对,和实际电路状态不符,具体的记不清了
2.还是仿真软件的问题,我不知道怎么能让他正常,但是我用锁存器加上一路静态显示(只是锁存数码管端口的数据,就是验证程序),就发现,动态扫描不对,但是静态显示是对的,由此猜测是仿真软件问题

使用特权

评论回复
13
zhenxing2000| | 2009-12-14 12:58 | 只看该作者
1.led点亮后加个while(1); 看一下led的状态。
1.建议数码管前用138跟245联合使用,或者用地址锁存器控制数码管。

使用特权

评论回复
14
xuxindd| | 2009-12-14 15:44 | 只看该作者
多位数码管扫描的时候一般要在点亮下一位时候先关掉前一位  这样能避免那种影子   我原来也跟着差不多,后来有人指点后就好了  特别是仿真的时候

使用特权

评论回复
15
yeshaozhu|  楼主 | 2009-12-14 18:04 | 只看该作者
本帖最后由 yeshaozhu 于 2009-12-14 18:06 编辑

恩,谢谢各位,学到很多东西。。。。
LS各位的方法我都会试一试,呵呵O(∩_∩)O~
回复12、13楼:按照你说的方法进行移位,若将延时缩短(总不能眼睛就能看出是一位一位的显示吧),依然会有影子。
回复16、17楼:试过用138位选,效果不理想。。。。。。。。
由此我也想说和15楼第二点所述的那个结论:猜测是仿真软件问题。
不知道Proteus的数码管显示动态问题是不是初学者很难解决。。。。:L

使用特权

评论回复
16
xuxindd| | 2009-12-14 18:14 | 只看该作者
应该不是软件的问题,反正我在proteus上用扫描数码管时,不先手动关掉上一位显示的话,肯定会有影子,不管延时怎么调,我用的mega16

使用特权

评论回复
17
yeshaozhu|  楼主 | 2009-12-14 18:21 | 只看该作者
19# xuxindd
手动关显示怎么弄啊?没很明白意思。。。。还望请教,谢谢!

使用特权

评论回复
18
蓝色的云| | 2009-12-14 20:31 | 只看该作者
19# xuxindd  
手动关显示怎么弄啊?没很明白意思。。。。还望请教,谢谢!
yeshaozhu 发表于 2009-12-14 18:21


手动关显示,猜测是显示下一个数字之前,位选和段选先输出让数码管不亮的信号:o

使用特权

评论回复
19
蓝色的云| | 2009-12-14 20:51 | 只看该作者
发个例子,不知道对楼主有没帮助
 
#include <reg52.h>
unsigned char const display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 共阴段码01234567
unsigned char code seg[]={0,1,2,3,4,5,6,7};//位码
////////////////////////////////////////////////////////
void delay(unsigned int cnt)
{
while(--cnt);
}
///////////////////////////////////////////////////////
main()
{
unsigned char i;
while(1)
      {
     P2=seg[i];  //显示位码
     P0=display[i];//显示段码
     delay(200);
    i++;
    if(8==i)    //检测8位扫描完全?
      i=0;
      }
}



这是先传位码,后传段码
效果图

截图00.jpg (115.02 KB )

截图00.jpg

使用特权

评论回复
20
蓝色的云| | 2009-12-14 20:53 | 只看该作者
把上面的例子改一下

P2=seg;  //显示位码

P0=display;//显示段码

位置改成
P0=display;//显示段码
P2=seg;  //显示位码

先传段码,后传位码
效果图

截图01.jpg (100.51 KB )

截图01.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:菜鸟要有坚定的信念不懈追求,各位高手不吝赐教!邮箱:txyeshaozhu@163.com

5

主题

32

帖子

0

粉丝