免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c语言延时程序的研究2007-08-19 21:02有个好帖,从精度考虑,它得研究结果是:void delay2(unsigned char i) while(-i); 为最佳方法。分析:假设外挂12M(之后都是在这基础上讨论)我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay2(0):延时518us 518-2*256=6delay2(1):延时7us(原帖写“5us”是错的,_)delay2(10):延时25us 25-20=5delay2(20):延时45us 45-40=5delay2(100):延时205us 205-200=5delay2(200):延时405us 405-400=5见上可得可调度为2us,而最大误差为6us。精度是很高了!但这个程序的最大延时是为518us 显然不能满足实际需要,因为很多时候需要延迟比较长的时间。那么,接下来讨论将t分配为两个字节,即uint型的时候,会出现什么情况。void delay8(uint t)while(-t);我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay8(0):延时524551us 524551-8*65536=263delay8(1):延时15usdelay8(10):延时85us 85-80=5delay8(100):延时806us 806-800=6delay8(1000):延时8009us 8009-8000=9delay8(10000):延时80045us 80045-8000=45delay8(65535):延时524542us 524542-524280=262如果把这个程序的可调度看为8us,那么最大误差为263us,但这个延时程序还是不能满足要求的,因为延时最大为524.551ms。那么用ulong t呢?一定很恐怖,不用看编译后的汇编代码了。那么如何得到比较小的可调度,可调范围大,并占用比较少得RAM呢?请看下面的程序:/*-程序名称:50us 延时注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振例子提示:调用delay_50us(20),得到1ms延时全局变量:无返回: 无-*/void delay_50us(uint t)uchar j;for(;t0;t-) for(j=19;j0;j-) ;我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay_50us(1):延时63us 63-50=13delay_50us(10):延时513us 503-500=13delay_50us(100):延时5013us 5013-5000=13delay_50us(1000):延时50022us 50022-50000=22赫赫,延时50ms,误差仅仅22us,作为C语言已经是可以接受了。再说要求再精确的话,就算是用汇编也得改用定时器了。/*-程序名称:50ms 延时注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振例子提示:调用delay_50ms(20),得到1s延时全局变量:无返回: 无-*/void delay_50ms(uint t)uint j;/*可以在此加少许延时补偿,以祢补大数值传递时(如delay_50ms(1000))造成的误差,但付出的代价是造成传递小数值(delay_50ms(1))造成更大的误差。因为实际应用更多时候是传递小数值,所以补建议加补偿!*/for(;t0;t-) for(j=6245;j0;j-) ;我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay_50ms(1):延时50 010 10usdelay_50ms(10):延时499 983 17usdelay_50ms(100):延时4 999 713 287usdelay_50ms(1000):延时4 997 022 2.978ms赫赫,延时50s,误差仅仅2.978ms,可以接受!以下为11.0592晶振众所周知,c51在编程时很难掌握程序运行的时间,所以编写延时程序时很难做到很精确,解决的方式有插入汇编语句,但总觉得汇编用起来不是那么顺手,还可以用定时器来做,但只是一个很小的延时程序而已,不必小题大作。其实办法还是有的,下面介绍一下常用的几种延时程序。1、us级延时程序 常用的一个函数如下: void delayus(unsigned char x) while(-x) ; 生成的汇编代码为:C:0x001C 7F0A MOV R7,#0x0A /2usC:0x001E 12003E LCALL delayus(C:003E) / 2usC:0x003E DFFE DJNZ R7,delayus(C:003E) /2x usC:0x0040 22 RET / 1us 所以调用一次函数延时时间为 ( 2x5 )us ,可以用来延时大于5us的时间。注意的是x要是unsigned char 类型,且 -x 不能写成x- ,否则汇编代码会有一大串:C:0x001C 7F02 MOV R7,#0x02C:0x001E 120032 LCALL delayus(C:0032)C:0x0032 AE07 MOV R6,0x07C:0x0034 1F DEC R7C:0x0035 EE MOV A,R6C:0x0036 70FA JNZ delayus(C:0032)C:0x0038 22 RET 因为汇编中的DJNZ 语句是先减一再判断的,和-xx的算法一致,所以-x和x-相差了很多。上述函数只适合x的范围是0255,如果需要延时大于255*25us,则可以连续调用几次函数。2、ms的延时程序 常用的一个函数:void delayms(unsigned int x)unsigned char i; while(x-) for(i=0;i125;i+); 我们来看一下它的精度如何x us1 10245 507610 1014150 50661100 101311 可见,精度不“精”,随着x值的增大,延时误差越大,只适合在延时不要求很准确的地方使用。于是想到对程序进行一些修改,想到125是不是取的太大了,假如把它变为可变,不同的x值取值不同,就可以对延时时间进行一些修正,把程序改为如下: void delayms(unsigned int x,unsigned char y)unsigned char j;while(x-) for(j=0;jy;j+); 对不同的延时时间取不同的y值,发现一个“怪”现象,当取y123时,延时时间的误差是一个固定值:x us1 10172 20165 501610 1001650 50016100 100016 除了x1外,其余的误差都为16us, 即不管x为多大都只有16us的误差,精度大幅度提高,可以满足大多数的需要!-void delay_8us(unsigned int t)while(-t);delay8(1):延时15usdelay8(10):延时85us 85-80=5delay8(100):延时806us 806-800=6delay8(1000):延时8009u
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 土建施工员考试题与答案
- 2025版阿尔茨海默病常见症状及护理策略
- 安全员工作指导
- 病理科组织病理学检测流程
- 气瓶检验检测方法
- Excel讲义精粹教程非常难得啊
- 2025版肌无力常见症状解读与护理方法
- 车辆资产评估讲解
- 2025年护理学基础知识考试试题库及答案(共300题)
- 眩晕症患者平衡训练方案
- 护理安全警示教育
- 草诀百韵歌原文及译文
- GB/T 12970.4-2009电工软铜绞线第4部分:铜电刷线
- 【手抄小报】手绘消防安全手抄报电子小报(有线稿)
- 2023年兴海县社区工作者招聘考试笔试题库及答案解析
- 3.3数据与系统(第二课时) (1) 课件-高中信息技术必修1
- 2021年唐山交通发展集团有限公司校园招聘笔试试题及答案解析
- 高中历史必修上 《第6课 从隋唐盛世到五代十国》集体备课课件
- 煤矿岗位安全安全操作规程
- (完整版)GIS结构课件
- 《鼻咽癌肺癌》ppt课件
评论
0/150
提交评论