点亮LED以后,如果我们想实现LED间隔性的亮灭,我们又该怎么办呢?这里我们就需要使用单片机进行延时。延时的方法有两种,一个是使用软件延时,这个不精确,但能满足简单的需要;二是使用单片机内部的定时器,这个很精确,可以精确到微秒级。在这里,我们讨论一下如何使用软件延时。

我们知道,单片机执行每一条代码都需要时间,那么如果我们重复让单片机执行某些指令,就可以“拖住”单片机,让它去干其他的事情,从而实现延时的效果。例如以下代码:

#include <REGX52.H>#define uint     unsigned int
sbit led1 = P2^0;uint i,j;void main(void)
{while(1){led1 = 0;     //点亮LED1for(i=1000; i>0; i--)  //延时for(j=110; j>0; j--);led1 = 1;  //关闭LED1for(i=1000; i>0; i--)  //延时for(j=110; j>0; j--);}
}

以上程序,可以实现LED的一亮一灭,达到闪烁的效果。但是,延时的时间究竟是多少呢?我们该如何计算2层嵌套for语句执行的时间呢?

其实,我们可以使用Keil软件进行仿真,从而对延时语句进行精确的计算。

接下来,我们对源代码进行编译,并进入软件模拟调试模式。

成功编译通过

进入软件模拟调试模式,这里可以单行执行语句,并观察寄存器、变量以及硬件I/O口的变化。此时的sec = 0.00042209 s。这是程序启动执行到目前位置所花的累计时间。

设置断点(断点处即下一步要执行的指令),点击全速运行(Run, F5)。

停在断点处,即将执行延时语句。此时从程序开始,累积时间为0.00042318 s。

此时,延时语句已经执行完毕,时间来到0.96831272 s。进行简单的数学计算,延时语句执行,耗费了0.96831272 - 0.00042318 =   0.96788954 s = 967.88954 ms。大约1s的时间。

这里有个经验,只要变量i, j是unsigned int 类型,并且j = 110不变,那么i的值为多少就代表延时约多少毫秒。

在实际的编程中,为了效率和方便,可以将延时语句写成一个带参函数类型,从而能实现我们想要的延时效果。源代码如下:

void delay_xms(unsigned int xms)
{   uint i, j;for(i=xms; i>0; i--)for(j=110; j>0; j--);
}

全部源代码如下:

#include <REGX52.H>#define uint     unsigned int
sbit led1 = P2^0;void delay_xms(unsigned int);void main(void)
{while(1){led1 = 0;     //点亮LED1delay_xms(1000);led1 = 1;  //关闭LED1delay_xms(1000);}
}void delay_xms(unsigned int xms)
{   uint i, j;for(i=xms; i>0; i--)for(j=110; j>0; j--);
}

单片机软件延时的时间计算相关推荐

  1. 单片机 软件延时时间控制

    单片机 软件延时时间控制 一.简述    记--通过代码方式实现软件延时(不精确延时). 二.指令周期          单片机需要一个时钟信号送给内部各个电路,才能使它们有节拍地协同工作.时钟信号的 ...

  2. [STC系列单片机/51单片机]软件延时计算方法详解

    选取12M晶振时,时钟周期为(1 / 12) us,且假如单片机工作在12T模式下,则一个机器周期为12 * (1 / 12) = 1 us. 为表述方便,下文均用T_M表示机器周期,观察KEIL仿真 ...

  3. 51单片机——软件延时实现跑马灯仿真

    注:本文主要利用keil和proteus软件联合仿真51单片机进行跑马灯实例(软件延时). keil 程序 #include <REGX51.H> void delay(unsigned ...

  4. STC系列单片机软件延时,ms级较精确

    #include <reg51.H>#define STC_Y1 97560U // 89C/LEXX.90C/LEXX #define STC_Y3 14050U // 10F/Lxx. ...

  5. 单片机实现延时两种方法

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

  6. 编写10ms延时的子程序c语言,单片机定时器延时程序

    单片机定时器延时程序 单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0 ...

  7. 单片机的延时与中断问题及解决方法

    延时与中断出错,是单片机新手在单片机开发应用过程中,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机.MSP430单片机.C51单片机.8051F的单片机.avr单片机.STC89C52. ...

  8. 单片机小精灵(延时、定时计算软件)

    使用延时计算软件可以省略自己计算的时间,大大提高效率.  使用方式: 1.选择单片机晶振频率,一般是 11.0592 和 12 MHz . 2.选择单片机模式,C51.C52系列一般都是12T.不清楚 ...

  9. 51单片机c语言延时计算软件,51单片机精确延时程序大集合+初值计算工具

    在论坛上看到不少不错的延时程序,整理如下共同分享: 精确延时计算公式: 延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5 ;延时5秒左右 DELAY5S:PUSH   04H;2个 ...

最新文章

  1. Codejock的使用--皮肤
  2. 使用opencv_traincascade训练Haar、HOG、LBP Adaboost分类器
  3. ai中如何插入签名_如何在PDF中插入一个或多个空白页?
  4. mysql select union_MySQL SELECT语法(四)UNION语法详解
  5. IDA Pro安装教程
  6. aws 弹性三剑客_AWS和弹性:超越用户需求
  7. android二级菜单实现,Android编程实现二级下拉菜单及快速搜索的方法
  8. MySQL 5.7新特性
  9. partition by 和 group by
  10. python模板怎么写,Python模板
  11. 影响机器视觉检测系统不稳定性因素分析
  12. 【数学建模】数据包络分析法
  13. Flutter 替换高德定位默认图标
  14. java图片上传同时后台直接给MultipartFile对象添加图片水印或者文字水印,然后直接上传带水印的图片
  15. The following signatures couldn‘t be verified because the public key is not available问题解决
  16. linux 修改键盘键值
  17. Python 实现图像快速傅里叶变换和离散余弦变换
  18. Java——this关键字(调用本类属性、调用本类方法、表示当前对象)
  19. 线性系统与非线性系统、定常系统和时变系统、连续系统和离散系统、单输入单输出系统与多输入多输出系统(自动控制原理)
  20. 大数据分析岗位的就业前景

热门文章

  1. 竞品商业情报收集和竞品商业情报分析该怎么做?
  2. numpy 数组扩充维度
  3. 计算机网络读书笔记(二)
  4. android ftp同步程序,ftp同步 安卓,安卓手机ftp上传下载文件功能同步视频照片
  5. MIC灵敏度, MIC动态范围下限值估计, -3dB, dB加减
  6. JAVA Spring Security对接QQ快速登录(web应用)
  7. 世界杯网页梦幻联动.html
  8. ifstat网络流量监控之/proc/net/dev文件
  9. TCP三次握手及其相关问题
  10. 实现FTP服务器免登陆下载PDF文件转base64在下载到本地|服务器