51单片机快速入门之延时代码
时序周期:简单的举例(早 中 晚)
时间基准:一个机器周期有 12个 振荡周期(晶振)
假设我们现在手上为12MHz晶振
单个振荡周期计算公式:T(时间周期)=1/f(晶振的频率)
在处理频率相关的计算时,通常会使用赫兹(Hz)作为基本单位,因为它是国际单位制中用于测量频率的标准单位。
12MHz转换成赫兹(Hz): 12x10^6
“兆”(Mega,缩写为 M)表示的是 10^6
T (单位 秒 s)=1/12x10^6 约等于 0.000 000 083333
1秒等于1,000,000微秒 10^6
(1/12x10^6)x10^6 = 1/12
这里转换结果就是 1/12 约等于0.083333 μs
不考虑其他因素下
机器周期的总时间将是:
12 x T 也就是 1 μs 微秒
机器周期,也称为指令周期
在一个简单的处理器中,执行一条加法指令可能需要以下几个步骤:
- 取指:从内存中读取指令。
- 解码:解析指令以确定要执行的操作。
- 执行:进行实际的加法运算。
- 存储:将结果存储回内存或寄存器。
每个步骤都需要一定数量的时钟周期。总的机器周期就是完成所有这些步骤所需的时间。
简单易用的代码:精度一般 while循环操作
void delay(unsigned int t);//延时函数声明void main()
{
delay(6000);
}
void delay(unsigned int t){
while(t--);}
```
C:0x000C 02001A LJMP main(C:001A) // 跳转到main函数
14: void delay(unsigned int t){ // 延时函数
15: while(t--); // 循环直到t减到0
16:
C:0x000F EF MOV A,R7 // 将R7的值赋给A
C:0x0010 1F DEC R7 // R7的值减1
C:0x0011 AC06 MOV R4,0x06 // 将0x06赋给R4
C:0x0013 7001 JNZ C:0016 // 如果A不为0,跳转到C:0016
C:0x0015 1E DEC R6 // R6的值减1
C:0x0016 4C ORL A,R4 // A的值与R4的值做或运算
C:0x0017 70F6 JNZ delay(C:000F) // 如果A不为0,跳转到delay函数
17: }
C:0x0019 22 RET // 返回
7: void main() // 主函数
C:0x001A 7F70 MOV R7,#0x70 // 将0x70赋给R7
C:0x001C 7E17 MOV R6,#0x17 // 将0x17赋给R6
C:0x001E 02000F LJMP delay(C:000F) // 跳转到delay函数
```
看看运行效果debug
我们可以看到 执行该程序只花费了0.05443000秒 也就是54,430微秒
如果用16位的 unsigned int
,最大值为 2^16 - 1
,即 65535
我们将会打得到刚好运行0.5秒多!
for循环操作代码:可以发现基本上接近1S