单片机C语言的精确延时的计算

发布者:光速思考最新更新时间:2016-01-14 来源: eefocus关键字:单片机  C语言  精确延时 手机看文章 扫描二维码
随时随地手机看文章
关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

 

 

共有三条延时函数说明如下:

函数调用分两级:一级是小于10US的延时,二级是大于10US的延时

//====================小于10US的【用1US级延时】====================

//----------微秒级延时---------

for(i=X;i>X;i--) 延时时间=(3+5*X)/12   提示(单位us,  X不能大于255)

 

//================大于10US<小于21.9955Ms的可用【10US级延时函数】===========

void Delay10us(uchar Ms)

{

    uchar data i;

    for(;Ms>0;Ms--)                       

for(i=26;i>0;i--);

}

i=[(延时值-1.75)*12/Ms-15]/4

如想延时60US则  i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i的值=26,再调用上面的【10US级延时函数】Delay10us(6); 则就精确延时60US;

如果想延时64US可以用这二种函数组合来用: Delay10us(6); for(i=9;i>X;i--)  共延时64US

 

//==============对于大于20Ms的可用中断来实现程序运行比较好===============

中断用定时器0, 1Ms中断:

void timer0(void) interrupt 1                                 

                                                            

    TL0=(0xffff-1000+2)%0x100;TH0=(0xffff-1000+2)/0x100; //每毫秒执行一次

    if(DelayMs_1>0)DelayMs_1--;//大于20Ms延时程序 

}

函数调用

void DelayMs(uint a)//延时 a×1(ms)的时间。

{

    DelayMs_1=a;

    while(DelayMs_1);

}

如果延时50Ms则 函数值为  DelayMs(50)

//+++++++++++++++++++++++++公式推算来由++++++++++++++++++++++++++++

二级延时C语言反汇编见上传图1:


 

//=======================STC单片机延时指令时间====================

 指今               时间(1us)               指今               时间(1us)

MOV    Rn                             SETB             1

MOV   Rn  #data                           SUBB   #data    

DJNZ  Rn  rel       4

Dec   Rn                                   SJMP  rel            3

JC    rel                                   MOV   Rn direct          

Lcall addr16                                 RET                 

//--------------

JNZ                                        XRL                 2

SUBB              

 

使用Delay10us(uchar Ms) 最多能延时21995.5us;

其中循环外函数调用与返回用的时间=(6+4)进入+退出(1+1+2+3+,4)=10+11=21/12=1.75us;

循环内函数时间 MS= Ms*(1+1+2+3,+2+4*I+3+3)/12=Ms*(15+4*I)/12 ;

所以如果延时60us时用【10US级延时函数】I的值为:

60=循环外时间+循环内时间=1.75us+ Ms*(15+4*I)/12;

则i=[(60-1.75)*12/6-15]/4=25.375≈26即如果Ms=6, i=26;

本算法中的12是STC12单片机与普通标准速率比。

关键字:单片机  C语言  精确延时 引用地址:单片机C语言的精确延时的计算

上一篇:如何在keil中调用proteus进行MCU外围器件的仿真
下一篇:单片机的抗干扰措施

推荐阅读最新更新时间:2024-03-16 14:43

