hf5542 发表于 2010-11-21 09:03:56

为什么我的程序在Proteus仿真不出来?

奇怪的现象 我的这个程序不能再Proteus中运行
#include<reg52.h>
#include <intrins.h>                //调用库函数,这个里面有我们要用的循环移动功能函数
#define uchar unsigned char

void delay(uchar x)
{
        uchar a,b;
        for(a=x;a>0;a--)
                for(b=200;b>0;b--);       
}
                                               
void main()
{
        uchar temp;
        temp=0xfe;
        while(1)
        {
                P2= _crol_(temp,1);         //temp后面的1,表示左移的位数。如果写2,表示一次移动两位。
                temp=P2;
                delay(200);       
        }       
}

而下面这个程序确能再Proteus中运行
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};                //定义八个灯的工作状态。               
void delay(uint);
void main()
{
        uchar i;
        delay(100);
        while(1)                                                //死循环,让程序不断的重复。
        {               
                for(i=0;i<8;i++)                        //for循环让程序跑八次。
                        {
                                delay(30);
                                P2=table;                //分八次分别取八个灯的状态
                                delay(30);               
                        }
        }
                       
}
void delay(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=1000;b>0;b--);
}
这是为什么啊 前辈们帮帮忙!!!

hf5542 发表于 2010-11-21 09:05:38

回复【楼主位】hf5542 邓超
-----------------------------------------------------------------------

这两个程序是同一种功能 就是流水灯为什么第一个程序确不能在Proteus中呢?

millwood0 发表于 2010-11-21 09:28:54

"奇怪的现象 "

whenever that happens, make sure you are not the problem first.

hf5542 发表于 2010-11-21 13:28:32

这程序在51实验板都能实现啊

hf5542 发表于 2010-11-26 22:45:00

为什么呢?

millwood0 发表于 2010-11-26 22:53:36

"为什么呢? "

because you have no clue about what you are doing.

to prove my point, here is your code simulated.

http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_600677Z48G1Y.PNG
(原文件名:32. c51 crol.PNG)

is it too much to ask that you stop being too stupid?

youjingya 发表于 2010-11-28 22:26:44

有时候可能是软件问题,可以直接在板子上试下,也可能是没有加上拉电阻!

zhxzhx 发表于 2010-11-29 00:03:24

P2= _crol_(temp,1);//temp后面的1,表示左移的位数。如果写2,表示一次移动两位。
temp=P2;
主要是这个temp=P2; ,在仿真中带上负载后读回来的不是_crol_(temp,1)的值,你改成
temp=_crol_(temp,1);
P2=temp;试一试

millwood0的仿真IO没有带负载,特性和带负载的不一样

millwood0 发表于 2010-11-29 04:49:31

"millwood0的仿真IO没有带负载,特性和带负载的不一样 "

the same code,driving 470ohm loads.

http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_601062I5Y2P2.PNG
(原文件名:C51 crol with load.PNG)

zhxzhx 发表于 2010-11-30 23:06:31

【8楼】 millwood0
你接实际电路看看,全是低电平,仿真和实际是一样的,你的Proteus版本是多少?我的7.2SP3

zhxzhx 发表于 2010-12-1 03:51:28

暂停,我的两个机器上proteus居然仿真结果不一样!

pcrack 发表于 2010-12-2 12:26:13

回复【10楼】zhxzhx 一丁
暂停,我的两个机器上proteus居然仿真结果不一样!
-----------------------------------------------------------------------

不要把Proteus当真,还是以板子为主,Proteus玩玩即可

hf5542 发表于 2010-12-3 15:43:49

JQ_Lin 发表于 2010-12-3 19:44:00

回复【11楼】pcra_ck
回复【10楼】zhxzhx 一丁
暂停,我的两个机器上proteus居然仿真结果不一样!
-----------------------------------------------------------------------
不要把proteus当真,还是以板子为主,proteus玩玩即可
-----------------------------------------------------------------------

事出必有因。

zhxzhx 发表于 2010-12-4 02:56:46

JQ_Lin原因找到,不关Proteus的事,是C51优化的错误.
这是源程序:
void main()
{
uchar temp;
temp=0xfe;
while(1)
{
   temp=_crol_(temp,1);
   P2 = temp;
}
}

开优化:
             ; FUNCTION main (BEGIN)
;---- Variable 'temp' assigned to Register 'R6' ----
0000 7EFE          MOV   R6,#0FEH
0002         ?C0001:
0002 7801          MOV   R0,#01H
0004 AF06          MOV   R7,AR6
0006 EF            MOV   A,R7
0007 08            INC   R0
0008 8001          SJMP    ?C0005
000A         ?C0004:
000A 23            RL      A
000B         ?C0005:
000B D8FD          DJNZ    R0,?C0004
000D F5A0          MOV   P2,A            ; 显然,A的值没有保存回R6
000F 80F1          SJMP    ?C0001
0011 22            RET
             ; FUNCTION main (END)

不开优化的
             ; FUNCTION main (BEGIN)
0000 7500FER   MOV   temp,#0FEH
0003         ?C0001:
0003 AF00    R   MOV   R7,temp
0005 7801          MOV   R0,#01H
0007 EF            MOV   A,R7
0008 08            INC   R0
0009 8001          SJMP    ?C0005
000B         ?C0004:
000B 23            RL      A
000C         ?C0005:
000C D8FD          DJNZ    R0,?C0004
000E FF            MOV   R7,A
000F 8F00    R   MOV   temp,R7   ;这个就正确了
0011 8500A0R   MOV   P2,temp
0014 80ED          SJMP    ?C0001
0016 22            RET
             ; FUNCTION main (END)

zhxzhx 发表于 2010-12-4 03:01:15

kiel 7.5的优化没有这个问题,我的两个机器Kiel版本不一样!
             ; FUNCTION main (BEGIN)
;---- Variable 'temp' assigned to Register 'R7' ----
0000 7FFE            MOV   R7,#0FEH
0002         ?C0001:
0002 7801            MOV   R0,#01H
0004 EF                MOV   A,R7
0005 08                INC   R0
0006 8001            SJMP    ?C0005
0008         ?C0004:
0008 23                RL      A
0009         ?C0005:
0009 D8FD            DJNZ    R0,?C0004
000B FF                MOV   R7,A    ;正确的
000C F5A0            MOV   P2,A
000E 80F2            SJMP    ?C0001
             ; FUNCTION main (END)

millwood0 发表于 2010-12-4 08:29:14

"是C51优化的错误. "

it is a dumb programmer who doesn't understand compiler optimization and robust coding.

zhxzhx 发表于 2010-12-6 01:12:44

【16楼】 millwood0

这个不应该是程序员的问题,直接就是C51的BUG,因为在高版本的KEIL中已经没有这个问题了,意味着KEIL也发现这个问题了!

void main()
{
uchar temp;
temp=0xfe;
while(1)
{
   temp=_crol_(temp,1);
   P2 = temp;
}
}

另外,就这个代码,你来谈谈编译器的优化和鲁棒性问题.要说dumb programmer 也是Keil实现_crol_()函数的程序员,他没有实现 robust coding
页: [1]
查看完整版本: 为什么我的程序在Proteus仿真不出来?