打印

求教各位Proteus 玩家

[复制链接]
5477|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
如图电路仿真。程序如下。很简单的原理。
问题:连续运行时,为何D1闪亮正常,而7段数码管静态不变?(P2端口电平红蓝正常变化,但显示不变)——应该和D1同样每1.5秒全亮“8”或全灭 2状态变化呀。
      最恼火的是:单步运行时,7段屏显示正常变化。看不出问题。



程序如下:

main()
{
uchar i;
   P3=0xfd;
   P2=0x00;

   while(1)
{
P2=~P2;              
P1=~P1;
Delay(1500);

}
}

相关帖子

沙发
心静自然凉| | 2011-3-11 09:29 | 只看该作者
本帖最后由 心静自然凉 于 2011-3-11 09:30 编辑

别迷恋Proteus,Proteus只是一个传说。
限流电阻没有也能正常运行,你还敢用吗?

你可以试试段选码电平不变,改变位选码的电平

使用特权

评论回复
板凳
McuPlayer| | 2011-3-11 09:47 | 只看该作者
Proteus不行就上真PCB板验证

使用特权

评论回复
地板
hjl123| | 2011-3-11 09:55 | 只看该作者
用共阳试下

使用特权

评论回复
5
刘前辈|  楼主 | 2011-3-11 10:13 | 只看该作者
关键是单步运行时正常。 还有就是P0端口上的发光管D1每 1.5秒闪亮也正常。

所以证明LED不加限流电阻原理上也行。

如果说Proteus 不行,那为什么驱动发光管D1就行,7段屏单步运行时驱动也行,连续就不行。肯定是我什么地方没弄懂。

哪位大侠以前做过?拜谢了。


使用特权

评论回复
6
心静自然凉| | 2011-3-11 10:21 | 只看该作者
本帖最后由 心静自然凉 于 2011-3-11 10:31 编辑
所以证明LED不加限流电阻原理上也行。

首先,对你这句话无语...已经被Proteus毒害了
这软件我用过,本身就存在缺陷,它很多地方的设计以为能给我们省事,其实是害了我们。
就拿这LED来说,实际应用中需要加电阻来限流,而这里不需要,对某些人来说潜意识里会认为不加限流电阻也是行的。

你按照我在2L说的试试看,没准就行了,然后让你丈二和尚摸不着头脑,接着影响你的情绪,工作,生活,越想越不通,越想越恼火,顺手扔了个东西,不小心砸到了几根线,造成短路,爆炸....最后...cao ta ma de Proteus

使用特权

评论回复
7
ljm810010| | 2011-3-11 11:13 | 只看该作者
刘前辈你如实物验证一下,你会发现Proteus是对的,数码管确实不会闪动。

为什么呢?这是你的延时时间太短了,数码管其实在闪动,但闪动频率太高,你看不出来闪烁。
你一定会再问:为什么LED又可以闪呢?
呵呵,这是LED的显示的“刷新率”与数码管不同,与端口上的红蓝点一样,看到的交替闪动,其实两次之间电平已变化了N次,Proteus不可能把每次变化都显示出来,要不然给个1MHz的方波到数码管,电脑的GPU还不累死。即使不累死,电脑显示屏也达不到1MHz的刷新率吧。

你把
delay(1500);
改为
delay(65000);

你就能看到真实的效果。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
ycz9999 + 1
8
刘前辈|  楼主 | 2011-3-11 11:33 | 只看该作者
回7楼。讲得很有道理。延时时间是1.5秒。——一秒钟以上改变一次端口电平,时间一点都不短。P1口上的发光管D1亮灭间隔1.5秒是正确的。

——数码管里面是8个发光管,它的响应频率与发光二极管是一样的,——us 级,数码管手册上写的很清楚。

我把间隔时间改为大N倍秒:
while(1)
{
   P1=~P1;
P2=~P2;
delay(65000);
delay(65000);
delay(65000);
delay(65000);
}

结果一样,数码管驱动电平改变正确,显示不变。
若在P1语句处加一中断,则7段数码屏显示正常。连续则不行。

还有,郭天祥老师的电路跟我差不多,他怎么行?他也没加限流电阻。


使用特权

评论回复
9
ljm810010| | 2011-3-11 11:53 | 只看该作者
RE:刘前辈,不我知你的延时怎样写,我是这样
Delay(unsigned int i)
{
  while(i--);
}

然后Proteus中设定MCU主时钟为12MHz,改Delay(65000)后,仿真测试一切正常。

使用特权

评论回复
10
王利110| | 2011-3-11 12:34 | 只看该作者
main()
{
uchar i;
   P3=0xfd;
   P2=0x00;

   while(1)
{
P2=~P2;   
Delay(1500);      
P1=~P1;
Delay(1500);
}
}
试试这个...............

使用特权

