有趣的程序

[复制链接]
3758|16
 楼主| lml198694 发表于 2007-11-27 21:26 | 显示全部楼层 |阅读模式
#include<reg52.h>
sbit P0_1=P0^1;
main()

   P0_1=1;
}
为什么仿真P0_1脚一直为高电平。
照程序来,执行P0_1=1后应该为低电平了啊!!
dai_weis 发表于 2007-11-27 21:28 | 显示全部楼层

执行完后,没有指令修改P0.1的内容,当然为1了

Swd21ic 发表于 2007-11-27 21:50 | 显示全部楼层

!!

好有趣..~_~
ayb_ice 发表于 2007-11-28 07:56 | 显示全部楼层

"照程序来,执行P0_1=1后应该为低电平了啊!!"

无语啊
computer00 发表于 2007-11-28 10:24 | 显示全部楼层

哈哈,楼主的程序最后还要跑飞了~~~后面应该加个while(1);

这就好比一个变量X,给它赋值之后它就不再变了,例如X=3;这之后X都是3了,只要你不改它。

不过,51的IO口有个特点就是准双响的,你输出1,在读回来是0倒是有可能的,可能外面
的引脚把它拉低了。
officeants 发表于 2007-11-28 10:37 | 显示全部楼层

路过。

2楼: 执行完后,没有指令修改P0.1的内容,当然为1
没看懂
xwj 发表于 2007-11-28 10:58 | 显示全部楼层

呵呵,可能LZ认为P0_1=1;的作用是让IO口变低电平

蛋蛋的说法不对,Keil对main()做了特殊处理,里面已经是死循环了,飞不了的

只会一直执行P0_1=1;
computer00 发表于 2007-11-28 11:30 | 显示全部楼层

那要看什么了,keil CARM是从main返回后就死循环了

但是C51的不是,它在main函数调用时,并不是用call,而是LJMP,然后在main函数的末尾来个RET,
这时堆栈内容是未知的,就不知道RET到哪里去了。如果刚好前面两个字节是0还好,就RET到开始去了,
如果不是,那肯定就飞拉~~~~
change_p 发表于 2007-11-28 11:37 | 显示全部楼层

什么意思

执行P0_1 = 1;对应的管脚为高电平;执行P0_1 = 0对应管脚为低电平.
一般可以这么理解,51的io口是绝对低电平,相对高电平.
如将P0_0置为1,P0_1置为0,并将P0_0 与 P0_1脚连接起来,结果两个管脚均为低电平.
zmbnj 发表于 2007-11-28 12:19 | 显示全部楼层

有趣的你

dyw07 发表于 2007-11-28 19:44 | 显示全部楼层

!!

如果把程序直接烧到51会不会跑飞啊????
各位大哥指点一下
mohanwei 发表于 2007-11-28 20:11 | 显示全部楼层

果然很有趣……

computer00 发表于 2007-11-28 20:36 | 显示全部楼层

很巧,你这个程序下到单片机里去不会跑飞

因为没有申请全局变量,所以SP为7。这时堆栈中的内容为0,RET时就会回到地址0去。

但是如果你申请一个变量并给它赋初值,那么就可能跑飞了,例如

#include<reg52.h>
sbit P0_1=P0^1;

unsigned int x=0x5144;   //吾要试试

main()

   P0_1=1;
}



那么在main返回时,应该就跳到0x4451那个地址去了........
renrongwen 发表于 2007-11-28 20:41 | 显示全部楼层

后面跟个while(1)死循环试试

#include<reg52.h>
sbit P0_1=P0^1;
main()

   P0_1=1;
   while(1)
   {Delay(5);}
}
taoyubai 发表于 2007-11-28 20:43 | 显示全部楼层

呵呵,路过,

dyw07 发表于 2007-11-28 21:15 | 显示全部楼层

回复14楼

 楼主| lml198694 发表于 2007-11-28 21:20 | 显示全部楼层

我顶

回14楼,在调试中,P0_1一直就为高点平啊.有什么不同吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

119

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部