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

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条回答
popeye0451
1楼-- · 2019-07-16 05:27
 精彩回答 2  元偷偷看……
lovezjf234
2楼-- · 2019-07-16 06:45
提高晶振。简短一个周期指令的时间,让本来重要的变得不重要不就行了。
wufa1986
3楼-- · 2019-07-16 06:48
51单片机结构决定了速度本来就不快,换avr或pic,而且现在stc的51单片机也不会1us才一条指令的,你说的是最传统的51单片机速度
starsnow
4楼-- · 2019-07-16 08:28
碰巧你两个用的都是P1,要不考虑不用位操作,直接字节操作,用按位与和按位或操作,不知道可行不?
3htech
5楼-- · 2019-07-16 14:08
接到同一组口线上。给Pn赋值。
zhanwuplg
6楼-- · 2019-07-16 19:38
 精彩回答 2  元偷偷看……

一周热门 更多>