上面大神都有回帖,我再补充一下,这个1141是根据晶振计算出一条命令的时间,延时程序转化为汇编后,按汇编命令挨个的计算时间,最后就出来了,最后的结果是以汇编的命令计算出来的,精确要是用定时器
指令: 1、MUL、DIV:仅有的4周期指令 2、包含DPTR和PC的指令均为2周期指令 3、所有的绝对跳转和条件转移指令,均为2周期指令 4、所有包括A寄存器的指令,均为单周期指令 5、位操作指令中,ANL和ORL是2周期指令 6、所有包含立即地址的指令,除INC direct及DEC direct外,均为2周期指令 7、剩下的均为单周期指令。 _nop_函数可以在keil软件的C51->HLP->C51lib.chm文档中查阅 反推这个晶振应该是12M的 |
|
延时程序,for是嵌套循环,要求不高 用while(i--)就可以吧 |
| 延时语句,没啥具体用处 |
| 延时,函数执行需要时间,根据给的不同数字,它运行的时候就相当于把你循环运行的时间当延时用 |
| 程序有些问题 |
| 应该是程序问题 |
| 就一个延时函数,主要是靠运行的次数来延时的,而是延时精准度不高 |
| 延时函数,1141一般是试出来的 |
| 用来延时的 |
| 延迟用的东西 |
| 毫秒延时程序模块时间不准,要看指令时钟频率 |
| for循环是用于延时 |
| 粗略计时 |
| 用空指令来消耗时间,本质上上就是一个延时函数。 |
| 毫秒延时程序模块 |
| 毫秒延时用的,不准 |
| 延时函数 |
| 延时函数 |
|
这个是软件延时程序,用两个for循环来达到延时的目的, 1141应该是根据晶振大小计算出来的 软件延时,这种方法主要采用循环体进行。 j加一次{;}就循环一次,当j=1141时就转到while外循环中了 11.0592MHz 晶振的延时函数 这是一个1ms基准延时程序 //N ms延时 void delay_ms(uint n) { uint i,j; for(i=n;i>0;i–) for(y=114;y>0;y–); } 在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。脉冲信号之间的时间间隔称为周期;而将在单位时间(如1秒)内所产生的脉冲个数称为频率。频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称;频率的标准计量单位是Hz(赫)。电脑中的系统时钟就是一个典型的频率相当精确和稳定的脉冲信号发生器。 指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。 时钟周期:也称为振荡周期,一个时钟周期 = 晶振的倒数。对于单片机时钟周期,时钟周期是单片机的基本时间单位,两个振荡周期(时钟周期)组成一个状态周期。 机器周期:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、存储器读/写等。 机器周期=6个状态周期=12个时钟周期。 51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/ 晶振频率)= x μs。常用单片机的晶振为11.0592MHz,12MHz,24MHz。其中11.0592MHz的晶振更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。 |
| 这个应该是延时函数,用两个for循环来达到延时的目的 |