菜鸟请教关于两条命令之间时间间隔的问题

2019-07-16 03:26发布

有个小程序如下:

#include <reg51.h>    //此文件中定义了51的一些特殊功能寄存器
/*******延时函数*************/
void delay(void)        //两个 void意思分别为无需返回值,没有参数传递
{
  unsigned int i;       //定义无符号整数,最大取值范围 65535
  for(i=0;i<1;i++)  //15、16微妙延时
        ;               //什么也不做,等待一个机器周期
}
sbit SCLK=P1^0;
sbit SDATA=P1^1;

void sendata(unsigned int x)     //x=1 or 0
{ SCLK=0;//SCLK上升沿有效
  SDATA=x;//SDATA赋值
  delay();
  SCLK=1;//SCLK从0到1跳变
  delay();
}
main()
{
  sendata(1);  
  sendata(0);
  sendata(1);  

  SCLK=0;
  SDATA=0;
}

问题1:据说,单片机每次只能执行一条指令,而每条指令需要的时间一般为1~2个指令周期。以12MHz晶体为例,1个指令周期即为1us。这是不是意味着,如上的两个信号SCLK和SDATA,根本就不可能同时出现,必须存在1~2个指令周期的时间间隔?有什么办法可以解决吗?对于某些特殊应用,1、2us的时间差很重要。
问题2:上面主函数中,连续调用3次sendata函数,实测发现SCLK下降沿跟SDATA有5us左右的时间间隔,比较大。而程序最后,SCLK=0、SDATA=0,两个信号之间间隔就只有1个指令周期,即1us。前面的间隔5us跟函数调用有关,怎么解决?

谢谢!纯属菜鸟问题。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。