[51单片机] IO口咨询

[复制链接]
2500|9
 楼主| zhu070 发表于 2013-8-1 19:33 | 显示全部楼层 |阅读模式
请问下
main()
{  P1^1 = 1;
    while(1);
  }

main()
{  while(1)
    { P1^1 = 1;}
  }

这两种写法有什么区别吗?
NE5532 发表于 2013-8-1 20:26 | 显示全部楼层
当然有啊,第一个对P1口只操作一次,第二个是一直在操作。
 楼主| zhu070 发表于 2013-8-1 20:29 | 显示全部楼层
NE5532 发表于 2013-8-1 20:26
当然有啊,第一个对P1口只操作一次,第二个是一直在操作。

嗯,这两种操作对单片机有什么影响吗?比如功耗,IO口电平的稳定性。
NE5532 发表于 2013-8-1 20:37 | 显示全部楼层
对端口输出有影响一个是只操作一次,一个是一直操作。功耗的影响上微乎其微,你还是搞清楚自己想干什么,按照你想干的事情写好了,没有方案的优劣讨论可以离开需求的。
568581185 发表于 2013-8-2 10:09 | 显示全部楼层
main()
{  P1^1 = 1;//只对P1.1进行一次操作
    while(1);//程序停止在此处
  }

main()
{  while(1)
    { P1^1 = 1;}//死循环内执行P1.1的操作,是一直执行。
  }
minDragon 发表于 2013-8-2 11:59 | 显示全部楼层
大家都说的很对也很清楚了~不知道楼主想搞懂什么~要做些什么~
joyme 发表于 2013-8-2 16:55 | 显示全部楼层
从可靠性上分析,一直操作的可能要好点,如果这个口受外界影响,下面那种代码可以自动恢复
 楼主| zhu070 发表于 2013-8-3 08:52 | 显示全部楼层
我现在是通过按键中断,在中断程序中,将P1^1口置高电平。我在想,是每次进入中断后都执行P1^1 = 1,还是判断P1^1是否是高电平,不是再执行P1^1 = 1。
NE5532 发表于 2013-8-4 07:54 | 显示全部楼层
zhu070 发表于 2013-8-3 08:52
我现在是通过按键中断,在中断程序中,将P1^1口置高电平。我在想,是每次进入中断后都执行P1^1 = 1,还是判 ...

你不是黄金圣斗士,不可能以光速按键,所以按键是一个频率很低的事情,所以你可以每次都置。如果考虑到51是准双向口,如果编译器采用了读修改写整个端口的方式,可能造成有的脚被意外修改,你可以落实一下汇编的端口位操作是否只针对单个口,是的话,就用在线汇编来写,不是的话,在RAM里用一个变量保存端口状态,先在RAM里修改了,再送出端口。

反复操作要看是哪种单片机,51这种端口,越操作越危险,近代的其他单片机都有锁存器,有的还有回读的Latch寄存器,就不存在这个风险。所以没有什么方案是最优的,只有自己搞懂才行。

另外,说外部干扰要强到影响片内寄存器的程度,估计旁边的人都已经挂了,搞开发不能想当然。
 楼主| zhu070 发表于 2013-8-5 08:20 | 显示全部楼层
NE5532 发表于 2013-8-4 07:54
你不是黄金圣斗士,不可能以光速按键,所以按键是一个频率很低的事情,所以你可以每次都置。如果考虑到51 ...

谢谢啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

15

帖子

0

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