大侠们,在使用51单片时候,使用的12M的晶振,使用延时函数
void delay(int i)
{
while(i--);
}
这个函数实例中当i=1时提示延时大概为10μs。
使用定时器:
void Timer0Init(){ TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。 TH0=0XFC; //给定时器赋初值,定时1ms TL0=0X18; ET0=1;//打开定时器0中断允许 EA=1;//打开总中断 TR0=1;//打开定时器 }其中实际上定时为1ms。
定时器可以理解,但上面的延时函数说i=1时延时10us,对么?
一个指令周期不是1us么?延时函数有几个指令周期?
首先,指令周期,不是指 c 函数语句周期,是指汇编指令周期。
要把程序编译出来再反汇编,看 汇编 指令是几条,然后再查 51指令 看每条指令是几个指令周期,再算每个指令周期是几个时钟周期,再算一个时钟周期是多长时间,然后相乘,这样算的才是真实值。
51 比较特殊,大多不是单周期指令,指令周期和时钟周期不一样。
不想算就在线调试,看那个时间也准
一个指令周期,只是执行单个指令,这里指的是汇编指令,比如MOV,INT等。
在我们用C语言写一个FOR().WHILE()要经过编译器进行编译,编译出来的肯定就不是一个语言,可能要操作很多部。
而且编译的时候,根据优化的等级,程序的执行效率是不一样的。
所以,通过while(i--)延时不是很精确。
首先你用的12M的晶振,51是12T的运行 就是1/12/12 = 1us i = 1. 。我也做了STC官方的提供的延时函数 分为不同的指令集 ,分别为STC-Y1 延时差不多是10us左右 如果不同的指令集,那么延时消耗的时间是不一定的
上面的说法是对的
汇编指令是1US
但是你跳转到子函数
然后子函数是一个循环
循环里还有判断
然后才是加减
这样算怎么也有10US了