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

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

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 = us DJNZ 2us + R6赋值 1us = 3us

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

延时总时间 = 三层循环 + 循环外 = +5 = us =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

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

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

(0)
上一篇 2026年3月19日 下午6:40
下一篇 2026年3月19日 下午6:40


相关推荐

  • 2D武侠游戏《剑侠世界》网游单机 搭建教程说明「建议收藏」

    原文链接:http://www.zccode.com/forum.php?mod=viewthread&tid=678&extra=page%3D1%26filter%3Dtypeid%26typeid%3D99该资源说明:游戏名称:剑侠世界单机版…

    2022年4月10日
    54
  • TreeTable树形数据列表

    TreeTable树形数据列表使用Treetable展示ajax数据,通用的List集合递归转换为具有层级关系的List集合

    2022年5月22日
    36
  • 点到平面的距离公式的推导

    点到平面的距离公式的推导点到平面的距离公式准备知识平面的一般式方程 Ax By Cz D 0 其中 n A B C 是平面的法向量 D 是将平面平移到坐标原点所需距离 所以 D 0 时 平面过原点 向量的模 长度 给定一个向量 V x y z 则 V sqrt x x y y z z 向量的点积 内积 给定两个向量 V1 x1 y1 z1 和 V2

    2026年3月19日
    2
  • 概率论笔记—大数定律与中心极限定理

    概率论笔记—大数定律与中心极限定理目录一 依概率收敛二 大数定律 1 切比雪夫大数定律 2 伯努利大数定律 3 辛钦大数定律三 中心极限定理 1 列维 林德伯格定理 2 棣莫弗 拉普拉斯定理一 依概率收敛设随机变量 XXX 与随机序列 Xn 1 2 3 X n 1 2 3 Xn 1 2 3 如果对任意的 gt 0 epsilon gt 0 gt 0 有 lim n P Xn X 0 nbsp 或 nbsp lim n P Xn X 1 lim n to i

    2026年3月17日
    2
  • 不止编码,还要好好生活和思考[通俗易懂]

    做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!2019年4月最后一天,不写技术,谈谈我的乐园,我喜欢的一首诗,分享给你!面朝大海,春暖花开[作者] 海子从明天起,做一个幸福的人喂马,劈柴,周游世界从明天起,关心粮食和蔬菜我有一所房子,面朝大海,春暖花开从明天起,和每一个亲人通信告诉他们我的幸福那幸福的闪电告诉我的我将告诉每一个人给每一条河…

    2022年3月1日
    47
  • linux vim :E325 解决办法[通俗易懂]

    linux vim :E325 解决办法[通俗易懂]在终端中输入ls-la找到.swp文件(这个文件是个隐藏文件,所以删除时要加上.),然后rm.你的swp文件。

    2022年5月16日
    36

发表回复

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

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