打印

有趣的程序

[复制链接]
2037|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lml198694|  楼主 | 2007-11-27 21:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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后应该为低电平了啊!!"

无语啊

使用特权

评论回复
5
computer00| | 2007-11-28 10:24 | 只看该作者

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

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

不过,51的IO口有个特点就是准双响的,你输出1,在读回来是0倒是有可能的,可能外面
的引脚把它拉低了。

使用特权

评论回复
6
officeants| | 2007-11-28 10:37 | 只看该作者

路过。

2楼: 执行完后,没有指令修改P0.1的内容,当然为1
没看懂

使用特权

评论回复
7
xwj| | 2007-11-28 10:58 | 只看该作者

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

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

只会一直执行P0_1=1;

使用特权

评论回复
8
computer00| | 2007-11-28 11:30 | 只看该作者

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

但是C51的不是,它在main函数调用时,并不是用call,而是LJMP,然后在main函数的末尾来个RET,
这时堆栈内容是未知的,就不知道RET到哪里去了。如果刚好前面两个字节是0还好,就RET到开始去了,
如果不是,那肯定就飞拉~~~~

使用特权

评论回复
9
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脚连接起来,结果两个管脚均为低电平.

使用特权

评论回复
10
zmbnj| | 2007-11-28 12:19 | 只看该作者

有趣的你

使用特权

评论回复
11
dyw07| | 2007-11-28 19:44 | 只看该作者

!!

如果把程序直接烧到51会不会跑飞啊????
各位大哥指点一下

使用特权

评论回复
12
mohanwei| | 2007-11-28 20:11 | 只看该作者

果然很有趣……

使用特权

评论回复
13
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那个地址去了........

使用特权

评论回复
14
renrongwen| | 2007-11-28 20:41 | 只看该作者

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

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

   P0_1=1;
   while(1)
   {Delay(5);}
}

使用特权

评论回复
15
taoyubai| | 2007-11-28 20:43 | 只看该作者

呵呵,路过,

使用特权

评论回复
16
dyw07| | 2007-11-28 21:15 | 只看该作者

回复14楼

使用特权

评论回复
17
lml198694|  楼主 | 2007-11-28 21:20 | 只看该作者

我顶

回14楼,在调试中,P0_1一直就为高点平啊.有什么不同吗?

使用特权

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

本版积分规则

20

主题

119

帖子

0

粉丝