[STC单片机] 初学单片机,请教io输出问题

[复制链接]
2550|19
 楼主| itxyuan 发表于 2016-12-12 08:05 来自手机 | 显示全部楼层 |阅读模式
下面是随便敲了个代码意思。在51里运行起来,为什么P1.1出来的方波高电平和低电平都占了快500us了,不应该是一个机器周期么?不解
void main()

      P1.1=~P1.1;     


但是这样写:
void main()

P1.1=1
delay100us();
P1.1=0;
_nop_();
P1.1=1;
这时看到的低电平就是1-2us
请指教!
NE5532 发表于 2016-12-12 08:40 | 显示全部楼层
你写的是C语言,不是汇编,一句C会被编译成N条汇编,你写纯汇编,时间就准确了。
ayb_ice 发表于 2016-12-12 08:58 来自手机 | 显示全部楼层
标准51的指令有1,2,4三种机器周期,何况还需要跳转
 楼主| itxyuan 发表于 2016-12-12 09:05 来自手机 | 显示全部楼层
我想不明白的是前面那个主程序里面我只写了一句取反,为什么要耗时500us
NE5532 发表于 2016-12-12 09:27 | 显示全部楼层
itxyuan 发表于 2016-12-12 09:05
我想不明白的是前面那个主程序里面我只写了一句取反,为什么要耗时500us

上面已经说了,你C语言写一句,编译成汇编会变成N句。
jackhwang 发表于 2016-12-12 10:17 | 显示全部楼层
void main()

      P1.1=~P1.1;     

是这个时候,P1.1输出高低电平各500us吗?
一:P1.1=~P1.1;这条语句一定不是一个机器周期,你编译后可以看到相应的汇编代码;
二:P1.1输出高低电平各500us,这个时间很单片机频率有关。
aerwa 发表于 2016-12-13 08:35 来自手机 | 显示全部楼层
不管汇编了,从语法上讲单节机在io口上来说应该出个方波,但肯定不是一个机器周期,51编译器有内部处理好的汇编语句但时间不应该是大到500us吧。排除时钟,中断,看门狗复位,这个试验没用51做过,但我用430做过没见这种情况。
aerwa 发表于 2016-12-13 08:38 来自手机 | 显示全部楼层
还有种情况是不是你观察的时候示波器触发没调好,导致看不到细节。按道理不应该大到500us
mcu5i51 发表于 2016-12-13 09:05 | 显示全部楼层
芯片复位
系统运行环境设置
清除内存
跳转到C入口(_main)
void main()

      P1.1=~P1.1;     取反,好像只要一个CPU周期
}返回,跳转到地址0x0000,重复上面步骤

liu123liu 发表于 2016-12-13 10:13 | 显示全部楼层
你只有一个翻转,上电瞬间不能看到波形吧。while(1){  P1.1=~P1.1;}。你的方波估计应该是看门狗导致的
xbyu520 发表于 2016-12-13 12:37 | 显示全部楼层
你把编译器编译出的汇编指令贴出来,便于大家分析。最好把单片机型号报出来
1273457925 发表于 2017-1-4 23:23 | 显示全部楼层
单片机程序是顺序执行的,应该有一个明确的结尾或者无限循环过程。
要不就是进入掉电模式等待中断唤醒,要不就用一个while(1)循环无限等待。
楼主的程序是会跑飞的。
LED吴生 发表于 2017-1-11 14:27 | 显示全部楼层
差一个  while
void main()
{        
  while(1)
       {
         P1.1=!P1.1;  //这里是按位取反
       }
qq84395064 发表于 2017-1-14 14:37 | 显示全部楼层
欢迎加入我们,我们是一群电子爱好者,网站有需要的资料 官方网站 http://1535yd1142.51mypc.cn:8888
zhoukaiyue 发表于 2017-2-16 18:15 | 显示全部楼层
13楼的正确
stackdog 发表于 2017-2-17 11:06 | 显示全部楼层
13楼说的好
coody 发表于 2017-2-17 11:56 | 显示全部楼层
如13楼所说,无主循环,所以执行取反后,一直往下执行,如果后面是00就是NOP,如果是0xff就是MOV A, R7,一直到程序最后,又从头开始,所以要500us。
lele2010 发表于 2017-5-25 22:02 | 显示全部楼层
ohy3686 发表于 2017-5-26 09:33 | 显示全部楼层
延时函数是无法精确时间的
如果需要精确延时,建议用定时器,那是一定准的。
fengrenjie 发表于 2017-5-26 11:21 | 显示全部楼层
void main()

      while(1)
      {
      P1.1=~P1.1;
       }   



这样试试看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

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