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

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跟函数调用有关,怎么解决?

谢谢!纯属菜鸟问题。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
rf1008
1楼-- · 2019-07-16 20:25
3htech 发表于 2012-12-1 08:12
接到同一组口线上。给Pn赋值。

给P1赋值,可以保证P10、P11...P17同时翻转,但是,浪费资源,尤其只使用其中1、2个端口的时候。不够灵活。
rf1008
2楼-- · 2019-07-17 00:52
wufa1986 发表于 2012-11-30 17:32
51单片机结构决定了速度本来就不快,换avr或pic,而且现在stc的51单片机也不会1us才一条指令的,你说的是最 ...

是的,就是最基本的。
rf1008
3楼-- · 2019-07-17 02:43
lovezjf234 发表于 2012-11-30 17:20
提高晶振。简短一个周期指令的时间,让本来重要的变得不重要不就行了。

是个“办法”,呵呵。
rf1008
4楼-- · 2019-07-17 05:19
有人解答我的问题2 吗?谢谢!

一周热门 更多>