原标题:编写延时函数的简单方法

如果从keil里看了c语言的反汇编代码然后根据晶振和指令计算延时的时间这样虽然非常的准确但是相当的麻烦而且容易搞错,我这里介绍一个最简单的方法.可以验证你的

这里用一个例程详细介绍一下。

过程参考如下:

在编译器下建立一个新项目,也可以利用已有项目。此过程中需要注意,晶振的选择,因为for循环里指令的执行时间和晶振有直接关系,本例中晶振使用11.0592M。

编写一段关于延时的函数,主要利用for循环,代码如下:

void delay_ms(unsigned int ms)

{

unsigned int i;

unsigned char j;

for(i=0;i

{

for(j=0;j<200;j++);

for(j=0;j<102;j++);

}

}

其中ms是输入参数,如果输入1,就是要求程序延时1ms。

j变量是调整程序运行的时间参数。调整j的数值,使1次循环的时间在1ms。

将此程序编译通过,然后利用软件仿真,调整时间。

下面这个sec就是程序运行到现在的这一行所用的时间。

两次时间差就是延时函数使用的时间,如果与1ms相差比较多,用户可以调整j参数的值,使延时时间尽量接近1ms。如增大j的值for(j=0;j<105;j++);

此方法得出延时函数,在晶振不同的情况下,延时时间会不准。软件调试结果,这个程序的延时时间为:1.01779ms,一般的单片机系统中都可以应用。

下面来说说汇编的传统计算方法:

指令周期、机器周期与时钟周期

指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。

时钟周期:也称为振荡周期,一个时钟周期 =晶振的倒数。

MCS-51单片机的一个机器周期=6个状态周期=12个时钟周期。

MCS-单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/12000000)=1us。

了解了上面这些我们来看一个例子

;============延时1秒子程序========================

DELAY_1S: ;延时子程序,12M晶振延时1.002035秒

MOV R4,#10

L3: MOV R2 ,#200 ;1指令周期

L1: MOV R3 ,#249 ;1指令周期

L2: DJNZ R3 ,L2 ;2指令周期

DJNZ R2 ,L1 ;2指令周期

DJNZ R4 ,L3 ;2指令周期

RET ;2指令周期

;循环体延时时间: [(249*2+1+2)*200+1+2]*10*12/12000000=1.002030s

;加上ACALL指令和第一条mov指令以及最后一条RET指令算出来整个函数的时间为1.002035s

;================================================

通常选用的是11.0592MHZ的晶振:

[(249*2+1+2)*200+1+2]*10*12/11059200=1.08727213541666666...S

汇编延时子程序的延时计算问题

对于程序

DELAY: MOV R0,#00H

DELAY1: MOV R1,#0B3H

DJNZ R1,$

DJNZ R0,DELAY1

查指令表可知 MOV一个机器周期,DJNZ 指令需用两个机器周期,而一个机器周期时间长度为12/11.0592MHz,所以该段程序执行时间为:

((0B3×2+1+2)×256+1)×12÷11059200=100.2789mS

第一层:DJNZ R1,$:执行了B3H次,一次两个周期,所以为0B3×2;

第二层:MOV R1,#0B3H为一个周期,DJNZ R0,DELAY1为两个周期,这样循环一次就是0B3×2+1+2个周期;第二层的执行次数本来是255次,但因为赋首值为0,而DJNZ是先减1,再比较的,所以就应该是256次。

这样的话,整个循环执行完应该是(0B3×2+1+2)×256+1次。再加上开始赋值这一句,就是((0B3×2+1+2)×256+1)了

还说明一下:

nop指令或者_nop_(); 函数占一个机器周期,在stc单片机的12T模式下一个机器周期是一个振荡周期的12分频,如果你的晶振是12MHZ,那你的一个机器周期就是1微秒.一个nop指令的执行时间也就是1US

当在6T模式(下载的时候可选择模式)下12M晶振的时候,一个nop就是0.5US了.

责任编辑:

