很多人从汇编转到C语言后感到不是非常适应,特别是一些要求比较高的延时程序,感觉C的操控性没有汇编那么高。在DALLAS的单总线(1-wire)操作中,对延时的精度由为重要。很多人写单总线的程序的时候一般是在C中嵌入汇编。这是最直观的一种方法。但不是最方便的。在Keil C51中,还是有一定规律可寻的。经过一些尝试,得到了一种比较好用的方法。可以通过软件仿真来验证。程序的执行时间可在keil仿真状态下的左侧察看。
1.精确延时试验代码:
void delay(unsigned char i);
void main()
{delay(50);
while(1);
}
void delay(unsigned char i)
{while(--i);
}
延时说明:采用本延时程序可满足精度要求比较高的短延时。
精确延时时间=2*i*T+5*T
T为一个机器周期
比如晶振采用12M,那么delay(50);延时时间=2*50*1uS+5*1uS=105uS
2.近似精确延时试验代码:
void delay(unsigned int i);
void main()
{delay(50);
while(1);
}
void delay(unsigned int i)
{while(--i);
}
延时时间=8*i*T(约等于,实际值比此值大,延时时间越长,误差越大,最大误差262*T)
关键字:while 延时讨论 延时程序
引用地址:
关于while(--i)延时讨论
推荐阅读最新更新时间:2024-03-16 13:53
HAL库中do{...} while(0U)宏定义的作用和意义
1写在前面 很多初学者,以及有一定工作经验的朋友都不知道这个“do{...} while(0U)”作用和意义,甚至觉得这样写的代码复杂且没意义。 相信使用过STM32Cube HAL库的朋友都知道,源码里面有许多do{...} while(0U)的宏定义语句。 今天讲的主要知识点是:HAL库中do{...} while(0U)作用和意义。 当然,do{...} while(0U) 不限于HAL库中,适用于很多地方。 2 HAL库中do{} while(0U)宏定义 在HAL库中,很多.h文件都有do{...} while(0U)这样的宏定义,比如:在stm32f1xx_hal_rcc.h中,使能GPIO时钟:
[单片机]
c51 1ms-6MHZ延时程序
#include reg52.h void delay(unsigned char n) //约n(ms)延时 { unsigned char i,j,k; for(k=0;k n;k++) { for(j=0;j 5;j++) // 约1ms延时 { for(i=0;i 31;i++) //约0.1ms延时 {;} } } } main() { while(1) { delay(15); } } /*约15ms延时 ,需较准确延时: 1、在 keil uvision3\project\options for target\target\
[单片机]
单片机延时程序分析
单片机延时程序分析 应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动 DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计时器甚至已经全部派上了别的用途。这时就需要我们另想别的办法了。 汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要: mov r0, #09h loop: djnz r0, loop 51 单片机的指令周期是晶振频率的1/12,也就是1u
[单片机]
C51全局初始化及精确延时程序
/********************************************************************************************************* * Initialization Program * QiZhao,2007 * All Rights Reserved * File : initial.h * By : QiZhao * Contact : zq1987731@163.com * * Version : V2.
[单片机]