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

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

  1. c语言程序中的算数表达式X Y-Z,C语言程序设计实验教程习题1~10.docx

    C语言程序设计实验教程习题1~10 第一章一.选择题1.最早开发C语言是为了编写下面那一种操作系统( C) A .Windows B.DOS C.UNIX D.Linux2.下面哪一项不属于C语言的特 ...

  2. 51c语言延时作用,51单片机C语言延时函数怎么定义和使用

    描述 51单片机C语言延时函数怎么定义 C语言定义延时函数主要通过无意义指令的执行来达到延时的目的.C程序中可使用不同类型的变量来进行延时设计.经实验测试,使用unsigned char类型具有比un ...

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

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

  4. 数码管动态显示c语言,《手把手教你学51单片机-C语言》之六 中断与数码管动态显示...

    中断是单片机系统重点中的重点,因为有了中断,单片机就具备了快速协调多模块工作的能力,可以完成复杂的任务.本章将首先带领大家学习一些必要的C语言基础知识,然后讲解数码管动态显示的原理,并最终借助于中断系 ...

  5. 单片机交通灯灯c语言程序,关于LED模拟交通灯单片机C语言程序设计 - 全文

    本文为大家带来三个关于LED模拟交通灯单片机C语言程序设计. 关于LED模拟交通灯单片机C语言程序设计一 功能说明 东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南 ...

  6. c语言从入门到精通 当当,51单片机C语言编程从入门到精通

    本书立足于单片机的各类型应用技术,采用大量实例和程序逐行解说的方式,详细介绍51单片机和C语言编程开发与应用技术. 内容特点: 1 立足于单片机工程应用:由浅入深,结合丰富的开发实例,介绍51单片机C ...

  7. c语言程序中cost的作用,C语言考试题基础版(21页)-原创力文档

    if (x>y)z=x; s=z*z;elsez=y;s=1/(z*z); if (x>y) z=x; s=z*z; else z=y;s=1/(z*z); 7. B. C. PAd, P ...

  8. c语言栈中符号 的作用是什么,C语言数据结构----栈的应用(程序的符号匹配检测)...

    本节主要讲利用栈来实现一个程序中的成对出现的符号的检测,完成一个类似编译器的符号检测的功能,采用的是链式栈. 一.问题的提出以及解决方法 1.假定有下面一段程序: #include #include ...

  9. c语言程序中复合句用什么表示,c语言程序设计(包云)c第1章概述

    <c语言程序设计(包云)c第1章概述>由会员分享,可在线阅读,更多相关<c语言程序设计(包云)c第1章概述(50页珍藏版)>请在人人文库网上搜索. 1.c语言计算机编程,讲座: ...

  10. c51adc0809c语言程序,用汇编语言写一个51单片机adc0809的程序

    匿名用户 1级 2011-08-15 回答 正好做过,就给你吧! ************************************* ;* * ;* 主程序和中断程序入口 * ;* * ;** ...

最新文章

  1. 设计模式笔记——Adapter
  2. Genome Sequencing and Assembly by Long Reads in Plants植物基因组的长读测序与组装
  3. 常见Z纯CSS小样式合集(三角形)
  4. PMCAFF | App竞品分析报告:美丽说VS蘑菇街
  5. Linux内核编译与管理
  6. GDCM:获取SubSequence数据的测试程序
  7. shell编程之文本处理工具awk
  8. Spring3系列7- 自动扫描组件或Bean
  9. linux 文件权限 rwt,Linux下修改文件权限(所有权)
  10. 阿里“10”年软件测试经验,面试官通常...........
  11. android之id统一管理
  12. Linux之chrony时间同步服务、ntp协议
  13. Python实现鸢尾花数据集分类问题——使用LogisticRegression分类器
  14. 数学建模算法与应用学习blog
  15. 如何使用JLINK调试和固件下载
  16. 用CAJViewer识别图片文字
  17. WinISO5.3 注册码 不需要注册机
  18. Jmeter 使用详解
  19. 自己做的一个漫画下载器
  20. c语言色电阻环编程,c 语言的计算(电阻)请问要如何用C计算电阻的三色环如~~宗 黑 红 ==1K#include #include #in...

热门文章

  1. 桥梁大师BridgeMaster2019带箱梁 USB加密狗发布
  2. 计算机硬盘的常用分区工具,磁盘分区工具,详细教您硬盘分区工具diskgenius怎么使用...
  3. Redis常用命令-史上最全最新版本(一)
  4. axure 8.1 破解 和 汉化
  5. JavaScript---轮播图片完整代码
  6. freeswitch 使用ipset和iptables阻止国外ip扫描端口
  7. 点播的时候出现 “S1-10921” 的错误
  8. OMRON继电器基础讲解
  9. 扩展欧几里得算法(求逆元)总结
  10. 欧几里德与扩展欧几里德算法