matlab怎样编写延时函数,编写延时函数的简单方法相关推荐

  1. matlab 动态存储图片,Matlab刷新图像及保存.gif动图的简单方法

    ​​ 有很多时候我们需要在PPT中展示一个动态变化的图像,这就需要不断刷新绘图以及保存独立的动画或者视频,matlab对于这一功能有非常完善的支持. 查文档就有还非要写报告,我摸鱼的时间也很宝贵的好么 ...

  2. [原创].关于编写Nios II的延时函数的一点心得

    平台 硬件:nios/f 100MHz 软件: 内容 0 一点说明 本文仅讨论所述平台的一点心得,若其他等级的nios或优化,请自行研究. 1 usleep()有多准 参考[笔记].怎样使用Nios ...

  3. 【 MATLAB 】通过案例学会编写一个 matlab 函数(小猫掉进山洞问题)

    这是关于matlab学习的第一篇博文,我是不愿意承认自己不会MATLAB的,因为这东西大一的时候就学过,如果白驹过隙,都不好意思说自己研几了,科研的过程中MATLAB是必须要会的,于是得系统的看一下了 ...

  4. matlab实验函数编写与程序设计,matlab实验四函数编写与程序设计.doc

    实验四:函数编写与程序设计 一.实验目的1 . 掌握M文件的创建. 2.掌握函数的编写规则. 3.掌握函数的调用. 4 . 掌握基本的输入输出函数以及显示函数的用法. 5.会用Matlab程序设计实现 ...

  5. matlab实验函数编写与程序设计,matlab实验四函数编写与程序设计

    <matlab实验四函数编写与程序设计>由会员分享,可在线阅读,更多相关<matlab实验四函数编写与程序设计(8页珍藏版)>请在金锄头文库上搜索. 1.实验四:函数编写与程序 ...

  6. matlab中ode指令,matlab中ode5函数编写.doc

    matlab中ode5函数编写 function varargout = ode45(ode,tspan,y0,options,varargin) %ODE45 Solve non-stiff dif ...

  7. matlab输入数据作方程,用MATLAB函数编写并求解微分方程

    实验八:用MATLAB 函数编写并求解微分方程 一.实验原理 为了对连续系统进行方针,首先需要建立其数学模型,然后利用计算机求这些数学模型,从而得出数学模型的数值解.由于连续系统是通过微分方程老建模的 ...

  8. 【Matlab】如何规范地编写一个MATLAB函数文件

    在matlab中,M文件分为脚本文件和函数文件.如果M文件的第一个可执行语句以function开头,那这个M文件就是函数文件.函数文件内定义的变量为局部变量,只在函数文件内部起作用,当函数文件执行完后 ...

  9. 基于MATLAB的数论运算与编写函数(附完整代码)

    目录 一. 基本数论运算 例题1 例题2 例题3 例题4 二. 循环结构 2.1 for 结构 2.2 while结构 例题5 例题6 例题7 三. 转移结构 例题8 四. 开关结构与试探结构 4.1 ...

最新文章

  1. ksnapshot运行look up error undefined symbol错误解决方案
  2. python-自动发邮件
  3. Java 动态代理与class字节码动态修改技术
  4. leetcode209. 长度最小的子数组(滑动窗口)
  5. vue 利用hash值实现刷新无跳转页面
  6. ubuntu 安装配置JDK
  7. 【MyBatis笔记】使用注解开发
  8. Java Web开发的轻便架构Tapestry5---页面渲染之框架职责
  9. weblogic部署模式
  10. H5-表格的基本样式
  11. Linux交叉编译FFmpeg
  12. 户籍管理系统php,vue实现户籍管理系统的实例解析
  13. 理解SVM的三重境界
  14. 正则匹配 正则表达式在线工具
  15. oracle ora 3136,关于ORA-3136的处理思路
  16. Celery (1)- 安装配置及使用
  17. 百度快速收录我的网站-百度推送软件免费
  18. 12月份参加工作的年假怎么休_12月份满一年的,年假必须在12月份休完吗?
  19. 什么是进销存管理系统?
  20. 项目管理翻译词汇补充

热门文章

  1. VRP远程管理(华为设备telnet登录密码配置与测试环境搭建)——在物理机上创建回环网卡及eNSP模拟器与物理机实现连接通信
  2. 手机投屏到电脑显示屏
  3. 程序员软考真题__专项:数据结构与算法 02
  4. 研发团队专业能力提升
  5. 小鸡饲料任务,线下扫码付款收饲料地址
  6. 色即是空 空即是色_huadingjin_新浪博客
  7. React---关于useCallback和useMemo的详解
  8. 微信小程序实现封装处理
  9. netty--关于NIO和OIO
  10. Springcould学习总结