51单片机C语言延时函数怎么定义和使用

51单片机C语言延时函数怎么定义和使用C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsignedchar类型具有比unsignedint更优化的代码,在使用时应该使用unsignedchar作为延时变量。

大家好,又见面了,我是你们的朋友全栈君。

C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。
  以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。现在定义一个延时xms毫秒的延时函数。

 void delay(unsigned int xms) // xms代表需要延时的毫秒
      {
      unsigned int x,y;
      for(x=xms;x>=0;x--)
      for(y=110;y>=0;y--);
      }

1.51单片机C语言延时函数的使用
下面给出一些经典的延时函数,(1)500ms延时子程序如下:

void delay500ms(void)
{
  unsigned char i,j,k;
  for(i=15;i>=0;i--)
  for(j=202;j>=0;j--)
  for(k=81;k>=0;k--);
}

计算分析:程序共有三层循环,一层循环n:R52 = 812 = 162us DJNZ 2us;二层循环m:R6*(n+3) = 202165 = 33330us DJNZ 2us + R5赋值 1us = 3us;三层循环: R7(m+3) = 1533333 = 499995us DJNZ 2us + R6赋值 1us = 3us
循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us
延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms
计算公式:延时时间=[(2
R5+3)*R6+3]*R7+5
(2)200ms延时子程序:

void delay200ms(void)
{
  unsigned char i,j,k;
  for(i=5;i》0;i--)
  for(j=132;j》0;j--)
  for(k=150;k》0;k--);
}

(3)10ms延时子程序:

void delay10ms(void)
{
  unsigned char i,j,k;
  for(i=5;i》0;i--)
  for(j=4;j》0;j--)
  for(k=248;k》0;k--);
}

(4)1s延时子程序:

void delay1s(void)
{
  unsigned char h,i,j,k;
  for(h=5;h》0;h--)
  for(i=4;i》0;i--)
  for(j=116;j》0;j--)
  for(k=214;k》0;k--);
}

关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。
共有三条延时函数说明如下:
  函数调用分两级:一级是小于10US的延时,二级是大于10US的延时

//小于10US的【用1US级延时】

//———-微秒级延时———

for(i=X;i》X;i–) 延时时间=(3+5*X)/12 提示(单位us, X不能大于255)

//======大于10US《小于21.9955Ms的可用【10US级延时函数】=

void Delay10us(uchar Ms)
{
  uchar data i;
  for(;Ms》0;Ms--)
  for(i=26;i》0;i--);
}

i=[(延时值-1.75)*12/Ms-15]/4
  如想延时60US则 i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i的值=26,再调用上面的【10US级延时函数】Delay10us(6); 则就精确延时60US;如果想延时64US可以用这二种函数组合来用: Delay10us(6); for(i=9;i》X;i–) 共延时64US
  关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

共有三条延时函数说明如下:

函数调用分两级:一级是小于10US的延时,二级是大于10US的延时

//小于10US的【用1US级延时】

//———-微秒级延时———

for(i=X;i》X;i–) 延时时间=(3+5*X)/12 提示(单位us, X不能大于255)

//======大于10US《小于21.9955Ms的可用【10US级延时函数】=

void Delay10us(uchar Ms)
{
  uchar data i;
  for(;Ms》0;Ms--)
  for(i=26;i》0;i--);
}

i=[(延时值-1.75)*12/Ms-15]/4
  如想延时60US则 i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i的值=26,再调用上面的【10US级延时函数】Delay10us(6); 则就精确延时60US;
  如果想延时64US可以用这二种函数组合来用: Delay10us(6); for(i=9;i》X;i–) 共延时64US
2.下面给出有关在C51中延时子程序设计时要注意的问题(一些经验之谈)

(1)、在C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。
 (2)、在延时子程序设计时,采用do…while,结构做循环体要比for结构做循环体好。
 (3)、在延时子程序设计时,要进行循环体嵌套时,采用先内循环,再减减比先减减,再内循环要好。

一. 500ms延时子程序产生的汇编:

C:0x0800 7F0F MOV R7,#0x0F

  C:0x0802 7ECA MOV R6,#0xCA

  C:0x0804 7D51 MOV R5,#0x51

  C:0x0806 DDFE DJNZ R5,C:0806

  C:0x0808 DEFA DJNZ R6,C:0804

  C:0x080A DFF6 DJNZ R7,C:0802

  C:0x080C 22 RET

二.200ms延时子程序产生的汇编

C:0x0800 7F05 MOV R7,#0x05

  C:0x0802 7E84 MOV R6,#0x84

  C:0x0804 7D96 MOV R5,#0x96

  C:0x0806 DDFE DJNZ R5,C:0806

  C:0x0808 DEFA DJNZ R6,C:0804

  C:0x080A DFF6 DJNZ R7,C:0802

  C:0x080C 22 RET

