51单片机的延时函数快速生成技巧

简介: 51单片机的延时函数快速生成技巧

     可以借助软件快速生成代码。利用STC-ISP 就可以

1.打开stc-isp后点击软件延时计算器

2.选择好使用的单片机型号、晶振频率、延时的时间

3.点击生成代码 即可。

有时候生成的c代码会有

_nop_();            //这句指令执行仅仅耗费1微秒的时间,可以删除,影响不大

       我们可以将这句代码给删除掉 ,不删除程序就会报错(你没有定义_nop_()的前提下)。删除后其实基本上不会产生太大的误差,因为1微妙实在是太短了。

使用心得:

       我们可以将生成的代码稍微改造一下,可以让我们的程序更加灵活,例如生成一个一毫秒的延时函数,通过在函数定义时增加一个形参变量,通过形参变量来控制1ms延时程序执行的次数来随意调节时长。

生成后复制过来的代码是这样的:

void Delay1ms()   //@11.0592MHz
{
  unsigned char i, j;
 
  _nop_();
  i = 2;
  j = 199;
  do
  {
    while (--j);
  } while (--i);
}

       在花括号里面的那一堆程序段就可以空耗CPU一毫秒,从而达到延时。

下面我们对它进行稍微的改造

void Delay(int n)   //@11.0592MHz
{
    while(n--)                //将延时一毫秒的程序循环执行n次,通过形参来调节延时的时长
    {
      unsigned char i, j;
 
                            //    _nop_();注释掉这行代码
      i = 2;
      j = 199;
      do
      {
        while (--j);
      } while (--i);
    }
}

       在声明函数时 新增一个形参变量,用来接收执行次数,灵活调整延时的时间。在函数体中包上一个while()循环。这样就改造完成了。

同样 ,汇编语言也可以这样,现象生成一个100毫秒的延时函数

DELAY100MS:     ;@11.0592MHz
  PUSH 30H
  PUSH 31H
  MOV 30H,#180
  MOV 31H,#68
NEXT:
  DJNZ 31H,NEXT
  DJNZ 30H,NEXT
  POP 31H
  POP 30H
  RET
 

然后对延时子函数进行改造,例如

DELAY:  MOV R7,#5   ;@11.0592MHz
D1:
  PUSH 30H
  PUSH 31H
  MOV 30H,#180
  MOV 31H,#68
NEXT:
  DJNZ 31H,NEXT
  DJNZ 30H,NEXT
  POP 31H
  POP 30H
  DJNZ R7,D1
  RET

第一行多加了        MOV    R7,#5           ,倒数第二行多加了     DJNZ R7,D1

可以通过修改第一行#后面的数字来修改延时的时长,例如现在是5  那么延时的就是500ms

改成3  那么就延时300ms  因为我是拿延时100毫秒的汇编代进行改造的。

stc-isp里面除了可以烧写程序外还有很多功能,例如定时器的自动配置、波特率的计算等等

相关文章
【单片机】简单的自定义延时程序设计(代码演示)
【单片机】简单的自定义延时程序设计(代码演示)
|
5月前
|
C语言
###51单片机学习-----如何通过C语言运用延时函数设计LED流水灯
###51单片机学习-----如何通过C语言运用延时函数设计LED流水灯
146 0
|
5月前
|
缓存 编译器 索引
单片机中按键检测函数详细分析经典
单片机中按键检测函数详细分析经典
166 0
|
存储 安全 编译器
价值 1k 嵌入式面试题-单片机 main 函数之前都做了啥?
价值 1k 嵌入式面试题-单片机 main 函数之前都做了啥?
176 0
|
存储
如何编写一个可变参数函数?如何让所有单片机的所有串口实现printf函数?
如何编写一个可变参数函数?如何让所有单片机的所有串口实现printf函数?
176 0
【51单片机】使用STC烧录软件自动生成延时代码
【51单片机】使用STC烧录软件自动生成延时代码
118 0
单片机:实现流水灯(用库函数控制LED左移和右移)
单片机:实现流水灯(用库函数控制LED左移和右移)
609 0
单片机:实现流水灯(用库函数控制LED左移和右移)
|
存储 算法 编译器
单片机如何从上电复位执行到main函数?
单片机如何从上电复位执行到main函数?
单片机如何从上电复位执行到main函数?