评论回复
11
singleywy| | 2011-3-11 12:49 | 只看该作者
本帖最后由 singleywy 于 2011-3-11 12:51 编辑

按照我的观点,源程序没有问题,问题是用的这个软件,因而,如果是我学习的话,我会立刻抛弃PROTEUS,继而拿一块板子跑跑看

使用特权

评论回复
12
singleywy| | 2011-3-11 12:50 | 只看该作者
所以我个人建议,proteus不用为妙,除非由于资金,或者其他方面的需求

使用特权

评论回复
13
wang_2003| | 2011-3-11 13:53 | 只看该作者
当然用protues仿真时可能存在各方面不好的因素,
但是我觉得对程序的测验还是比较准确的。
这种情况我觉得主要是延时的问题吧

使用特权

评论回复
14
刘前辈|  楼主 | 2011-3-11 13:56 | 只看该作者
本帖最后由 刘前辈 于 2011-3-11 13:57 编辑

9楼大侠真的通过了?太让人兴奋了。我去试试。
确实,这肯定不是Proteus的问题,一个卖几百美金,全世界热门的软件不会连单步和连续都做不好。肯定是我这样用户的问题。

比如,9楼大侠玩起来就正常,到我这就不行。——我也怀疑我的延时程序有问题,只能2秒以内正常,65000反而比15000快了。看汇编却是正常的。

void Delay(uint num)
{
  while( --num );
}

应该一样。问9楼大侠,Proteus 用的是KEIL联调还是离线.hex?在线联调用的是uV2还是uV4?


使用特权

评论回复
15
刘前辈|  楼主 | 2011-3-11 14:08 | 只看该作者
本帖最后由 刘前辈 于 2011-3-11 14:12 编辑

多说一句:这个程序在硬件实验板上是正常的。关键是我答辩时不能用硬件实验板(还要加电源,太小也看不见)。Proteus 电路仿真却可以通过投影放大,所谓虚拟单片机的意义。

要是Proteus连这么点电路都不能仿真,教授还谈什么创建虚拟单片机实验室。
看他们用Proteus 做计数器,秒表,跑表,响应和现实硬件一样的。

加了限流电阻,一样不行。见下图:


使用特权

评论回复
16
ljm810010| | 2011-3-11 14:20 | 只看该作者
15# 刘前辈
偶用的是Proteus 7.5 版本,Keil uV2 离线, 载HEX文件。
delay(1500)时,和你所述故障一样。
delay(65000),一切正常。

使用特权

评论回复
17
ljm810010| | 2011-3-11 14:25 | 只看该作者
顺便说一句,这里要不要限流电阻并不重要,51本身输出高电平的驱动能力很弱,点亮LED还很吃力。而数码管的模型也不等同于实物的数码管,它是一模块,引脚上只需电压驱动,几乎没有电流。

使用特权

评论回复
18
刘前辈|  楼主 | 2011-3-11 15:05 | 只看该作者
而数码管的模型也不等同于实物的数码管,它是一模块,引脚上只需电压驱动,几乎没有电流。


同意17楼。要我设计也是这样,实用中有些大型发光管确实压降很大,不用限流电阻。内阻很大相当于恒流源。

我用Delay(65000)离线也不行。


使用特权

评论回复
19
XIANSir| | 2011-3-11 15:27 | 只看该作者
18# 刘前辈
如果前辈的东西不需要保密的话,何不传上来让大家各自试试呢??如果有人装了Proteus,下下来前辈的东西运行一下也是很简单的事情!!

使用特权

评论回复
20
刘前辈|  楼主 | 2011-3-11 15:29 | 只看该作者

感谢16楼ljm810010大侠

本帖最后由 刘前辈 于 2011-3-11 15:39 编辑

多谢16楼ljm810010大侠,原因正如你所说,是延时程序问题,电路没错。把延时程序写好就成功了!再次感谢,真正帮我实验了一把。辛苦了。还是旁观者清。

下面是一个12M AT89V51比较精确的延时程序,延时0~65秒。
void Delay(unsigned int ms)        
// 延时程序
{
   unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}
这样:程序和7段显示屏 100ms都能反应了:
uchar code  LEDData[ ] = { 0xc0, 0xf6, 0xA4, 0xb0, 0x99, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff};   // 编码要修改。

  while(1)
{
P2=LEDData[(i++)%10] ;              
P1=~P1;
Delay(100);
}

同时感谢楼上所有 Proteus 玩家。Proteus 是很好的软件,几乎所有BUG都是我自己没玩好。不会玩的时候上论坛来请教讨论一般,毕竟旁观者清。自己只有一个头脑和想法,容易钻死胡同。


使用特权

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

本版积分规则

个人签名:做自己所热爱的,并热爱自己所做的。

24

主题

1038

帖子

4

粉丝