众所周知,在编程时很难掌握程序运行的时间,所以编写时很难做到很精确,解决的方式有插入汇编语句,但总觉得汇编用起来不是那么顺手,还可以用定时器来做,但只是一个很小的延时程序而已,不必小题大作。其实办法还是有的,下面介绍一下常用的几种延时程序。

1、us级延时程序

常用的一个函数如下:

void delayus(unsigned char x)

{ while(--x) ;

}

生成的汇编代码为:

C:0x001C 7F0A MOV R7,#0x0A //2us

C:0x001E 12003E LCALL delayus(C:003E) // 2us

C:0x003E DFFE DJNZ R7,delayus(C:003E) //2x us

C:0x0040 22 RET // 1us

所以调用一次函数延时时间为 ( 2x+5 )us ,可以用来延时大于5us的时间。

注意的是x要是unsigned char 类型,且 --x 不能写成x-- ,否则汇编代码会有一大串:C:0x001C 7F02 MOV R7,#0x02

C:0x001E 120032 LCALL delayus(C:0032)

C:0x0032 AE07 MOV R6,0x07

C:0x0034 1F DEC R7

C:0x0035 EE MOV A,R6

C:0x0036 70FA JNZ delayus(C:0032)

C:0x0038 22 RET

因为汇编中的DJNZ 语句是先减一再判断的,和-xx的算法一致,所以--x和x--相差了很多。上述函数只适合x的范围是0-255,如果需要延时大于255*2+5us,则可以连续调用几次函数。

2、ms的延时程序

常用的一个函数:

void delayms(unsigned int x)

{

unsigned char i;

while(x--)

{

for(i=0;i<125;i++){;}

}

}

我们来看一下它的精度如何

x us

1 1024

5 5076

10 10141

50 50661

100 101311

可见,精度不“精”,随着x值的增大,延时误差越大,只适合在延时不要求很准确的地方使用。于是想到对程序进行一些修改,想到125是不是取的太大了,假如把它变为可变,不同的x值取值不同,就可以对延时时间进行一些修正,把程序改为如下:

void delayms(unsigned int x,unsigned char y)

{

unsigned char j;

while(x--)

{

for(j=0;j

}

}

对不同的延时时间取不同的y值,发现一个“怪”现象,当取y=123时,延时时间的误差是一个固定值:

x us

1 1017

2 2016

5 5016

10 10016

50 50016

100 100016

除了x=1外,其余的误差都为16us, 即不管x为多大都只有16us的误差,精度大幅度提高,可以满足大多数的需要!

51c语言延时程序怎么编写,C51中延时程序的编写相关推荐

  1. 单片机r6/r7c语言怎么用,关于单片机C51中c语言函数(-nop-())?

    实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 1  使用定时器/计数器实现精确延时 ...

  2. c语言实数的存放形式,C51中float定义的实数存放形式

    C51中的浮点数采用IEEE-754标准来表示,存储长度为4个字节,其中包含3个位域:数符,阶码和尾数. (1)1位数符位:D31 (2)8位阶码:D30----D23(补码形式存放),其中D30是符 ...

  3. 怎么让程序后台运行_CPU中的程序是怎么运行起来的?

    1CPU的硬件最小原子 计算机从上世纪四十年代发展到现在有八十多年了,我们现在开发应用以及很少会涉及到底层的部分,硬件设计的电子专业在学校里面会学习模电数电这两门课,今天的第一部分就从这里说起. 一般 ...

  4. 在JAVA中 以下程序_在Java中,以下程序的输出结果是()_学小易找答案

    [单选题]运行以下Java代码,说法正确的是( ). [单选题]在Java中,以下程序的输出结果是() [单选题]利用"出声"的方式向学生展示教师分析问题的过程与方法的教学方法是_ ...

  5. c语言程序如何在keil中运行,keil c51中C程序的启动过程

    汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接.下面看看它和main()函数是 ...

  6. C语言软件怎么运行C51文件,keil c51中C程序的启动过程

    函数的入口地址,如何调用汇编函数,c和汇编的混合编程 /*******************************************************************/ c函数 ...

  7. 去除程序名称 去除程序属性详细信息中的程序名称 创建时间等信息

    文件右键属性 想去掉下图中的信息 开始操作 再次查看发现已经删除掉了 程序名称 教程至此结束

  8. 计算机运行命令如何关闭应用程序,如何禁止电脑中某些程序的运行

    windows并没有一个简单的软件,能禁止那些不想让别人使用的程序,但是它本身有这个功能的,要做到也不难.那就是启用"不要运行指定的Windows应用程序"策略 .在组策略中有一条 ...

  9. c51语言 延时程序值怎么算,C51的延时计算

    C语言的延时计算 今天碰到这个问题,想想大家也可能用得上,就转过来了,希望对大家有用 C51中精确的延时与计算的实现 C51由于其可读性和可移植性很强,在单片机中得到广泛的应用, 但在某些时候由于C5 ...

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

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

最新文章

  1. JSP获得客服端MAC地址
  2. Linux 内核中的 Device Mapper 机制
  3. 娱乐社交,玩票大的!2021网易云信“融合通信开发者大赛”决赛名单公布!
  4. 世界上最遥远的距离(泰戈尔)
  5. MATLAB中BP神经网络用于回归拟合算法实现(另附GRNN代码)
  6. ASP.NET MVC中如何在客户端进行必要的判断
  7. Spring Boot 永远滴神!10分钟快速入门
  8. 区块链 以太坊 solidity 如何比较2个字符串相等
  9. 2.4GHz频段天线的选择
  10. 趣学Python 教孩子学编程pdf
  11. 英媒:俄黑客靠窃密跻身“成功企业家” 被捕时昏迷
  12. 华为手机文档里的html,华为手机如何扫描文件变成文档 这扫描功能简直太好用了...
  13. IGraphicsContain 删除元素
  14. linux下的串口编程
  15. JavaScript-网页特效
  16. ufs2.2 协议扫盲(十一)
  17. html导航页面转换,纯CSS实现导航栏Tab切换效果
  18. ANSYS Workbench18.0有限元仿真分析视频教程
  19. WPF设备无关单位(DIU)
  20. 中英文维基百科语料上的Word2Vec实验

热门文章

  1. 配置华为防火墙接口IP地址和区域
  2. Linux数据恢复的研究
  3. Citrix PVS架构和工作原理
  4. 云南开放大学《机械制造基础-形考作业1-6(主观题)》
  5. 深度体验中国长城2020版笔记本电脑有感
  6. 世界那么大,如何去看看?进入新世界的框架和脉络
  7. Sending the email to the following server failed.IOException while sending message问题解决
  8. APP Bomb Lab
  9. JavaScript 各种事件、方法、参数详解示例及常见问题等(全)
  10. Gary Marcus:因果熵理论的荒诞和认知科学带给AI的11个启示 | 文末赠书