描述

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

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--);

}

51单片机C语言延时函数的使用

下面给出一个经典的延时函数。

一。 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:R5*2 = 81*2 = 162us DJNZ 2us

二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us

三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us

循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us

延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms

计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5

二。 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--);

}

三。 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--);

}

四。 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

四。 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

下面给出有关在C51中延时子程序设计时要注意的问题(一些经验之谈)

1、在C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。

2、在延时子程序设计时,采用do…while,结构做循环体要比for结构做循环体好。

3、在延时子程序设计时,要进行循环体嵌套时,采用先内循环,再减减比先减减,再内循环要好。

一。 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--);

}

产生的汇编:

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延时子程序

程序:

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--);

}

产生的汇编

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延时子程序

程序:

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--);

}

产生的汇编

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延时子程序

程序:

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: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

5,另外一些关于延时的例子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

打开APP精彩内容

点击阅读全文

51c语言延时作用,51单片机C语言延时函数怎么定义和使用相关推荐

  1. c语言看门狗的作用,51单片机 c语言看门狗程序怎么写

    51单片机 c语言看门狗程序怎么写 51单片机 c语言看门狗程序怎么写 看门狗在51单片机电路里的作用是防止程序 "跑飞"."死机"后,系统不动作,而采取复位的 ...

  2. 单片机独立式按键c语言程序,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询)...

    (原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询) /************************************************************ ...

  3. 51单片机c语言编程100,51单片机C语言编程100例.doc

    51单片机C语言编程100例.doc 目 录实例3用单片机控制第一个灯亮3实例4用单片机控制一个灯闪烁认识单片机的工作频率3实例5将 P1口状态分别送入P0.P2.P3口认识I/O口的引脚功能4实例6 ...

  4. 51单片机c语言版清华大学,51单片机c语言版.docx

    51单片机(呼吸灯)C语言版 基于单片机与PWM的呼吸灯设计 实训指导教师:班级: 设计人姓名:设计日期:设计地点:完成时间: 本设计是基于单片机的原理与接口设计,采用单片机I/O 口,加以C 语言编 ...

  5. 共阳极数码时钟c语言程序,基于51单片机C语言数字钟程序.doc

    基于51单片机C语言数字钟程序 基于51单片机C语言数字钟程序 数字电子钟的设计 一. 绪论 (一)引言 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地 ...

  6. 51单片机c语言工作手册,51单片机C语言编程手册

    51单片机C语言编程手册 1 第一章 介绍 这是一本关于Intel 80C51 以及广大的51 系列单片机的书这本书介绍给读者一些 新的技术使你的8051 工程和开发过程变得简单请注意这本书的目的可不 ...

  7. 单片机 rs232 c语言,完全手册 51单片机C语言开发详解系列之第8章 串口通讯实战—RS232...

    完全手册 51单片机C语言开发详解系列 技术凝聚实力 专业创新出版 第8章 串口通讯实战-RS232接口电路与软件设计 本章主要通过实际的例子讲解AT89S51单片机的RS232串行通讯接口设计. 随 ...

  8. 51单片机c语言内存使用,51单片机C语言编程之内存优化

    原标题:51单片机C语言编程之内存优化 最常见的是以下两种 ① 超过变量128后必须使用compact模式编译 实际的情况是只要内存占用量不超过 256.0 就可以用 small 模式编译 ② 128 ...

  9. 51单片机c语言延时库,51单片机c语言---延时

    1,_nop_()适用于us级的少量延时 标准的C语言中没有空语句.但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果. 这在汇编语言中很容易实现,写几个nop就行了.本文引用地址:htt ...

最新文章

  1. AD5933不同频率下的转换结果
  2. Android学习笔记(二三): 多页显示-Flipper的使用
  3. Redis - Redis command timed out nested exception is io.lettuce.core.RedisCommandTimeoutException
  4. php直接的模块接口,api(接口)模块
  5. 学习机器学习的项目_辅助项目在机器学习中的重要性
  6. influxdb 插入数据_Influx Sql系列教程五:insert 添加数据
  7. Managed I/O Completion Ports (IOCP)
  8. vue项目中对接微信公众号使用微信js-sdk
  9. 【linux笔记】CentOs 7配置网络IP
  10. Spring Boot Actuator 监控和管理应用程序
  11. Codeforces 36B - Fractal
  12. matlab数字电路仿真,MATLAB环境下的数字电路仿真
  13. 球面坐标系转换为笛卡尔坐标系
  14. django:自动生成接口文档
  15. 2020湖南省技能竞赛获奖名单_2020技能竞赛丨湖南省职业院校技能竞赛我校赛点圆满闭幕...
  16. 安利3个高清电脑壁纸网站
  17. 洛谷P1348 Couple number
  18. html导航栏动态图标,导航栏动态图.html
  19. 大学计算机实验报告答案 南京理工大学,南京理工大学微机实验报告.doc
  20. 7、Callable接口

热门文章

  1. SDUT 4123 喵帕斯之天才算数少女
  2. ACM-组合数学完全总结(知识点+模板)
  3. 400w人在抖音学驾照科目一,给我看哭了……用Python这不一下整活了吗
  4. 关于卷积神经网络的论文,卷积神经网络创始人
  5. 2022年超实用的推特营销策略
  6. weblogic下的UDDI及对UDDI的理解
  7. 命令行查看笔记本电脑电池使用状态
  8. 转jacob操作word和excel
  9. Arduino IDE无法打开问题解决
  10. 怦然心动的感觉(挺火的作文)