1 / 15
文档名称:

单片机延时计算.doc

格式:doc   大小:141KB   页数:15页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

单片机延时计算.doc

上传人:小雄 2020/9/4 文件大小:141 KB

下载得到文件列表

单片机延时计算.doc

文档介绍

文档介绍:单片机C51延时时间怎样计算?C程序中可使HI不同类型的变廣来进行延时设计。经实验测试,使用unsignedchar类型具冇比unsignedint更优化的代码,在使用时应该使用unsignedchar作为延时变量。以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。voiddelay_ms(void)//x,y,z位固定值,故不能接受参数{unsignedchari,j,k;for(i=x;i>0;i-)for(j=y;j>0;j-)for(k=z;k>0;k-);I【Delay_Time=[(2z+3)*y+3]*x+5]500ms延吋子程序程序:voiddelay500ms(void)unsignedchari,j,k;for(i=15;i>0;i-)for(j=202;j>0;j-)for(k=81;k>O;k-);计算分析:程序共冇三层循环一层循坏n:R5*2=81*2=162us DJNZ2us二层循环m:R6气n+3)=202*165=33330usDJNZ2us+R5赋值1us=3us延时总时间=三层循环+循环外=499995+5=500000us=500ms计算公式涎时时间=[(2*R5+3)*R6+3]*R7+5200ms延时子程序程序:voiddelay200ms(void){unsignedchari,j,k;for(i=5;i>0;i-)for(j=132;j>0;j-)for(k=150;k>0;k-);}10ms延时子程序程序:voiddelaylOms(void){unsignedchari,j,k;for(i=5;i>0;i-)for(j=4;j>0;j-)for(k=248;k>0;k-);1s延时子程序程序:voiddelayls(void)unsignedcharh,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-);}应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是儿十到儿百微妙心)。有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十儿us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计吋器甚至已经全部派上了别的用途。这吋就需要我们另想别的办法了。以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要:movr(),#09hloop:djnzrO,loop51单片机的指令周期是品振频率的1/12,也就是lus一个周期。movrO,#09h需要2个极其周期,djnz也需要2个极其周期。那么存在「0里的数就是(20-2)/2o用这种方法,可以非常方便的实现256us以下时间的延时。如果需耍更长时间,可以使用两层嵌套。而且精度可以达到2us,—般来说,这己经足够了。现在,应用更广泛的毫无疑问是Keil的C编译器。相对汇编来说,C固然有很多优点,比如程序易维护,便于理解,适合大的项目。但缺点(我觉得这是C的唯一一个缺点了)就是实时性没有保证,无法预测代码执行的指令周期。因而在实时性要求高的场合,还碍要汇编和C的联合应用。但是是不是这样一个延时程序,也需要用汇编來实现呢?为了找到这个答案,我做了一个实验。用C语言实现延时程序,首先想到的就是C常用的循环语句。下面这段代码是我经常在网上看到的:voiddelay2(unsignedchari){for(;i!=0;i-);}到底这段代码能达到多高的精度呢?为了直接衡量这段代码的效果,我把KeilC根据这段代码产生的汇编代码找了出来:;FUNCTION_delay2(BEGIN);SOURCELINE#18;——VariableTassignedtoRegisterrR7f-…;SOURCELINE#19;SOURCELINE#200000?C0007:0000EFMOVA,R700016003i JZ7C00100003IFDECR70004SOFA SJMP?C0007;SOURCELINE#2100067C0010:000622RET;FUNCTION_delay2(END)真是不看不知道〜〜~一看才知道这个延时程序是多么的不准点〜~〜光看主要的那四条语句,就需要6个机器周期。也就是说,它的精度顶多也就是6us而已,这还没算上一条Icall和一条ret。如果我们把调用函数时赋的i值根延时长度列一个表的话,就是:delaytime/us0611218因为函数的调用需要2个吋钟周期的Icall,所以delaytime比从函数代码的执行吋间多2。顺便提一下