求助,有一个程序,就是不知道延时子程序的作用用的时间

非常精确的C语言延时子程序表
=============================================文章转自 Proteus仿真社区&&&&作者:liaoguobao00未作验证,如有问题请和原作者联系:.cn=============================================&&&&&&&&用C语言写出来程序非常的简练,它是一种模块化的语言,一种比汇编更高级的语言,但是就是这样一种语言也还是有它不足之处:它的延时很不好控制,我们常常很难知道一段延时程序它的精确延时到底是多少,这和汇编延时程序没法比。但有时后写程序又不得不要用到比较精确的延时,虽然说可以用混合编程的方式解决,但这种方式不是每个人都能掌握,且写起来也麻烦。所以,通过测试我给大家提供一个延时子程序模块,并以此给一个出我们经常用到的延时的数据表格。(注意:表格中的数据只适合我的延时模块,对其他的延时程序不适用,切忌!!!!!!!!别到时候延时不对来骂我)&&&&&&&&延时模块:其中问号代表要填的数,要延时多少,到表格中去找数据,然后填上就OK!切忌3条FOR语句不能颠倒顺序void Delay(){unsigned char a,b,c;for(a=0;a&?;a++)for(b=0;b&?;b++)for(c=0;c&?;c++);}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&数据表如下/**********************************************************************************************************************/延时时间&&&&&& a的值&&&&&& b的值&&&&&& c的值&&&&&& 延时误差(us)10us&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&&& -0.5&&&&&&20us&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&8&&&&&&&&&&&&&&&&&&&&&&&& 0&&30us&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&15&&&&&&&&&&&&&&&&&&&&&&+0.540us&&&&&&&&&&&&&&&&&&&&&&2&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&9&&&&&&&&&&&&&&&&&&&&&&&& 0&&50us&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&28&&&&&&&&&&&&&&&&&&&&&&&&&&0&&60us&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&35&&&&&&&&&&&&&&&&&&&&&&+0.570us&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&1&&&&&&&&&&&&&&&&&&&&&&42&&&&&&&&&&&&&&&&&&&&&&+1
分享这篇日志的人也喜欢
准点准时报到???
纯粹玩游戏哈哈
520会有人守护我吗?
热门日志推荐
人人最热标签
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&
请输入手机号,完成注册
请输入验证码
密码必须由6-20个字符组成
下载人人客户端
品评校花校草,体验校园广场>> 200us延时子程序,延时时间可以调整。
200us延时子程序,延时时间可以调整。
所属分类:
下载地址:
delay.rar文件大小:957.00 B
分享有礼! 》
请点击右侧的分享按钮,把本代码分享到各社交媒体。
通过您的分享链接访问Codeforge,每来2个新的IP,您将获得0.1 积分的奖励。
通过您的分享链接,每成功注册一个用户,该用户在Codeforge上所获得的每1个积分,您都将获得0.2 积分的分成奖励。
200us延时子程序,延时时间可以调整。-200us delay subroutine, delay time can be adjusted.
Sponsored links
源码文件列表
温馨提示: 点击源码文件名可预览文件内容哦 ^_^
455.00 B04-06-06 10:22
455.00 B04-06-06 10:22
121.00 B15-04-04 13:33
&delay&0.00 B25-07-07 16:58
(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
评价成功,多谢!
下载delay.rar
CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了
您的积分不足,优惠套餐快速获取 30 积分
10积分 / ¥100
30积分 / ¥200原价 ¥300 元
100积分 / ¥500原价 ¥1000 元
订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。
支付宝支付宝付款
微信钱包微信付款
更多付款方式:、
您本次下载所消耗的积分将转交上传作者。
同一源码,30天内重复下载,只扣除一次积分。
鲁ICP备号-3 runtime:Elapsed:339.845ms - init:0.1;find:1.0;t:0.5;tags:0.3;related:292.0;comment:0.1; 5.8
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
^_^"呃 ...
Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧查看: 87511|回复: 129
编写延时函数的简单方法
&& 在本站51hei-5板子上做315兆无线解码和红外解码试验的时候,延时函数的精度很重要,要做到相当精确才可以成功,所以大家一定要掌握.
& 这也是大家最常在QQ里问我的一个问题,如果从keil里看了c语言的反汇编代码然后根据晶振和指令计算延时的时间这样虽然非常的准确但是相当的麻烦而且容易搞错,我这里介绍一个最简单的方法.可以验证你的延时函数
&&&这里用一个例程详细介绍一下。&&& 过程参考如下:&&& 在编译器下建立一个新项目,也可以利用已有项目。此过程中需要注意,单片机晶振的选择,因为for循环里指令的执行时间和晶振有直接关系,本例中晶振使用11.0592M。
20090oc1.jpg (14.88 KB, 下载次数: 153)
00:24 上传
&&&& 编写一段关于延时的函数,主要利用for循环,代码如下:void delay_ms(unsigned int ms){&&& for(i=0;i&i++)&&& {&&&&&&& for(j=0;j&200;j++);&&&&&&& for(j=0;j&102;j++);&&& }
}其中ms是输入参数,如果输入1,就是要求程序延时1ms。j变量是调整程序运行的时间参数。调整j的数值,使1次循环的时间在1ms。&&& 将此程序编译通过,然后利用软件仿真,调整时间。
20090oc2.jpg (64.52 KB, 下载次数: 168)
00:24 上传
下面这个sec就是程序运行到现在的这一行所用的时间。
20090oc3.jpg (14.87 KB, 下载次数: 136)
00:24 上传
& 两次时间差就是延时函数使用的时间,如果与1ms相差比较多,用户可以调整j参数的值,使延时时间尽量接近1ms。如增大j的值for(j=0;j&105;j++);&&& 此方法得出延时函数,在晶振不同的情况下,延时时间会不准。软件调试结果,这个程序的延时时间为:1.01779ms,一般的单片机系统中都可以应用。
下面来说说汇编的传统计算方法:
指令周期、机器周期与时钟周期&&&&&& 指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。&&&&&& 时钟周期:也称为振荡周期,一个时钟周期 =晶振的倒数。&&&&&& MCS-51单片机的一个机器周期=6个状态周期=12个时钟周期。&&&&&& MCS-单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/)=1us。
了解了上面这些我们来看一个例子
;============延时1秒子程序========================DELAY_1S:&&&&&&&& ;延时子程序,12M晶振延时1.002035秒MOV R4,#10 L3: MOV R2 ,#200& ;1指令周期L1: MOV R3 ,#249& ;1指令周期L2: DJNZ R3 ,L2&&& &;2指令周期DJNZ R2 ,L1&&&&&&&& &;2指令周期DJNZ R4 ,L3&&&&&&&& &;2指令周期RET&&&&&&&&&&&&&&&&&&&& &;2指令周期;循环体延时时间: [(249*2+1+2)*200+1+2]*10*12/.002030s;加上ACALL指令和第一条mov指令以及最后一条RET指令算出来整个函数的时间为1.002035s;===================================================通常选用的是11.0592MHZ的晶振:[(249*2+1+2)*200+1+2]*10*12/.66666...S
汇编延时子程序的延时计算问题对于程序DELAY:& MOV R0,#00HDELAY1: MOV R1,#0B3HDJNZ R1,$DJNZ R0,DELAY1
& 查指令表可知 MOV一个机器周期,DJNZ 指令需用两个机器周期,而一个机器周期时间长度为12/11.0592MHz,所以该段程序执行时间为:
((0B3×2+1+2)×256+1)×12÷0.2789mS
& 第一层:DJNZ R1,$:执行了B3H次,一次两个周期,所以为0B3×2;
& 第二层:MOV R1,#0B3H为一个周期,DJNZ R0,DELAY1为两个周期,这样循环一次就是0B3×2+1+2个周期;第二层的执行次数本来是255次,但因为赋首值为0,而DJNZ是先减1,再比较的,所以就应该是256次。
& 这样的话,整个循环执行完应该是(0B3×2+1+2)×256+1次。再加上开始赋值这一句,就是((0B3×2+1+2)×256+1)了
还说明一下:
nop指令或者_nop_(); 函数占一个机器周期,&& 在stc单片机的12T模式下一个机器周期是一个振荡周期的12分频,如果你的晶振是12MHZ,那你的一个机器周期就是1微秒.一个nop指令的执行时间也就是1US
&& 当在6T模式(下载的时候可选择模式)下12M晶振的时候,一个nop就是0.5US了.
[此贴子已经被作者于 2:51:54编辑过]
 支持。。。。。
 admin 斑竹 不愧为强人一个,受教了
