51单片机快速入门之延时代码 STC 51单片机

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 微秒

机器周期,也称为指令周期

在一个简单的处理器中,执行一条加法指令可能需要以下几个步骤:

  1. 取指:从内存中读取指令。
  2. 解码:解析指令以确定要执行的操作。
  3. 执行:进行实际的加法运算。
  4. 存储:将结果存储回内存或寄存器。

每个步骤都需要一定数量的时钟周期。总的机器周期就是完成所有这些步骤所需的时间。

简单易用的代码:精度一般 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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值