三.10ms延时子程序产生的汇编:

C:0x0800 7F05 MOV R7,#0x05

  C:0x0802 7E04 MOV R6,#0x04

  C:0x0804 7DF8 MOV R5,#0xF8

  C:0x0806 DDFE DJNZ R5,C:0806

  C:0x0808 DEFA DJNZ R6,C:0804

  C:0x080A DFF6 DJNZ R7,C:0802

  C:0x080C 22 RET

四.1s延时子程序产生的汇编

C:0x0800 7F05 MOV R7,#0x05

  C:0x0802 7E04 MOV R6,#0x04

  C:0x0804 7D74 MOV R5,#0x74

  C:0x0806 7CD6 MOV R4,#0xD6

  C:0x0808 DCFE DJNZ R4,C:0808

  C:0x080A DDFA DJNZ R5,C:0806

  C:0x080C DEF6 DJNZ R6,C:0804

  C:0x080E DFF2 DJNZ R7,C:0802

  C:0x0810 22 RET

3.另外一些关于延时的例子
http://www.ceet.hbnu.edu.cn/bbs/viewthread.php?TId=3749,作者:小秋

晶振:12MHz

1:5~500us

void delay(unsigned char i)
{
  while(--i) ;
}

计算方法:ix2+5 可完成5~515us的延时

2:10us~2ms

void delay(unsigned char i)
{
  for( ;i》0 ;i--) ;
}

计算方法:ix8+10 可完成10us~2.050ms的延时

3:2ms~130ms

void delay(unsigned char i,unsigned char j)
{
  for( ;j》0 ;j--)
  for( ;i》0 ;i--) ;
}

计算方法:(ix2+3)xj+5 u


转载自:http://www.elecfans.com/emb/580729_a.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147932.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月15日 下午12:46
下一篇 2022年6月15日 下午12:46


相关推荐

  • setfacl 命令[通俗易懂]

    setfacl 命令[通俗易懂]setfacl命令是用来在命令行里设置ACL(访问控制列表)。在命令行里,一系列的命令跟随以一系列的文件名。选项-b,–remove-all:删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留。-k,–remove-default:删除缺省的acl规则。如果没有缺省规则,将不提示。-n,–no-mask:不要重新计算有效权限。setfacl…

    2022年6月16日
    57
  • pytest测试框架快速搭建

    pytest测试框架快速搭建一 介绍 pytest 是一个非常成熟的 Python 测试框架 能够支持简单的单元测试和复杂的功能测试 还可以用来做 selenium appnium 等自动化测试 接口自动化测试 pytest requests pytest 具有很多第三方插件 并且可以自定义扩展 比较好用的如 pytest selenium 集成 selenium pytest html 完美 html 测试报告生成 pytest rerunfailure 失败 case 重复执行 pytest xdist 多 CPU 分发 等

    2026年3月16日
    3
  • hostapd.conf配置文档「建议收藏」

    hostapd.conf配置文档「建议收藏」#####hostapdconfigurationfile###############################################Emptylinesandlinesstartingwith#areignored#APnetdevicename(without’ap’postfix,i.e.,wlan0useswl

    2022年5月21日
    41
  • 即梦ai怎样解锁高级功能 即梦ai会员权限开通教程

    即梦ai怎样解锁高级功能 即梦ai会员权限开通教程

    2026年3月12日
    4
  • Hadoop官网使用教程

    Hadoop官网使用教程Hadoo 官网查看单节点安装步骤 1 登录 Hadoop 主页 http hadoop apache org 2 找到左侧的 Documentatio 点击下拉箭头找到我们现在正在使用的 Hadoop 版本 3 若泽大数据课程的 Hadoop 版本为 Release2 8 3 单击进入 4 点击左侧的 nbsp SingleNodeSe nbsp 5 找到了单节点的安装部署信息单节点部署 Hadoop 网站地址 http

    2026年3月18日
    1
  • Pycharm 安装pandas时为什么会报错*

    Pycharm 安装pandas时为什么会报错*Pycharm 安装 pandas 时为什么会报错网络原因因为 pycharm 配置编译器错误 Window R 输入 cmd 发现是因为原先的 pip 版本太旧了 重新安装指示输入命令 安装成功 发现 python 可以正常输入 但是 pycharm 报错 初步判断是编译器配置问题 打开 File setting pythoninterp 设置 找到相对应的 python exe 这个可以在 cmd 中输入 wherepython 找到路径 然后就成功啦

    2026年3月27日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号