要求精确的话用汇编
嗯,确实要延时就是循环做空操作。具体循环次数要在实践中修正,不同器件的振荡周期可能不同
是可以 比较直观
学习了。。。。。。。。。。。。。。
空操作是延时常采用的手段
才学多指教
在图书馆一边打瞌睡一边把您的帖子看完了,真是不错,让我又明白了很多,我QQ是,能加我吗,还有问题讨教
不错哦,值得借鉴
现在有单片机小精灵了,可以直接获取延时程序
哎 我学得是 一塌糊涂啊
学着学着都不知道从何学起了
用C编程的方法解释不够祥细
延时的初值可以借助软件工具那样比较快
好!有用,实用!
可以用定时器来做延时!
延时时间精确计算哦 ,看看。。。。
牛人就是牛!!
小弟刚来,学习了
学习学习,谢谢楼主!
其实用汇编写也蛮简单的&& 1S的延时:&
&& DELAY:MOV R4,,#50
&&&&&&& D1:MOV R5,,#50
&&&&&&& D2:MOV R6,,#50
&&&&&&&&&&&&& DJNZ R6,,$
&&&&&&&&&&&&& DJNZ R5,D2
&&&&&&&&&&&&& DJNZ R4,D1
&&&&&&&&&&&&&& RET
楼主这个方法真是太好了,这样的话即使是c语言延时也能精确到us级别了
就是来学习的,呵呵
版主啊,这个程序中,j的循环次数是(200+102)*ms 还是200*102*ms啊 如果是第一种的话,为什么不直接写成j=302 呢 然后最里面的括号直接一个循环语句呢?求回答~
恩,老师教的也是这样
谢谢,很不错的,很经典
其实用定时器更准啊
仁兄,请问红色标志的那些字怎么弄上去的,讨教了
学习了,谢谢
学习了,谢谢
非常有用哈。学习了。
温习了一遍& 汇编精准定时
其实要想真正的准确,还要加上调用和结束语句的耗时。
要求严格时,还要禁止其他中断,否则一旦被中断,延时时间准确就无从谈起了。
正学习中,刚好有这种疑惑,受教了!
使用前后台系统,可以使用定时器精确延时!
 好东西!!
Powered by51单片机几个精确延时程序
> 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 = 33330us DJNZ 2us + R5赋值 1us = 3us  三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us  循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us  延时总时间 = 三层循环 + 循环外 =
= 500000us =500ms  计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5  二. 200ms延时子程序  程序:  void delay200ms(void)  {  unsigned char i,j,k;  for(i=5;i&0;i--)  for(j=132;j&0;j--)  for(k=150;k&0;k--);  }  三. 10ms延时子程序  程序:  void delay10ms(void)  {  unsigned char i,j,k;  for(i=5;i&0;i--)  for(j=4;j&0;j--)  for(k=248;k&0;k--);  }  四. 1s延时子程序  程序:  void delay1s(void)  {  unsigned char h,i,j,k;  for(h=5;h&0;h--)  for(i=4;i&0;i--)  for(j=116;j&0;j--)  for(k=214;k&0;k--);  }  void delay1s(void)//12M晶振,延时us  {  unsigned char i,j,k;  for(i=46;i&0;i--)  for(j=152;j&0;j--)  for(k=70;k&0;k--);  }
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一查看: 1361|回复: 8
求助 _启动子程序,怎么才能让他不结束掉
阅读权限90
在线时间 小时
签到天数:13 天结帖率: (26/31)
我需要一直一直的判断一个条件的..我试过在启动子程序下 写 判断循环首(真) 用了延时(1)和处理事件 CPU占用会很高。
然后我写一个子程序 在启动子程序下用线程启动 线程启动的子程序里是一个判断循环首(真) 然后运行一次就结束了..
有什么办法能让他一直运行嘛? 除了把判断循环首放在启动子程序下 其他都行
求助 在线等
post_newreply
阅读权限90
在线时间 小时
签到天数: 3 天结帖率: (6/6)
源码贴出来.
阅读权限90
在线时间 小时
签到天数: 13 天结帖率: (26/31)
源码贴出来.
.支持库 EThread
.支持库 spec
.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
启动线程 (&子程序, , )
返回 (0)&&' 可以根据您的需要返回任意数值
.子程序 子程序
.判断循环首 (真)
& & 延时 (1)
& & 处理事件 ()
& & 调试输出 (“1”)
.判断循环尾 ()
这个是在启动子程序下调用子程序1的 只执行一次..
----------------------------------------------------------
.支持库 spec
.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
.判断循环首 (真)
& & 延时 (1)
& & 处理事件 ()
& & 调试输出 (“1”)
.判断循环尾 ()
返回 (0)&&' 可以根据您的需要返回任意数值
这个是直接把代码 放到启动子程序下的,可以一直运行,
---------------------------------------------------------------
我想要达成的 就是前面那种,在启动子程序下调用另外一个子程序 而且不会结束程序 一直运行
嫩了一晚嫩不好呀
阅读权限90
在线时间 小时
签到天数: 17 天结帖率: (16/16)
不知道你要搞什么东西,如果是DLL劫持类就这样, 还有不要用系统自带延时,用API& &sleep延时,或者下面这个另外一种API延时& &超级延时函数,&&精易模块也有,程序_延时()等、、、
&&_启动子程序整数型&创建线程 (&start)返回 (0)start&&i逻辑型&&i = 载入 (窗口, , 真)判断循环首 (i)超级延时 (1, 5)判断循环尾 ().版本 2
.子程序 _启动子程序, 整数型
创建线程 (&start)
.子程序 start
.局部变量 i, 逻辑型
i = 载入 (窗口, , 真)
.判断循环首 (i)
& & 超级延时 (1, 5)
.判断循环尾 ()
阅读权限90
在线时间 小时
签到天数: 3 天结帖率: (6/6)
.支持库 EThread
.支持库 spec
大哥 看你代码 , 你启动子程序 起码得载入个窗口吧.
阅读权限90
在线时间 小时
签到天数: 17 天结帖率: (16/16)
还有,不知道你要做什么,加个窗口就得了,窗口隐藏起来,窗口可视&&=&&假
阅读权限50
在线时间 小时
1.看看能不能用时钟来解决,2,精易模块里面的 程序_延时()功能非常好用。不占用cpu,窗口不卡死,不影响其它代码执行
阅读权限90
在线时间 小时
结帖率: (2/4)
要不用循环判断首试试!
阅读权限90
在线时间 小时
结帖率: (5/6)
用你前面的第一个,然后用精易模块的 程序_延时&&就可以了
精易论坛 - 有你更精彩 /1
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
防范网络诈骗,远离网络犯罪
违法和不良信息举报电话,企业QQ: ,邮箱:@
Powered by
粤公网安备 25}

我要回帖

更多关于 延时子程序的作用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信