实现延时通常有两种方法:

一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。

1 使用定时器/计数器实现精确延时

单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。

2 软件延时与时间计算

在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。

2.1 短暂延时

可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下:

void Delay10us( ) {

_NOP_( );

_NOP_( );

_NOP_( );

_NOP_( );

_NOP_( );

_NOP_( );

}

Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。  可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用\[4\],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。

2.2 在C51中嵌套汇编程序段实现延时

在C51中通过预处理指令#pragma asm和#pragma endasm可以嵌套汇编语言语句。用户编写的汇编语言紧跟在#pragma asm之后,在#pragma endasm之前结束。

如:#pragma asm

汇编语言程序段

#pragma endasm

延时函数可设置入口参数,可将参数定义为unsigned char、int或long型。根据参数与返回值的传递规则,这时参数和函数返回值位于R7、R7R6、R7R6R5中。在应用时应注意以下几点:

◆ #pragma asm、#pragma endasm不允许嵌套使用;

◆ 在程序的开头应加上预处理指令#pragma asm,在该指令之前只能有注释或其他预处理指令;

◆ 当使用asm语句时,编译系统并不输出目标模块,而只输出汇编源文件;

◆ asm只能用小写字母,如果把asm写成大写,编译系统就把它作为普通变量;

◆ #pragma asm、#pragma endasm和 asm只能在函数内使用。

将汇编语言与C51结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳选择。1  2

c51语言1秒延时程序,KeilC51程序设计中几种精确延时方法相关推荐

  1. keil c语言 延迟程序,Keil C51程序设计中几种精确延时方法

    前几天时间在做一个基于51单片机开发板的等精度频率计,用LCD1602液晶显示的,晶振是22.1184MHZ,用得是测频率法,目的是想做到能够测试0--900KHZ的信号. 液晶显示部分花了我好几天才 ...

  2. keil延时c语言程序设计,Keil C51程序设计中几种精确延时方法

    引言 单片机因具有体积小.功能强.成本低以及便于实现分布式控制而有非常广泛的应用领域[1].单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖.数据传输等操作都要在程序中插入一 ...

  3. windows中运行qt5构建的程序提示 无法启动此程序,因为计算机中丢失qt5Cored.dll 解决方法

    如果在windows中运行qt5构建的程序提示:无法启动此程序,因为计算机中丢失qt5Cored.dll 解决方法如下 1.用release构建项目 2.把缺少的dll文件,从C:\Qt\Qt5.0. ...

  4. 微信小程序input框中加入小图标的实现方法

    最近入坑小程序,要求在小程序的输入框中展示一个小图标,页面如下: 然后按照,html页面中的做法,在input框中添加了background-image属性,出乎意料的事,小程序报了下边这样一个错误: ...

  5. 递归重入c语言延时函数多任务程序设计中的函数重入问题按照Keil的规范对函数添加关键字“reentrant”,将函数定义为可重入的 void Delay_MS(x) reentrant

    c语言延时函数_子牙篇(2)多任务程序设计中的函数重入问题 weixin_39559333 2020-11-29 09:07:44  39  收藏 文章标签: c语言延时函数 c语言延时函数delay ...

  6. java语言中实现键盘输入_Java程序设计中的键盘输入数据的方法分析

    1. 引言 高校中很多学校开设了Java语言程序设计课程,这是一门实践性很强的语言,在程序设计中经常需要从键盘随机输入所需要的数据,Java语言中的键盘输入数据没有像C语言给我们提供的scanf(), ...

  7. win10c语言错误,win10打开程序提示错误状态0xc0000020的原因和解决方法

    win10系统打开程序弹出"c:\xx\xxx.dll没有被指定在windows上运行,或者它包含错误.请尝试使用原始安装介质重新安装程序,或联系你的系统管理员或软件供应商以获取支持.错误状 ...

  8. win10c语言0xc0000142,Win10应用程序无法正常启动0xc0000142错误的解决方法

    近期,有win10用户遇到一个问题,打开Word软件出现了"应用程序无法正常启动0xc0000142"的错误提示,将电脑重启之后依然会出现该提示,再次尝试打开发现可以正常打开,并且 ...

  9. java程序设计 一种跨学科_清华大学出版社-图书详情-《Java程序设计:一种跨学科的方法》...

    对于传统的CS1课程来说这本书是跨学科的方法.在本书中,作者重点讲述了从材料科学.基因组.天体物理学到网络系统等各学科中计算的角色.这种方法主要是向学生强调在当今世界中,数学.科学.工程和计算是紧密联 ...

最新文章

  1. python什么模块动态调用链接库_Python调用C/C++动态链接库的方法详解
  2. 如何在戴尔M系列交换机上配置简单交换模式
  3. 贪心/动态规划 - 摆动序列
  4. 11/100. Convert BST to Greater Tree
  5. 300+队伍/8大直播间,这场NXP智能车竞赛谁才是真的神车?
  6. 前端学习(3304):函数组件组件父组件子组件forwarRef聚焦
  7. 360网络修复工具_为什么大家都在骂360,但是360依旧是很强?
  8. load out mysql,快速的mysql导入导出数据(load data和outfile)
  9. linux目标机无法连接到网络,linux 安装了xunsearch服务,但是PHP连接显示:目标计算机积极拒绝...
  10. Nginx基本数据结构之ngx_list_t
  11. B站回应视频监控被破解上传:下架相关内容 封禁账号
  12. php打造自己的喜马拉雅,打造自己的私人知识宝库利器——mybase 7.3.5
  13. 微信demo小游戏:飞机大战从无到有
  14. 计算机机设应用基础,计算机机应用基础–word.ppt
  15. 大数据应用能力层次模型
  16. 电脑上怎么批量压缩图片?如何快速批量压缩图片?
  17. ES搜索特殊字符异常Encountered: <EOF> after
  18. vue.js 二级路由/三级路由
  19. 结构体 — C 语言中不定长结构体的使用
  20. Linux字符串截取

热门文章

  1. poj1950 Dessert(DFS)
  2. java火焰评测_JAVA性能分析之使用火焰图
  3. 双11电商技术:不再谷满谷,坑满坑,看苏宁库存架构转变
  4. 寒假训练八(优先队列)2020.02.14(7题)
  5. 追逐梦想,意味你要牺牲一切,这就是代价!!!----蔡赟
  6. 排球计分规则3.17
  7. 【记录】优麒麟(Ubuntu Kylin)系统的镜像下载以及在虚拟机(vmware)中的安装
  8. 占卜源码|塔罗牌占卜源码php开发搭建
  9. 广电在5G时代的发展和应对策略
  10. 边城科技“区块链+溯源”平台助力坪朗豆腐品牌升级