为什么我的程序在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 邓超
-----------------------------------------------------------------------
这两个程序是同一种功能 就是流水灯为什么第一个程序确不能在Proteus中呢? "奇怪的现象 "
whenever that happens, make sure you are not the problem first. 这程序在51实验板都能实现啊 为什么呢? "为什么呢? "
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? 有时候可能是软件问题,可以直接在板子上试下,也可能是没有加上拉电阻! P2= _crol_(temp,1);//temp后面的1,表示左移的位数。如果写2,表示一次移动两位。
temp=P2;
主要是这个temp=P2; ,在仿真中带上负载后读回来的不是_crol_(temp,1)的值,你改成
temp=_crol_(temp,1);
P2=temp;试一试
millwood0的仿真IO没有带负载,特性和带负载的不一样 "millwood0的仿真IO没有带负载,特性和带负载的不一样 "
the same code,driving 470ohm loads.
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_601062I5Y2P2.PNG
(原文件名:C51 crol with load.PNG) 【8楼】 millwood0
你接实际电路看看,全是低电平,仿真和实际是一样的,你的Proteus版本是多少?我的7.2SP3 暂停,我的两个机器上proteus居然仿真结果不一样! 回复【10楼】zhxzhx 一丁
暂停,我的两个机器上proteus居然仿真结果不一样!
-----------------------------------------------------------------------
不要把Proteus当真,还是以板子为主,Proteus玩玩即可 额 回复【11楼】pcra_ck
回复【10楼】zhxzhx 一丁
暂停,我的两个机器上proteus居然仿真结果不一样!
-----------------------------------------------------------------------
不要把proteus当真,还是以板子为主,proteus玩玩即可
-----------------------------------------------------------------------
事出必有因。 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) 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) "是C51优化的错误. "
it is a dumb programmer who doesn't understand compiler optimization and robust coding. 【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]