车规级MCU相关知识科普
一辆传统燃油车需要大约500到600颗芯片,轻混汽车大约需要1000颗,插电混动和纯电动汽车则需要至少2000颗芯片。 这就意味着在智能电动汽车快速发展的过程中,不仅对先进制程芯片需求不断增加,而且对传统芯片需求也会持续增加。MCU就是这样,除了单车搭载的数量在不断增长,域控制器也带来了对高安全、高可靠、高算力MCU的新需求增长。 MCU,Microcontroller Unit,中文称单片微型计算机/微控制器/单片机,将CPU、存储器、外围功能整合在单一芯片上,形成具有控制功能的芯片级计算机,主要用于实现信号处理和控制,是智能控制系统的核心。 MCU和汽车电子,工业,计算机和网络,消费电子,家电和物联网等我们生活和工
[嵌入式]
车规级<font color='red'>MCU</font>相关知识科普
PIC单片机模/数转换器ADC模块的设计思路及电路设计
PIC16F877单片机的ADC内部结构如图1所示。40引脚封装芯片与28引脚封装芯片的区别主要在于模拟口的数量不同,28引脚封装芯片没有AN5~AN7模拟量输入通道,其他各部分的功能和组成关系相同。PIC16F877单片机的ADC内部结构图如图2所示。   图1 主程序及中断程序流程   图2 PIC16F877单片机的ADC内部结构图   PIC16F877单片机内部嵌入的ADC模块具有10位数字量精度,共有8个模拟通道,与ADO模块有关的寄存器共有11个,其专用的4个寄存器分别为:ADCCON0、ADCCON1、ADRESH及ADRESL。   源阻抗(RS)和内部采样开关(RSS)阻抗直接影响所要求的充
[单片机]
PIC<font color='red'>单片机</font>模/数转换器ADC模块的设计思路及电路设计
单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区
BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器。对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存储器中所有的数据都是不可读的,这就在运行旧程序和写入新程序之间造成了一个矛盾。 使用BOOT区是解决这个矛盾的方法之一,它将FLASH存储器从物理上分为两个独立的区域,对其中的一个区的数据写入不会影响到另一个区的数据读取操作。我们可以让单片机的程序在其中一个区(通常是BOOT区)运行,而运行着的程序代码写入另外一个区(通常为应用程序区)内。 AVR高档单片机ATmega系列中含有BOOT代码区,即程序引导区,也可称器件自身监控
[单片机]
入手STM32单片机的知识点总结
本文将以STM32F10x为例,对标准库开发进行概览。主要分为三块内容: · STM32系统结构 · 寄存器 · 通过点灯案例,详解如何基于标准库构建STM32工程 (文末有STM32、物联网开发相关的网盘资料,包括物联网开发从基础到实战、IoT-ARM结构下的各类智能产品的设计、STM32的开发、全国电赛优秀作品分析等,如有需要请自行领取) STM32系统结构 STM32f10xxx系统结构 内核IP 从结构框图上看,Cortex-M3内部有若干个总线接口,以使CM3能同时取址和访内(访问内存),它们是: 指令存储区总线(两条)、系统总线、私有外设总线。 有两条代码存储区总线负责对代码存储区(即 FLASH 外设)的
[单片机]
基于PIC单片机的智能型漏电继电器的设计
  漏电继电器是一种可在被保护线路漏电电流达到设定值后切断被保护线路供电电源的保护装置,在电力系统中起着非常重要的作用,是保证供电可靠性的基础。随着电子技术和计算机技术的发展,电力系统的继电保护突破了传统的数字式保护继电器,出现了以微处理器为核心的智能保护继电器 。本文利用PIC18F6585型单片机设计了一款智能型漏电继电器,具有自诊断、故障记录、数据通信等多种功能,为故障分析提供便利,且具有较高的可靠性。   1 PIC系列单片机特点   PIC18F6585是由Microchip公司开发、研制和生产的PIC系列单片机,该系列单片机的技术性能具有以下优点 :   (1)哈佛总线结构。PIC系列单片机在架构上采用了与众不同
[模拟电子]
STM32单片机的5个时钟源解析
一、时钟系统框图讲解 1. STM32的5个时钟源 a。高速内部时钟 HSI,大约为8MHz b。高速外部时钟 HSE,晶振取值范围在4M--16M,一般采用8M晶振 c。低速外部时钟 LSE,32.768k晶振,可以作为RTC的时钟源 d。低速内部时钟 LSI,大约为40KHz e。PLL锁相环时钟 2. 系统时钟 系统时钟SYSCLK的3个来源 a。HSI b。HSE c。PLL 3. RTC的时钟来源 a。LSE b。LSI c。LSE的128分频 4. 独立看门狗IWDGCLK的时钟来源 LSI 5.USB的时钟USBCLK的来源 最大频率为48MHz PLL经过预分频器产生1或1.5分频 6. 内部时钟输出MCO,为
[单片机]
STM32<font color='red'>单片机</font>的5个时钟源解析
51单片机直接驱动共阴极数码管
单片机驱动Led数码管(或n个Led)应该算是单片机经典试验之一了。 数码管种类: 少量的数码管实际可以直接用单片机驱动(如4个数码管)。数码管数码管有两种:共阴极和共阳极数码管。虽然只是一个极性的不同,实际应用时大有不同(根据网上资料小结如下): 数码管类型 上拉电阻 限流电阻 对单片机电流的影响 三极管驱动 工业IC 共阳极 不需 200~470 (非排阻) 位码高电平, 段码低电平时点亮 PNP 共阴极 需要 (可
[单片机]
8051单片机的历史_8051单片机的应用领域
  目前,有关8051单片机的说法很多:8051单片机是Intel发明的,可与8位系列处理器一起使用。现在,8051单片机已广泛应用于各个行业以及家庭的各种家用电器上。      一、8051单片机的历史   如果我们回顾历史,8051单片机是由微处理器巨头Intel于1980年首次发明的,并且逐渐被全世界所接受,并且随着未来的每一天,8051单片机的重要性正在不断提高。当它由英特尔发明时,它是通过NMOS技术开发的,但作为NMOS技术却不是很有效。   为了提高效率和生产率,英特尔通过实施CMOS技术对它进行了改型,并出现了一个新版本,名称中带有字母“C”,比如:“80C51”。新版8051单片机具有两条总线,一条总线用于程序
[单片机]
8051<font color='red'>单片机</font>的历史_8051<font color='red'>单片机</font>的应用领域
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved