关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而51hei给出的本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

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

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

//

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

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

//

{

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中断:

{

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

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

}

函数调用

{

DelayMs_1=a;

while(DelayMs_1);

}

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

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

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

指今               时间(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单片机与普通标准速率比。

keil4延时1秒C语言,KEIL单片机C语言精确延时值的计算相关推荐

  1. pic单片机延时程序C语言,PIC单片机C语言延时程序和循环子程序实现方法

    PIC单片机C语言延时程序和循环子程序实现方法 很多朋友说C中不能精确控制延时时间,不能象汇编那样直观. 其实不然,对延时函数深入了解一下就能设计出一个理想的框价出来. 一般的我们都用 for(x=1 ...

  2. keil单片机C语言输入函数,keil编写C程序是不是不能在函数内定义变量啊,求大神...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 肯定可以的:比如 程序动态显示字符 显示光标和光标闪烁打开效果 --------------------------------------------- ...

  3. led的c语言程序,单片机C语言LED灯点亮程序完全版

    <单片机C语言LED灯点亮程序完全版>由会员分享,可在线阅读,更多相关<单片机C语言LED灯点亮程序完全版(7页珍藏版)>请在人人文库网上搜索. 1.1例子1第二个灯亮#inc ...

  4. 单片机定时器c语言程序,单片机C语言编程定时器的几种表达方式

    单片机C语言编程中,定时器的初值对于初学者真的是比较不好计算,因此我总结了以下几种方法. 第1种方法: #define FOSC 11059200L //晶振的频率 #define TIMS (655 ...

  5. 单片机c语言字符,单片机C语言(一) - 控制/MCU - 电子发烧友网

    第三课.C51数据类型 每写一个程序,总离不开数据的应用,在学习 c51 语言的过程中掌握理解数据类型也是 很关键的.先看表 3-1,表中列出了 KEIL uVision2 单片机c语言编译器所支持的 ...

  6. keil C对lib封装库反汇编成C语言,Keil软件“C语言”及“汇编”混编 —— 相关知识整理.doc...

    Keil软件"C语言"与"汇编"混编 相关知识整理 用Keil在C中嵌入汇编1 在Keil中嵌入汇编2 介绍直接嵌入汇编代码的方法4 采用汇编可能会有的好处5 ...

  7. 51单片机几种精确延时(包含自动适应主时钟)

    实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 今天主要介绍软件延时,关于硬件延时,之 ...

  8. 微控制器编程技术c语言,1.单片机C语言编程技术分析.pptx

    单片机C语言编程;掌握利用C语言进行单片机程序设计的方法掌握单片机的C程序开发工具Keil 的使用方法掌握单片机仿真软件proteus的使用方法了解单片机常用外部接口元件和接口电路了解单片机系统的集成 ...

  9. 通用编程c语言,STC单片机C语言通用万能编程.docx

    <8051单片机C语言编程模板> TOC \o "1-5" \h \z \o "Current Document" 毫秒级CPU延时函数 4 \o ...

最新文章

  1. 【软件工程】VB版机房文档总结
  2. 为什么要使用Vuex?
  3. chrome瀏覽器去掉緩存的方法
  4. 前端学习(2750):global全局外观设置
  5. 深度学习(05)--典型CNN结构(VGG13,16,19)
  6. 【建议珍藏系列】如果你这样回答「什么是线程安全」,面试官都会对你刮目相看!...
  7. cycleGAN的整体架构+损失函数理解
  8. OpenCV2简单的特征匹配
  9. k8s Custom Resource
  10. ap 目标检测算法map_目标检测算法介绍
  11. mysql 如何避免间隙锁_mysql 间隙锁
  12. oracle导出excel数据变成科学计数法
  13. 大地高、海拔高 地心纬度、大地纬度/地理纬度
  14. 微步在线【威胁情报】
  15. 【说透区块链系列】一文读懂什么是Web 3.0
  16. matlab应用最简差分格式,泊松方程有限差分格式的构造以及MATLAB实现.docx
  17. 获取QQ企业邮箱通讯录PY脚本
  18. 周边pd是什么意思_偶像练习生张艺兴张pd是什么意思
  19. 【php】PHP单例模式
  20. OpenCV -5 -GoogLeNet模型使用及CNN理论

热门文章

  1. 新买的联想电脑WIN10 该WIN7
  2. IntelliJ Idea错误提示 Could not autowire. No beans of ‘‘ type found
  3. 如何自定义IDM的下载提示音
  4. Oauth2整合gitee
  5. 超级解密——为什么攻角传感器成为了波音的“暗黑武器”?
  6. jhipster修改jdl生成的实体类报错:liquibase.exception.ValidationFailedException: Validation Failed
  7. 【JSOI2016】飞机调度
  8. Haskell:写一个漂亮的快排
  9. vue项目内存泄露分析
  10. 【网友DIY紫药水染发 草根奇葩美妆法大起底】