在不同单片机中,有不同的单片机指令。每个指令都占用不同的时钟周期。一般延时程序就是通过循环去达到延时的作用。
下面以最基础的51单片机去做说明:
我这边用我之前debug过的2个延时程序,晶振使用12M:
void delay_us_fun (unsigned int i) //us延时
{
while (i--);
}
这个是用来微秒级延时的,他在不同的参数i下,延时时间分别为实际为(9*i+16)us,这些延时的实际时间一般可以通过开发环境keil C51中模拟一下,看下时钟就知道了。
汇编好点的话也可以直接看汇编计算或者直接写汇编程序。
这时我们可以使用下面宏去调用上面的接口
#define _delay_us(i) delay_us_fun((i)/9)
这边显然有点误差的。但是数值越大,误差就相对小点。
仅仅需要几us的延时,使用_NOP_();
下面ms级延时一样。
void delay_ms_fun (unsigned int mDelay1) //ms延时
{
unsigned int mDelay2;
for (; mDelay1 > 0; mDelay1--)
{
for (mDelay2 = 0; mDelay2 < 123; mDelay2++)
{
}
}
}
#define _delay_ms(i) delay_ms_fun((i*1000L)/998L) //实际为(i*1000-13)/998
总而言之,就是根据单片机的指令,还有每个指令占用的时钟周期计算出相对应的精确延时。
关键字:单片机延时 精确计算
引用地址:
单片机延时精确计算
推荐阅读最新更新时间:2024-03-16 15:10
【51单片机】利用烧录软件生成延时函数 入门学习
1.打开烧录软件 2.(1)找到延时计算器 (2)选择晶振(11.0592和12Mhz的情况下建议都选择12Mhz) (3)选择时间单位us 或者 ms 3、 (1)选择STC-Y1(该系列适用51单片机系列,具体看图中2) (2)生成代码 (3)复制代码到keil 4. 生成的代码并不能直接使用,还需要加上以下几句话 下文中延时时间的是Delay(1)=1ms 下图中可以看到,程序从19走到21,延时0.10080200s,误差几乎忽略不计。对于精度要求不高的延时计算已经够用了。 同时也能通过更改i,j的值进行微调。
[单片机]
51单片机几个延时程序
简介:51单片机几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响. 一. 500ms延时子程序(晶振12MHz,一个机器周期1us.) 程序: void delay500ms(void) { unsigned char i,j,k; for(i=15;i 0;i--) for(j=202;j 0;j--) for(k=81;k 0;k--); } 计算分析: 程序共有三层循环 一层循环n:R5*2 = 81*2 = 162us DJNZ 2us 二层循环m:R6*(n+3) = 202*165 =
[单片机]
通过51单片机定时器/计数器实现精确延时
MCS-51单片机内部共有两个16位可编程定时器,计数器,即TO、Tl。既有定时功能,又有计数的功能。每个定时器都是由两个8位的特殊功能寄存器THi和TLi组成(i=0、1)。TMOD是TO和Tl的工作方式控制寄存器,TCON是TO和Tl的运行状态控制寄存器。在实际应用时,应首先根据需要对这些寄存器进行初始化,即设置TO和Tl的工作方式并对TO和Tl定时器装入初始值以得到精确的定时时间。TO和Tl的工作方式及运行状态是由TMOD和TCON两个特殊功能寄存器控制的,而TMOD和TCON是由用户所编的程序控制的。 定时器的核心是一个加l计数器,加l计数器的脉冲有两个来源:一个是系统时钟振荡器,另一个是外部脉冲,计数器对脉
[单片机]
51单片机通用汇编延时子程序
[DELY]:通用延时子程序 [地址]:7FEBH - FFEBH [功能]:延时 [入口]:延时常数放在 R2 寄存器中。时间常数 N(十六进制)所对应的延时时间(6MZH 晶振时)见下表: [出口]:R2=0 [占用寄存器]:R2 [调用]:无 例:延时1 秒子程序 MOV R2,#18H LCALL 7FEBH RET ORG 7FEBH ;通用延时子程序(07EBH & 0FEBH & ...) L7FEB: PUSH 02H ;R2(复位后R2即为 02H)存放时间常数,进栈保护 L7FED: PUSH 02H ; R2 进栈保护 L7FEF: PUSH
[单片机]
单片机C语言精确延时分析
前阵子 琢磨了 ds18b20 温度测控芯片 一直对单片机的延时问题 留有疑惑 花了一下午时间 用 keil 逐步调试和proteus 仿真 对延时问题 做了一些分析 通常 单片机在对时间要求精确的情况下 会使用汇编 来实现相应的模块 通过计算其相应的机器周期 命令执行周期 可以得到精确的时间控制 C语言下 常用的延时 方法 有 for 循环 和 while() 循环 和 定时器延时 但是使用 for 循环 得到的延时效果 不够精确 执行一次 可能会有 10多us 原因已经有人 做了分析 一般单片机 C语言编程 需要经过 编译 将其 转为 汇编代码后 再生成16进制文件 在keil 下 点击菜单栏 flash - Configur
[单片机]
PIC单片机延时问题
#include p18f45k22.h //时间函数的测试 非定时器的使用 软件仿真 调试debug的使用 //在watch当中可以添加特殊功能寄存器和变量等 #define uint unsigned int #define uchar unsigned char void delayChar(uchar n);//uchar的取值在0~256之间 否则溢出 void delayInt(uint n);//使用时尽量在对时间要求不精确时使用 void main(void){ ANSELA=0; TRISAbits.RA0=0; PORTAbits.RA0=1; delayChar(5); PORTAbits.RA0=
[单片机]
单片机+CPLD的多路精确延时控制系统
1 引言 现代控制系统中控制对象可能是复杂、分散的,而且往往是并行、独立工作的,但整体上它们是相互关联的有机组合。因此,控制信号的时序逻辑则要求更加精确。CPLD单片机为控制系统提供了技术支持,由CPLD和单片机组成的多机系统具有逻辑控制方便,时序精确,并行工作,人机接口友好等优点。因此,本文提出了一种基于CPLD与单片机控制的多路精确延时控制系统的设计方案。 2 设计指标与系统原理 2.1 设计指标 输出多路脉宽为10 ms正脉冲信号; 脉冲输出时间独立调节、显示; 时间调整范围与精度为微秒级的调整范围为l~199μs,调节精度为lμs;毫秒级的调整范围为1~199 ms,调整精度为1 ms; 提供计时基准
[单片机]