打印
[STC单片机]

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

[复制链接]
2133|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

使用特权

评论回复
5
NE5532| | 2016-12-12 09:27 | 只看该作者
itxyuan 发表于 2016-12-12 09:05
我想不明白的是前面那个主程序里面我只写了一句取反,为什么要耗时500us

上面已经说了,你C语言写一句,编译成汇编会变成N句。

使用特权

评论回复
6
jackhwang| | 2016-12-12 10:17 | 只看该作者
void main()

      P1.1=~P1.1;     

是这个时候,P1.1输出高低电平各500us吗?
一:P1.1=~P1.1;这条语句一定不是一个机器周期,你编译后可以看到相应的汇编代码;
二:P1.1输出高低电平各500us,这个时间很单片机频率有关。

使用特权

评论回复
7
aerwa| | 2016-12-13 08:35 | 只看该作者
不管汇编了,从语法上讲单节机在io口上来说应该出个方波,但肯定不是一个机器周期,51编译器有内部处理好的汇编语句但时间不应该是大到500us吧。排除时钟,中断,看门狗复位,这个试验没用51做过,但我用430做过没见这种情况。

使用特权

评论回复
8
aerwa| | 2016-12-13 08:38 | 只看该作者
还有种情况是不是你观察的时候示波器触发没调好,导致看不到细节。按道理不应该大到500us

使用特权

评论回复
9
mcu5i51| | 2016-12-13 09:05 | 只看该作者
芯片复位
系统运行环境设置
清除内存
跳转到C入口(_main)
void main()

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

使用特权

评论回复
10
liu123liu| | 2016-12-13 10:13 | 只看该作者
你只有一个翻转,上电瞬间不能看到波形吧。while(1){  P1.1=~P1.1;}。你的方波估计应该是看门狗导致的

使用特权

评论回复
11
xbyu520| | 2016-12-13 12:37 | 只看该作者
你把编译器编译出的汇编指令贴出来,便于大家分析。最好把单片机型号报出来

使用特权

评论回复
12
1273457925| | 2017-1-4 23:23 | 只看该作者
单片机程序是顺序执行的,应该有一个明确的结尾或者无限循环过程。
要不就是进入掉电模式等待中断唤醒,要不就用一个while(1)循环无限等待。
楼主的程序是会跑飞的。

使用特权

评论回复
13
LED吴生| | 2017-1-11 14:27 | 只看该作者
差一个  while
void main()
{        
  while(1)
       {
         P1.1=!P1.1;  //这里是按位取反
       }

使用特权

评论回复
14
qq84395064| | 2017-1-14 14:37 | 只看该作者
欢迎加入我们,我们是一群电子爱好者,网站有需要的资料 官方网站 http://1535yd1142.51mypc.cn:8888

使用特权

评论回复
15
zhoukaiyue| | 2017-2-16 18:15 | 只看该作者
13楼的正确

使用特权

评论回复
16
stackdog| | 2017-2-17 11:06 | 只看该作者
13楼说的好

使用特权

评论回复
17
coody| | 2017-2-17 11:56 | 只看该作者
如13楼所说,无主循环,所以执行取反后,一直往下执行,如果后面是00就是NOP,如果是0xff就是MOV A, R7,一直到程序最后,又从头开始,所以要500us。

使用特权

评论回复
18
lele2010| | 2017-5-25 22:02 | 只看该作者

使用特权

评论回复
19
ohy3686| | 2017-5-26 09:33 | 只看该作者
延时函数是无法精确时间的
如果需要精确延时,建议用定时器,那是一定准的。

使用特权

评论回复
20
fengrenjie| | 2017-5-26 11:21 | 只看该作者
void main()

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



这样试试看

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