在很多情况下,定时器/计数器经常被用作其他用途或者无法实现时,只能用软件方法延时,比如,延时超过定时器定时范围的最大值。下面我们来分析一下通过软件实现的延时。
1.较短时间的精确延时
在汇编语言里,我们可以用NOP(空操作指令)来实现,一条NOP指令占用一个机器周期,比如我们用12MHz晶振,执行一条NOP指令,它就可以延时lμs,精确度可以达到1μ。使用也比较方便,我们可以在需要延时的程序中直接加上NOP指令即可实现延时。
同样,我们可以在C51中通过使用带一NOP-()语句的函数实现,_NOP-()就相当于汇编中的NOP指令,我们可以定义一系列不同的延时函数,比如Delayl0μs
DelaylOμs()函数中共用了6个一NOP-()语句,每个语句执行时间为lμs。主函数调用DelaylOμs()时,先执行一个LCALL指令(2μs),然后执行6个一NOP-()语句(6μs),最后执行了一个RET指令(2μS),所以执行上述函数时可以实现延时lOμs。
2.较长时间的精确延时
我们用汇编语言写单片机延时lOms的程序(12MHz晶振),可以编写下面的程序来实现:
这个延时程序共有七条指令,现在就每一条指令执行的次数和所耗时间进行分析:
第一条,MOVR5,#5在整个程序中只执行一次,且为单周期指令,所以耗时lμs;第二条,MOVR6,#4从⑥的指令可知,只要R5-1不为0,就会返回执行这条指令,共执行了R5次,共耗时5μs;第三条,MOVR7,#248同第二条类似,只要R6-1不为0,就会返回执行这条指令,同时受到外部循环R5的控制,共耗时R5×R6×1=20μs;第四条,DJNZR7,$只要R7-1不为0,就执行这条指令,同时受到外部循环的控制,由于该指令是双周期指令,共耗时为R7xR6×R5×2=9920μ8;第五条,DJNZR6,D2只要R6—1不为0,就反复执行此条指令(内循环R6次),又受外循环R7的控制,共耗时R6×R5×2=40μs;第六条,DJNZR5,Dl只要R5-1不为O,就反复执行此条指令,耗时为R5×2=10μs;第七条,RET此指令为双周期指令,耗时为2μs,我们也要考虑在调用子程序时用到LCALL指令,耗时2μs,最后可以得到总的延时为:
1+5+20+9920+40+10+2+2=10000μs=lOms我们可以总结延时总时间的公式:
延时总时间=[(2×一层循环次数+3)×二层循环次数+3]×三层循环次数+5(注意,此公式只适用于三层以内的循环)。
用C51编写上面的延时程序,通常要用到循环,下面分别介绍用for,while,do--while语句实现的延时,程序代码如下:
(1)用for语句实现的延时
在keilμvision3中查看dISAssembly窗口汇编程序代码,我们会发现和上面是一样的,因此,我们可以用同样的方法得出,延时总时间是lOms。
通过keilμvision3的disassembly窗口查看汇编程序代码,我们会发现和前边的两个是一样的,可知延时总时间是lOms。
通过上面的例子我们可以得出这样的结论,运用C51实现延时可以运用循环嵌套的方法,方法虽然可以不同,但是效果是一样的。在具体的开发过程中,我们可以根据自己的需要,灵活运用C51中的三种循环结构来实现精确延时。
此外,在实际的单片机开发过程中,我们很多时候是用硬件和软件相结合的方法实现精确延时的,这就需要我们在具体的情况下灵活运用各种方法,来满足开发的需要。
关键字:单片机 精确延时
引用地址:
通过单片机软件实现精确延时
推荐阅读最新更新时间:2024-03-16 15:50
IAR Systems和Energy Micro合作简化MCU应用开发
IAR Systems,宣布与低耗能MCU供应商 Energy Micro AS进行合作。Energy Micro在新发布的EFM32 Gecko开发套件中,选择了IAR Embedded Workbench for ARM作为其套件的嵌入式开发平台,这个套件的所有代码示例都基于IAR Systems的开发工具。此外,客户也有机会从IAR Systems直接购买Energy Micro的开发套件。
Energy Micro AS的工具经理Jorn Norheim这样说道:“IAR Systems的Embedded Workbench for ARM嵌入式开发平台可以产生高效率的代码,是我们EFM32 MCU的完
[嵌入式]
STM32的各个MCU性能评判
1写在前面 我们经常听见某手机发布会,安兔兔跑分多少多少,其实这个跑分就是体现手机性能的一个指标。我们使用STM32开发产品,选择MCU时,一般会综合考虑MCU各方面性能。对于MCU来说,一个重要指标是功耗,还有一个重要指标就是性能。 当我们进入ST官方微控制器网页,就会发现ST将MCU划分为不同层次,如下图: https://www.st.com/en/microcontrollers.html 从上面层次关系,大致可以了解ST各MCU的功耗和性能。 2 STM32 CoreMark跑分 STM32家族的32位微控制器基于ARM Cortex®-M处理器设计,为用户提供新的自由度。 产品集高性能、实时性、数字信号处理
[单片机]
MCU引脚输出模式中推挽输出与开漏输出电路原理区别
开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内). 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. 我们先来说说集电极开路输出的结构。集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做集电极开路(左边的三极管为反相之用,使输入为“0”时,输出也为“0”)。对于图1,当左端的输入为“0”时,前面的三极管截止(即集电极C跟发射极E之间相当于断开),所以5V电源通过1K电阻加到右边的三极管上,右边的三极管导通(即相当于一个开关闭合);当左端的输入为“1”时,前面的三极管导通,而后面
[单片机]
单片机程序是如何运行的,你有思考过吗?
大家都知道单片机可以烧写程序,但是大家知道程序烧写进单片机了,单片机是怎么运行程序的吗?今天我们就来说说单片机程序是如何运行的? 从单片机上知道,在上电的那一刻,MCU的程序指针PC会被初始化为上电复位时的地址,从哪个地址处读取将要执行的指令,由此程序在MCU上开始执行(当然在调用程序的 main之前,还有一系列其他的的初始化要做,如堆栈的初始化,不过这些我们很少回去修改)。PC在上电时,和MCU差不多,不过读取的是BIOS,有它完成了很多初始化操作,最后,调用系统的初始化函数,将控制权交给了操作系统,于是我们看到了Windows,Linux系统启动了。 如果将操作系统看作是在处理器上跑的一个很大的裸机程序(就是直接在硬件上跑的程
[单片机]
STC15单片机驱动WS2812B七彩LED(汇编混合编程)
WS2812B七彩LED具有集成度高、使用方便等特点,但是800K的数据速率(IO变化速率高达2.4M),对单片机提出了较高的要求,通常是采用SPI+DMA方式驱动, 也有人采用汇编实现,但是要预先把数据转换为按bit存放,在LED级连数量较多的情况下,需要占用极多的存储空间。 在驱动WS2812B上花费了太多的时间,走了不少弯路,记录下来: 简易数字分析仪采样频率最高只有4M,即测量精度为250ns,而信号宽度要求为400ns和850ns,这样测量的结果存在较大的误差,让人误以为信号跳变无规律, 迷失了方向;解决的办法就是利用STC单片机主时钟的内分频功能,语句:CLK_DIV |= 0x07; 将主频降低128倍,
[单片机]
51单片机上数码管的静态显示和动态显示
一、TX1C数码管介绍 共阴极和共阳极数码管,实验板上是共阴极数码管,6位一体的数码管。 连接原理图如下面两图:连在一起的段线(段选线即abcdefgh)控制数码管亮什么数字,独立的公共端(位选线即共阴极或共阳极)控制哪一位数码管亮。因为段线是连接在一起的,所以显示的数字是一样的,共阴极一端是独立的公共端,所以低六位分别控制哪位数码管亮。用两个锁存器可以控制任意数码管显示任意数字。 一、数码管的静态显示 静态显示就是位选打开的数码管上显示的数字都相同,因为段选是连接在一起的。 1、数码管的前三位显示666 #include reg52.h sbit wela=P2^7; sbit dula=P2^6; void m
[单片机]
dsPIC33F单片机的程序升级探讨
引言 实际应用中,由于客户需求变化或程序BUG修改等原因,经常出现需要使单片机应用程序升级的情况,本文利用 dsPIC33F 单片机运行时的自编程(Run-Time Serf-Programming,RTSP)特性,实现了基于该单片机应用程序的升级功能。 1 基本原理 dsPIC33F系列单片机提供了两种方式用于对其内部程序存储器进行编程:在线串行编程(In-Circuit Serial Programming,ICSP)和运行时自编程(Run-TimeSelf-Programming,RTSP)。ICSP使用5根线对单片机编程,主要用于产品调试或生产过程中,显然不适合用于产品运行时的程序升级。RTSP是通过
[单片机]
基于嵌入式PC104工控机和C8051F047单片机实现机器人系统的设计
1.引言 高压输电线及杆塔附件长期暴露在野外,因受到持续的机械张力、电气闪络、材料老化的影响而产生断股、磨损、腐蚀等损伤,如不及时修复更换,原本微小的破损和缺陷就可能扩大,最终导致严重事故。因此,电力公司需要定期对线路设备进行巡检,及时发现早期损伤和缺陷并加以评估,根据评估结果安排必要的维护和修复,从而确保供电的安全可靠性。传统的人工巡检方法不仅工作量大而且条件艰苦,特别是对于山区和大江大河等的输电线路巡检存在很大困难,甚至一些巡检项目靠常规方法都难以完成。因此,采用机器人自动巡线成为保障高压输电线安全运行的一种必要手段。 高压输电线路巡线机器人属于特种机器人的研究范畴,主要完成高压供电线缆的无损探伤、悬垂绝缘子绝缘特性检测、
[单片机]