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

发布者:石头12345最新更新时间:2012-11-24 来源: 21ic 关键字:单片机  C语言  精确延时值 手机看文章 扫描二维码
随时随地手机看文章

关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而51hei给出的本函数克服了以上缺点,能够精确计数出要延时值且精确达到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   A   Rn       1                        SETB  C             1
MOV   Rn  #data     2                        SUBB  A   #data     2 
DJNZ  Rn  rel       4
Dec   Rn            3                         SJMP  rel            3
JC    rel            3                         MOV   Rn direct      4      
Lcall addr16          6                         RET                 4  
//--------------
JNZ                 3                         XRL                 2
SUBB               3 
 
使用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语言精确延时值的计算

上一篇:51单片机驱动1602液晶显示器c程序
下一篇:单片机控制可控硅调光不闪电路+程序

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

细说单片机晶振电路中22pf或30pf电容的作用
单片机 模拟 器件搜索 单片机原理 单片机时序 单片机分类 单片机结构分析 单片机存储器 单片机程序的完善 单片机延时程序 单片机寻址 单片机指令系统 计数器与定时器 单片机中断系统 单片机串口 单片机看门狗 单片机烧写 单片机常见问题 您当前的位置: 首页 基础知识 单片机 单片机常见问题 细说单片机晶振电路中22pf或30pf电容的作用 来源:互联网 作者: 关键字: 单片机 晶振 刚学单片机的学长告诉我单片机的晶振电路中就是用22pf或30pf的电容就行,听人劝吃饱饭吧,照着焊电路一切ok,从没想过
[单片机]
细说<font color='red'>单片机</font>晶振电路中22pf或30pf电容的作用
基于增强型SPI接口的大容量Flash扩展实现
1 引言 随着信息时代的到来,各种信息的集成和交互越来越频繁。运动控制系统中需要处理和存储的信息量也与日俱增,大部分运动控制系统的核心器件MCU自身已经集成了较大容量的存储器(与以前MCU相比),但仅仅依靠MCU自身的存储器一般很难满足系统对大容量存储的要求,因此必须找到高效的方法实现对系统存储容量的扩展。 SPI是一个高效、数据位数可编程设置的高速输入/输出串行接口,几乎所有MCU生产厂商都提供对SPI接口的支持,目前高速SPI接口的时钟频率已达到60MHz甚至更高,SPI接口一般只用4根连接线即可完成所有的数据通讯和控制操作,因此不占用MCU的数据总线和地址总线,极大的节约了系统的硬件资源,是一种经济实用的扩展系统
[缓冲存储]
单片机中的一些寄存器属于cpu还是IRAM
问题:单片机8051中的一些寄存器到底算CPU的还是RAM的? 请高手指点,像累加器DPTR,A,PSW等一些寄存器是属于CPU的,但书上又说他们都属于RAM中的特殊功能寄存器(SFR),这是什么道理? 另外,存储器和寄存器不是两个功能,结构都不同的东西么?为什么RAM中存在许多寄存器组,即二者在此是相同的? 完整解答出自 https://www.zhihu.com/question/52153683 综合理解:有以下几种可能: 1、CPU是一个抽象的概念,如同操作系统这个概念一样没有明确的界线;(cpu是由人划分出来的一块区域不明确) 2、CPU这个概念不适用与51; 3、51可以划分CPU和RAM部分,但CPU和RAM有
[单片机]
单片机烟雾报警器程序+PCB+原理图
单片机源程序如下: #include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include intrins.h #define u8 unsigned char #define u16 unsigned int #define uchar unsigned char #define uint unsigned int uchar yushe_wendu=50;
[单片机]
<font color='red'>单片机</font>烟雾报警器程序+PCB+原理图
单片机ATMEGA16键盘及显示电路
输入及显示电路采用4个按键,和用功能切换完成对输出电压的设定及显示切换。显示部分采用共阳极数码管动态显示,如图所示。单片机ATMEGA16采用内部8 MHz晶振。 图 键盘及显示电路
[单片机]
<font color='red'>单片机</font>ATMEGA16键盘及显示电路
单片机技术中的软硬件防干扰方法
  单片机技术中防止干扰,保安全可靠运行也是一个很重要的问题。本文从电磁辐射、电源干扰和信号通道干扰三个主要干扰源入手,介绍了采用硬件和软件的防干扰措施,对于从事单片机应用设计者有重要参考价值。   1 引言   随着单片机技术应用发展,在应用过程中,如何防止外界的干扰,确保单片机安全可靠运行,是一个很重要的问题。我们在多项测控项目的实践中体会到,干扰源主要来自三个方面。一是空间场干扰,通过电磁辐射富入系统:二是电源干扰,它直接侵害系统:三是信号通道干扰,通过与单片机相连的前、后向通道进入系统。一般来说,空间场干扰在强度上远小于其他两个干扰源产生的干扰,且容易对付。只要采取良好的屏蔽、正确的接地及恰当的高频滤波就可以得到满意解决
[单片机]
<font color='red'>单片机</font>技术中的软硬件防干扰方法
单片机程序代码该如何优化?
对单片机程序进行优化,通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予盾的统一。一般是优化了代码的尺寸,就会带来执行时间的增加;如果优化了程序的执行速度,通常会带来代码增加的副作用。很难鱼与熊掌兼得,只能在设计时掌握一个平衡点。 程序结构的优化 1 程序的书写结构 虽然书写格式并不会影响生成的代码质量,但是在实际编写程序时还是应该尊循一定的书写规则,一个书写清晰、明了的程序,有利于以后的维护。在书写程序时,特别是对于While、for、do…while、if…else、switch…case 等语句或这些语句嵌套组合时,应采用“缩格”的书写形式。 2 标识符 程序中使用的用户标识符除要遵循标识符的命名规
[单片机]
<font color='red'>单片机</font>程序代码该如何优化?
SDCC-Linux下的51 MCU编译器
SDCC (小型设备C编译器)是为8位微控制器开发的免费C编译器。尽管兼容多种不同体系结构,但SDCC C编译器更适合8051内核。 SDCC是命令行固件开发工具,含预处理器、编译器、汇编器、链接器和优化器。安装文件中还捆绑了SDCDB、类似于gdb (GNU调试器)的源码级调试器。无错的程序采用SDCC编译、链接后,生成一个Intel十六进制格式的加载模块。 安装SDCC免费C编译器 如果需要安装SDCC,请从网址下载SDCC最新版本。虽然也可使用该软件的日常构建(nightly builds)版,但通常最安全的方式是下载经过完全测试的最新发布版。 在“Download”页为不同的操作系统提供不同的SDCC。如果您
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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