有个小程序如下:
#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跟函数调用有关,怎么解决?
谢谢!纯属菜鸟问题。
一周热门 更多>