文档视界 最新最全的文档下载
当前位置:文档视界 › 延时时间计算

延时时间计算

延时时间计算
延时时间计算

单片机C51延时时间怎样计算?

[日期:2010-04-28 ] [来源:本站原创作者:admin] [字体:大中小] (投递新闻)

C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。

一. 500ms延时子程序

程序:

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

延时总时间= 三层循环+ 循环外= 499995+5 = 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--);

}

参考链接:https://www.docsj.com/doc/dc13403884.html,/news/2010-04/2106.htm

keilc51程序设计中几种精确延时及延时的计算、确定软件用法(如protues、keil、Word)2009-09-08 12:04:54 阅读340 评论0 字号:大中小

摘要

实际的单片机应用系统开发过程中,由于程序功能的需要,经常编写各种延时程序,延时时间从数微秒到数秒不等,对于许多C51开发者特别是初学者编制非常精确的延时程序有一定难度。本文从实际应用出发,讨论几种实用的编制精确延时程序和计算程序执行时间的方法,并给出各种方法使用的详细步骤,

以便读者能够很好地掌握理解。

引言

单片机因具有体积小、功能强、成本低以及便于实现分布式控制而有非常广泛的应用领域[1]。单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒。有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差范围在十几微秒以内[2],否则,芯片无法工作。用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3]。因此,在多年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法。

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

1 使用定时器/计数器实现精确延时

单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最

长的延时时间可达216(2的16次方,因为TH1,TH0共为16位)=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占

用2个机器周期)。

在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。

2 软件延时与时间计算

在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软

件延时的方法。

2.1 短暂延时

可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs

的延时函数可编写如下:

Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用\[4\],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序【因为最后一个(其实每一个都有)Delay10us( )中最后已有RET指令,不需要在Delay40us( )函数中最后再执行RET 指令,省去了2vs】。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 μs。通过修改基本延时函数和适当的组

合调用,上述方法可以实现不同时间的延时。

2.2 在C51中嵌套汇编程序段实现延时

在C51中通过预处理指令#pragma asm和#pragma endasm可以嵌套汇编语言语句。用户编写的汇编语言紧跟在#pragma asm之后,在#pragma endasm之前结束。

如:#pragma asm

汇编语言程序段

#pragma endasm

延时函数可设置入口参数,可将参数定义为unsigned char、int或long型。根据参数与返回值的传递规则,这时参数和函数返回值位于R7、R7R6、R7R6R5中。在应用时应注意以下几点:

◆#pragma asm、#pragma endasm不允许嵌套使用;

◆在程序的开头应加上预处理指令#pragma asm,在该指令之前只能有注释或其他预处理指令;

◆当使用asm语句时,编译系统并不输出目标模块,而只输出汇编源文件;

◆asm只能用小写字母,如果把asm写成大写,编译系统就把它作为普通变量;

◆#pragma asm、#pragma endasm和asm只能在函数内使用。

将汇编语言与C51结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳选择。

2.3 使用示波器确定延时时间

熟悉硬件的开发人员,也可以利用示波器来测定延时程序执行时间。方法如下:编写一个实现延时的函数,在该函数的开始置某个I/O口线如P1.0为高电平,在函数的最后清P1.0为低电平。在主程序中循环调用该延时函数,通过示波器测量P1.0引脚上的高电平时间即可确定延时函数的执行时间。方法如下:

把P1.0接入示波器,运行上面的程序,可以看到P1.0输出的波形为周期是3 ms的方波。其中,高电平为2 ms,低电平为1 ms,即for循环结构“for(j=0;j<124;j++) {;}”的执行时间为1 ms。通过改变循环次数,可得到不同时间的延时。当然,也可以不用for循环而用别的语句实现延时。这里讨论的只是确定延

时的方法。

2.4 使用反汇编工具计算延时时间

对于不熟悉示波器的开发人员可用Keil C51中的反汇编工具计算延时时间,在反汇编窗口中可用源程序和汇编程序的混合代码或汇编代码显示目标应用程序。为了说明这种方法,还使用“for(j=0;j<124;j++) {;}”。在程序中加入这一循环结构,首先选择build taget,然后单击start/stop debug session按钮进入程序调试窗口,最后打开Disassembly window,找出与这部分循环结构相对应的汇编代码,具体如下:

可以看出,0x000F~0x0017一共8条语句,分析语句可以发现并不是每条语句都执行DlyT次。核心循环只有0x0011~0x0017共6条语句,总共8个机器周期,第1次循环先执行“CLR A”和“MOV R6,A”两条语句,需要2个机器周期,每循环1次需要8个机器周期,但最后1次循环需要5个机器周期。DlyT 次核心循环语句消耗(2+DlyT×8+5)个机器周期,当系统采用12 MHz时,精度为7 μs。

当采用while (DlyT--)循环体时,DlyT的值存放在R7中。相对应的汇编代码如下:

循环语句执行的时间为(DlyT+1)×5个机器周期,即这种循环结构的延时精度为5 μs。

通过实验发现,如将while (DlyT--)改为while (--DlyT),经过反汇编后得到如下代码:

C:0x0014DFFE DJNZR7,C:0014//2T

可以看出,这时代码只有1句,共占用2个机器周期,精度达到2 μs,循环体耗时DlyT×2个机器周

期;但这时应该注意,DlyT初始值不能为0。

这3种循环结构的延时与循环次数的关系如表1所列。

表1 循环次数与延时时间关系单位:μs

注意:计算时间时还应加上函数调用和函数返回各2个机器周期时间。

2.5 使用性能分析器计算延时时间

很多C程序员可能对汇编语言不太熟悉,特别是每个指令执行的时间是很难记忆的,因此,再给出一种使用Keil C51的性能分析器计算延时时间的方法。这里还以前面介绍的for (i=0;i<124;i++)结构为例。使用这种方法时,必须先设置系统所用的晶振频率,选择Options for target中的target选项,在Xtal(MHz)中填入所用晶振的频率。将程序编译后,分别在_point = 1和T_point = 0处设置两个运行断点。选择start/stop debug session按钮进入程序调试窗口,分别打开Performance Analyzer window和Disassembly window。运行程序前,要首先将程序复位,计时器清零;然后按F5键运行程序,从程序效率评估窗口的下部分可以看到程序到了第一个断点,也就是所要算的程序段的开始处,用了389 μs;再按F5键,程序到了第2个断点处也就是所要算的程序段的结束处,此时时间为1 386 μs。最后用结束处的时间减去开始

处时间,就得到循环程序段所占用的时间为997 μs。

当然也可以不用打开Performance Analyzer window,这时观察左边工具栏秒(SEC)项。全速运行时,时间不变,只有当程序运行到断点处,才显示运行所用的时间。

3 总结

本文介绍了多种实现并计算延时程序执行时间的方法。使用定时器进行延时是最佳的选择,可以提高MCU工作效率,在无法使用定时器而又需要实现比较精确的延时时,后面介绍的几种方法可以实现不等时间的延时:使用自定义头文件的优点是,可实现任意时间长短的延时,并减少主程序的代码长度,便于对程序的阅读理解和维护。编写延时程序是一项很麻烦的任务,可能需要多次修改才能满足要求。掌握延时程序的编写,能够使程序准确得以执行,这对项目开发有着重要的意义。本文所讨论的几种方法,都是来源于实际项

目的开发经验,有着很好的实用性和适应性。

用C写的FOR循环嵌套延时程序的时间长短怎么确定啊?

发布: 2009-5-30 21:46 | 作者: 下水道霸主| 来源: 电子园STM32学习专区unsigned char i;

void delay(void)

{

unsigned char m,n,s;

for(m=20;m>0;m--)

for(n=20;n>0;n--)

for(s=248;s>0;s--);

}

经常看到这样的程序,但不知道到底这时间是多长,只能大概的指导各时间长短,大家可以教教我吗?

wang1jin (2009-5-30 22:43:44)

void delay2(unsigned char i)

{

while(--i);

}

为最佳方法。

分析:假设外挂12M(之后都是在这基础上讨论)

我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:

delay2(0):延时518us 518-2*256=6

delay2(1):延时7us(原帖写“5us”是错的,^_^)

delay2(10):延时25us 25-20=5

delay2(20):延时45us 45-40=5

delay2(100):延时205us 205-200=5

delay2(200):延时405us 405-400=5

见上可得可调度为2us,而最大误差为6us。

精度是很高了!

但这个程序的最大延时是为518us 显然不

能满足实际需要,因为很多时候需要延迟比较长的时间。

那么,接下来讨论将t分配为两个字节,即uint型的时候,会出现什么情况。

void delay8(uint t)

{

while(--t);

}

我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:

delay8(0):延时524551us 524551-8*65536=263

delay8(1):延时15us

delay8(10):延时85us 85-80=5

delay8(100):延时806us 806-800=6

delay8(1000):延时8009us 8009-8000=9

delay8(10000):延时80045us 80045-8000=45

delay8(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(;t>0;t--)

for(j=19;j>0;j--)

;

}

我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:

delay_50us(1):延时63us 63-50=13

delay_50us(10):延时513us 503-500=13

delay_50us(100):延时5013us 5013-5000=13

delay_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(;t>0;t--)

for(j=6245;j>0;j--)

;

}

我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:

delay_50ms(1):延时50 010 10us

delay_50ms(10):延时499 983 17us

delay_50ms(100):延时4 999 713 287us

delay_50ms(1000):延时4 997 022 2.978ms

赫赫,延时50s,误差仅仅2.978ms,可以接受!

上面程序没有才用long,也没采用3层以上的循环,而是将延时分拆为两个程序以提高精度。应该是比较好的做法了。

STC12系列单片机C语言的延时程序

STC12系列单片机C语言的延时程序 本举例所用CPU 为STC12C5412 系列12 倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。共有三条延时函数说明如下:函数调用 分两级:一级是小于10US 的延时,二级是大于10US 的延时 //====================小于10US 的【用1US 级延时】 ====================//----------微秒级延时---------for(i=X;i>X;i--) 延时时间 =(3+5*X)/12 提示(单位us, X 不能大于255)//================大于10US0;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)tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

延时子程序计算方法

学习MCS-51单片机,如果用软件延时实现时钟,会接触到如下形式的延时子程序:delay:mov R5,#data1 d1:mov R6,#data2 d2:mov R7,#data3 d3:djnz R7,d3 djnz R6,d2 djnz R5,d1 Ret 其精确延时时间公式:t=(2*R5*R6*R7+3*R5*R6+3*R5+3)*T (“*”表示乘法,T表示一个机器周期的时间)近似延时时间公式:t=2*R5*R6*R7 *T 假如data1,data2,data3分别为50,40,248,并假定单片机晶振为12M,一个机器周期为10-6S,则10分钟后,时钟超前量超过1.11秒,24小时后时钟超前159.876秒(约2分40秒)。这都是data1,data2,data3三个数字造成的,精度比较差,建议C描述。

上表中e=-1的行(共11行)满足(2*R5*R6*R7+3*R5*R6+3*R5+3)=999,999 e=1的行(共2行)满足(2*R5*R6*R7+3*R5*R6+3*R5+3)=1,000,001 假如单片机晶振为12M,一个机器周期为10-6S,若要得到精确的延时一秒的子程序,则可以在之程序的Ret返回指令之前加一个机器周期为1的指令(比如nop指令), data1,data2,data3选择e=-1的行。比如选择第一个e=-1行,则精确的延时一秒的子程序可以写成: delay:mov R5,#167 d1:mov R6,#171 d2:mov R7,#16 d3:djnz R7,d3 djnz R6,d2

djnz R5,d1 nop ;注意不要遗漏这一句 Ret 附: #include"iostReam.h" #include"math.h" int x=1,y=1,z=1,a,b,c,d,e(999989),f(0),g(0),i,j,k; void main() { foR(i=1;i<255;i++) { foR(j=1;j<255;j++) { foR(k=1;k<255;k++) { d=x*y*z*2+3*x*y+3*x+3-1000000; if(d==-1) { e=d;a=x;b=y;c=z; f++; cout<<"e="<

EXCLE日期时间计算公式

(Excel)常用函数公式及操作技巧之三: 时间和日期应用 ——通过知识共享树立个人品牌。 自动显示当前日期公式 =YEAR(NOW()) 当前年 =MONTH(NOW()) 当前月 =DAY((NOW())) 当前日 如何在单元格中自动填入当前日期 Ctrl+; 如何判断某日是否星期天 =WEEKDAY(A2,2) =TEXT(A1,"aaaa") =MOD(A1,7)<2 某个日期是星期几 比如2007年2月9日,在一单元格内显示星期几。 =TEXT(A1,"aaa") (五) =TEXT(A1,"aaaa") (星期五) =TEXT(A1,"ddd") (Fri) =TEXT(A1,"dddd") (Friday) 什么函数可以显示当前星期 如:星期二10:41:56 =TEXT(NOW(),"aaaa hh:mm:ss") 求本月天数 设A1为2006-8-4 求本月天数 A1=DAY(DATE(YEAR(A1),MONTH(A1)+1,0)) 也有更簡便的公式:=DAY(EOMONTH(NOW(),0)) 需加載分析工具箱。

当前月天 数:=DATE(YEAR(TODAY()),MONTH(TODAY())+1,1)-DATE(YEAR(TO DAY()),MONTH(TODAY()),1) 用公式算出除去当月星期六、星期日以外的天数 =SUMPRODUCT(--(MOD(ROW(INDIRECT(DATE(YEAR(NOW() ),MONTH(NOW()),1)&":"&DATE(YEAR(NOW()),MONTH(NOW ())+1,0))),7)>1)) 显示昨天的日期 每天需要单元格内显示昨天的日期,但双休日除外。 例如,今天是7月3号的话,就显示7月2号,如果是7月9号,就显示7 月6号。 =IF(TEXT(TODAY(),"AAA")="一 ",TODAY()-3,IF(TEXT(TODAY(),"AAA")="日 ",TODAY()-2,TODAY()-1)) =IF(TEXT(TODAY(),"AAA")="一",TODAY()-3,TODAY()-1) 关于取日期 怎么设个公式使A1在年月日向后推5年,变成2011-7-15 =DATE(YEAR(A1)+5,MONTH(A1),DAY(A1)) =EDATE(A1,12*5) 如何对日期进行上、中、下旬区分 =LOOKUP(DAY(A1),{0,11,21,31},{"上旬","中旬","下旬","下旬"}) 如何获取一个月的最大天数 "=DAY(DATE(2002,3,1)-1)"或"=DAY(B1-1)",B1为"2001-03-01日期格式转换公式 将“01/12/2005”转换成“20050112”格式 =RIGHT(A1,4)&MID(A1,4,2)&LEFT(A1,2) = YEAR($A2)&TEXT(MONTH($A2),"00")&TEXT(DAY($A2),"00" ) 该公式不用设置数据有效性,但要设置储存格格式。 也可以用下列两方法: 1、先转换成文本, 然后再用字符处理函数。 2、[数据]-[分列] [日期]-[MDY] 将“2005年9月”转换成“200509”格式

单片机一些常用的延时与中断问题及解决方法

单片机一些常用的延时与中断问题及解决方法 延时与中断出错,是单片机新手在单片机开发应用过程中,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机、MSP430单片机、C51单片机、8051F的单片机、avr单片机、STC89C52、PIC单片机…..在内的各种单片机常见的延时与中断问题及解决方法,希望对单片机新手们,有所帮助! 一、单片机延时问题20问 1、单片机延时程序的延时时间怎么算的? 答:如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。 如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。 2、求个单片机89S51 12M晶振用定时器延时10分钟,控制1个灯就可以 答:可以设50ms中断一次,定时初值,TH0=0x3c、TL0=0xb0。中断20次为1S,10分钟的话,需中断12000次。计12000次后,给一IO口一个低电平(如功率不够,可再加扩展),就可控制灯了。 而且还要看你用什么语言计算了,汇编延时准确,知道单片机工作周期和循环次数即可算出,但不具有可移植性,在不同种类单片机中,汇编不通用。用c的话,由于各种软件执行效率不一样,不会太准,通常用定时器做延时或做一个不准确的延时,延时短的话,在c中使用汇编的nop做延时 3、51单片机C语言for循环延时程序时间计算,设晶振12MHz,即一个机器周期是1us。for(i=0,i<100;i++) for(j=0,j<100;j++) 我觉得时间是100*100*1us=10ms,怎么会是100ms 答: 不可能的,是不是你的编译有错的啊

单片机C延时时间怎样计算

C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时 应该使用unsigned char作为延时变量。以某晶振为12MHz的单片 机为例,晶振为12M H z即一个机器周期为1u s。一. 500ms延时子程序 程序: 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 延时总时间 = 三层循环 + 循环外 = 499995+5 = 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--);

51单片机的几种精确延时

51单片机的几种精确延时实现延时 51单片机的几种精确延时实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。 1 使用定时器/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。 在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC 语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。 2 软件延时与时间计算 在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。 2.1 短暂延时 可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下: void Delay10us( ) { _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); } Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。可以把这一函数

51单片机延时时间计算和延时程序设计

一、关于单片机周期的几个概念 ●时钟周期 时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12MHz的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。 在一个时钟周期内,CPU仅完成一个最基本的动作。 ●机器周期 完成一个基本操作所需要的时间称为机器周期。 以51为例,晶振12M,时钟周期(晶振周期)就是(1/12)μs,一个机器周期包 执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期也不同。 对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。 1.指令含义 DJNZ:减1条件转移指令 这是一组把减1与条件转移两种功能结合在一起的指令,共2条。 DJNZ Rn,rel ;Rn←(Rn)-1 ;若(Rn)=0,则PC←(PC)+2 ;顺序执行 ;若(Rn)≠0,则PC←(PC)+2+rel,转移到rel所在位置DJNZ direct,rel ;direct←(direct)-1 ;若(direct)= 0,则PC←(PC)+3;顺序执行 ;若(direct)≠0,则PC←(PC)+3+rel,转移到rel 所在位置 2.DJNZ Rn,rel指令详解 例:

MOV R7,#5 DEL:DJNZ R7,DEL; rel在本例中指标号DEL 1.单层循环 由上例可知,当Rn赋值为几,循环就执行几次,上例执行5次,因此本例执行的机器周期个数=1(MOV R7,#5)+2(DJNZ R7,DEL)×5=11,以12MHz的晶振为例,执行时间(延时时间)=机器周期个数×1μs=11μs,当设定立即数为0时,循环程序最多执行256次,即延时时间最多256μs。 2.双层循环 1)格式: DELL:MOV R7,#bb DELL1:MOV R6,#aa DELL2:DJNZ R6,DELL2; rel在本句中指标号DELL2 DJNZ R7,DELL1; rel在本句中指标号DELL1 注意:循环的格式,写错很容易变成死循环,格式中的Rn和标号可随意指定。 2)执行过程

时间的计算和日期的变更

高考常考重难点命题规律探究 时间的计算与日期的变更 高考分析 本章内容重点考查五个方面:一太空探索;二是各类光照图的综合判读;三是昼夜长短的计算;四是正午太阳高度及季节的判断;五是时间的计算与日期的变更 近两年来高考中着重考察了昼夜长短的计算问题。地方时、区时、日界线等知识是中学地理学科的主要组成部分,并且随着人类交往密切,各科联系的加强,该知识点在生产、生活中得以广泛应用,因而成为近几年来高考重点考核的内容。该类题图象设计新颖,设问灵活,具体命题可能结合某一重大地理事件进行,往往以日照图为切入点,进行时间和空间上大跨度的综合考查,突出对学生综合能力的要求的考查,高三复习时应予以高度重视。锦囊妙计 时间计算是高考地埋计算专题复习中的“重头戏”,复习应从基本概念、规律和原理入手,通过知识的融通和内化,培养学生的基本技能,而通过基本技能的训练,可以让学生学会知识的归纳和整合,从而达到掌握"双基"的目的。解决此类问题,要能够把地理学科的基本原理和规律加以准确地运用,在基础知识掌握的前提下,灵活运用一些方法和技巧,以便准确地解决相关问题。做到“懂、熟、巧、准”,此类问题便能迎刃而解。 基础知识归纳 1.常用概念 经线、经度、地方时、时区、中央经线、区时和国际日期变更线等。同时要比较一些概念之间的区别,如时区和区时、地方时和区时、闰年和平年、闰月和平月、大月和小月。 24个时区的划分和确定,其划分如图2所示,

日界线的含义 2.要熟悉一些基本技能,主要是能熟练运用公式法和数轴图解法(图4)推算具体时间: 利用公式法可以解决如图4所示①②③④四种情况,当已知区时求地方时或已知地方时求区时时,要把区时对应的中央经线找出来,问题就会变得简单。而数轴图解法比公式法更直观,只要知道已知地和所求地的经度(或时区)与时间四要素中的任何三要素,就可以求出未知时间或经度(或时区)。 3.“寻找“已知点”,找到已知点后,可利用公式法或数轴图解法求解,“已知点”主要集中在四点——6、2、18和24(0)点钟上,找到了四点中的一点,便可求解,即“四点法”。

51单片机精确延时源程序

51单片机精确延时源程序 一、晶振为 11.0592MHz,12T 1、延时 1ms: (1)汇编语言: 代码如下: DELAY1MS: ;误差 -0.651041666667us MOV R6,#04H DL0: MOV R5,#71H DJNZ R5,$ DJNZ R6,DL0 RET (2)C语言: void delay1ms(void) //误差 -0.651041666667us { unsigned char a,b; for(b=4;b>0;b--) for(a=113;a>0;a--); } 2、延时 10MS: (1)汇编语言: DELAY10MS: ;误差 -0.000000000002us MOV R6,#97H DL0: MOV R5,#1DH DJNZ R5,$ DJNZ R6,DL0

RET (2)C语言: void delay10ms(void) //误差 -0.000000000002us { unsigned char a,b; for(b=151;b>0;b--) for(a=29;a>0;a--); } 3、延时 100MS: (1)汇编语言: DELAY100MS: ;误差 -0.000000000021us MOV R7,#23H DL1: MOV R6,#0AH I

棋影淘宝店:https://www.docsj.com/doc/dc13403884.html,QQ:149034219 DL0: MOV R5,#82H DJNZ R5,$ DJNZ R6,DL0 DJNZ R7,DL1 RET (2)C语言: void delay100ms(void) //误差 -0.000000000021us { unsigned char a,b,c; for(c=35;c>0;c--) for(b=10;b>0;b--) for(a=130;a>0;a--); } 4、延时 1S: (1)汇编语言: DELAY1S: ;误差 -0.00000000024us MOV R7,#5FH DL1: MOV R6,#1AH DL0: MOV R5,#0B9H DJNZ R5,$ DJNZ R6,DL0 DJNZ R7,DL1 RET (2)C语言: void delay1s(void) //误差 -0.00000000024us { unsigned char a,b,c; for(c=95;c>0;c--) for(b=26;b>0;b--)

四年级奥数日期和时间地计算含问题详解

日期和时间的计算 一、学习目标 1.学会在日期的计算中发现和识别呈周期性变化的规律,并能列式解答. 2.学会时间计算的一般方法,能说明解答的基本依据. 3.感受简单的分析、推理等方法. 二、内容提要与方法点拨 1.被除数=商×除数+余数,余数要小于除数. 2.找准有一定变化规律的周期,如1年有12个月,1周有7天,1小时是60分,1分是60秒等. 三、例题选讲 例12008年元旦是星期二,那么,2012年元旦是星期几? 解:从2008年元旦到2012年元旦这四年中,2008年是闰年,其余三年是平年.四年的天数加上2012年元旦这一天,共有 366+365×3+1=1462(天) (或365×4+1+1) 一共是1462÷7=208(周)……6(天) 从星期二开始算,第六天是星期日.所以,2012年元旦是星期日. 这道题还可以这样算: 365÷7=52……1,平年有52周余1天,闰年就有52周余2天. 直接算出每一年的天数除以7的余数的和 2+1×3+1=6,从星期二开始算,第六天是星期日. 有一类数学问题是围绕每月天数、日期数和星期几的天数等关系展开的.解答这类问题的焦点往往在它的余数上. 我们知道,在一年的12个月中,每个月最少有28天,最多有31天,一个星期有7天.而 一个月的天数÷7 = 4……(余数),余数可以是0、1、2、3. 下面,我们根据这个除法算式进一步弄清有关的几个数量之间的关系. (1)由上式知,一个月的星期几的个数最少有4个,最多有5个. (2)当余数为0时,即这个月只有28天(平年的2月),那么,这个月所

有的星期几分别有4个.同时,这个月的第一天是星期几,最后一天就是星期几 的前一天.例如,2月1日是星期二,2月28日就是星期一. (3)当余数为1、2、3时,即这个月多于28天.多出了几天,就有几个星 期几是5个的,而且是连续的.例如,7月有31天,当7月1日是星期二时,7 月28日是星期一,7月29日、30日、31日就分别是星期二、三、四,则这个 月的星期二、三、四各有5个. 多出的几天及对应是星期几也可以放到月头考虑,在此不一一分述. 想一想:某年的六月一日是星期五,这个月有5个星期()和星期(). 例2某年的3月份正好有4个星期三和4个星期六,那么这个月的1日是星期几? 有4个星期还多3天。这3天是连续的而 且不能是星期三和星期六,因此,也不可 能是在星期三和星期六之间的星期四和星 期五。这样,只能是星期一、星期二和星 期日。 即这3天按顺序是星期日、一、二(29日、30日、31日)。所以,三月一 日是星期日(如图)。 例3有一个月,星期四的天数比星期三多,星期日的天数比星期六少,这个月的20日是星期几? 解:要求某月某日是星期几,一般可以由这个月的第一日或最后一日是星期 几推出. 由条件“星期四的天数比星期三多,星期日的天数比星期六少”可知这个月 的星期三、星期日只有4个,而星期四、星期六都有5个.从而推知在星期四和 星期六之间的星期五也应有5个.这个月有31天,31÷7=4…3,而且1日是星期 四,31日是星期六. 再由1日是星期四知,8日、15日、22日也是星期四,得知20日就是星期 二.或由31日是星期六,31-20-7=4,推算出20日是星期二(如图).

单片机一些常用的延时与中断问题及解决方法

延时与中断出错,是单片机新手在单片机开发应用过程中,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机、MSP430单片机、C51单片机、8051F的单片机、avr单片机、STC89C52、PIC单片机…..在内的各种单片机常见的延时与中断问题及解决方法,希望对单片机新手们,有所帮助! 一、单片机延时问题20问 1、单片机延时程序的延时时间怎么算的? 答:如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。 如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。 2、求个单片机89S51 12M晶振用定时器延时10分钟,控制1个灯就可以 答:可以设50ms中断一次,定时初值,TH0=0x3c、TL0=0xb0。中断20次为1S,10分钟的话,需中断12000次。计12000次后,给一IO口一个低电平(如功率不够,可再加扩展),就可控制灯了。 而且还要看你用什么语言计算了,汇编延时准确,知道单片机工作周期和循环次数即可算出,但不具有可移植性,在不同种类单片机中,汇编不通用。用c的话,由于各种软件执行效率不一样,不会太准,通常用定时器做延时或做一个不准确的延时,延时短的话,在c中使用汇编的nop做延时 3、51单片机C语言for循环延时程序时间计算,设晶振12MHz,即一个机器周期是1us。for(i=0,i<100;i++) for(j=0,j<100;j++) 我觉得时间是100*100*1us=10ms,怎么会是100ms 答: 不可能的,是不是你的编译有错的啊 我改的晶振12M,在KEIL 4.0 里面编译的,为你得出的结果最大也就是40ms,这是软件的原因, 不可能出现100ms那么大的差距,是你的软件的原因。 不信你实际编写一个秒钟,利用原理计算编写一个烧进单片机和利用软件测试的秒程序烧进单片机,你会发现原理计算的程序是正确的

延时计算

t=n*(分频/f) t:是你所需的延时时间 f:是你的系统时钟(SYSCLK) n:是你所求,用于设计延时函数的 程序如下: void myDelay30s() reentrant { unsigned inti,k; for(i=0;i<4000;i++) /*系统时钟我用的是24.576MHZ,分频是12分频,达到大约10s延时*/ for(k=0;k<8000;k++); } //n=i*k |评论 2012-2-18 20:03 47okey|十四级 debu(g调试),左侧有运行时间。在你要测试的延时子函数外设一断点,全速运行到此断点。记下时间,再单步运行一步,跳到下一步。再看左侧的运行时间,将这时间减去上一个时间,就是延时子函数的延时时间了。不知能不能上图。 追问 在delayms处设置断点,那么对应的汇编语言LCALL是否被执行呢?还有,问问您,在C8051F020单片机中,MOV指令都是多少指令周期呢?我在KEIL下仿真得出的结果,与我通过相应的汇编语言分析的时间,总是差了很多。 回答 C编译时,编译器都要先变成汇编。只想知道延时时间,汇编的你可以不去理会。只要看运行时间就好了。 at8051单片机12m晶振下,机器周期为1us,而c8051 2m晶振下为1us。keil 调试里频率默认为24m,你要设好晶振频率。

|评论 2012-2-23 11:17 kingranran|一级 参考C8051单片机内部计时器的工作模式,选用合适的计时器进行中断,可获得较高精度的延时 |评论 2012-2-29 20:56 衣鱼ccd1000|一级 要是精确延时的话就要用定时器,但定的时间不能太长,长了就要设一个变量累加来实现了; 要是不要求精确的话就用嵌套for函数延时,比较简单,但是程序复杂了就会增添不稳定因素,所以不推荐。 |评论

用单片机实现延时(自己经验及网上搜集).

标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。 在keil C51中,直接调用库函数: #include // 声明了void _nop_(void; _nop_(; // 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。 在选择C51中循环语句时,要注意以下几个问题 第一、定义的C51中循环变量,尽量采用无符号字符型变量。 第二、在FOR循环语句中,尽量采用变量减减来做循环。 第三、在do…while,while语句中,循环体内变量也采用减减方法。 这因为在C51编译器中,对不同的循环方法,采用不同的指令来完成的。 下面举例说明: unsigned char i; for(i=0;i<255;i++; unsigned char i; for(i=255;i>0;i--;

其中,第二个循环语句C51编译后,就用DJNZ指令来完成,相当于如下指令: MOV 09H,#0FFH LOOP: DJNZ 09H,LOOP 指令相当简洁,也很好计算精确的延时时间。 同样对do…while,while循环语句中,也是如此 例: unsigned char n; n=255; do{n--} while(n; 或 n=255; while(n {n--}; 这两个循环语句经过C51编译之后,形成DJNZ来完成的方法, 故其精确时间的计算也很方便。 其三:对于要求精确延时时间更长,这时就要采用循环嵌套的方法来实现,因此,循环嵌套的方法常用于达到ms级的延时。对于循环语句同样可以采用for,do…while,while结构来完成,每个循环体内的变量仍然采用无符号字符变量。 unsigned char i,j for(i=255;i>0;i--

单片机精确毫秒延时函数

单片机精确毫秒延时函数 实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。今天主要介绍软件延时以及单片机精确毫秒延时函数。 单片机的周期介绍在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。脉冲信号之间的时间间隔称为周期;而将在单位时间(如1秒)内所产生的脉冲个数称为频率。频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称;频率的标准计量单位是Hz(赫)。电脑中的系统时钟就是一个典型的频率相当精确和稳定的脉冲信号发生器。 指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。 时钟周期:也称为振荡周期,一个时钟周期= 晶振的倒数。对于单片机时钟周期,时钟周期是单片机的基本时间单位,两个振荡周期(时钟周期)组成一个状态周期。 机器周期:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、存储器读/写等。 机器周期=6个状态周期=12个时钟周期。 51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/ 晶振频率)= x s。常用单片机的晶振为11.0592MHz,12MHz,24MHz。其中11.0592MHz 的晶振更容易产生各种标准的波特率,后两种的一个机器周期分别为1 s和2 s,便于精确延时。 单片机精确毫秒延时函数对于需要精确延时的应用场合,需要精确知道延时函数的具体延

高一地理时间的计算与日期的变更

“时间的计算与日期的变更”难点透析 地方时、区时、日界线等知识是中学地理学科的主要组成部分,也是全国各大地理考卷必考的知识点。随着人类交往的密切,各科联系的加强,该知识点在生产、生活中得以广泛应用,因而成为近几年来高考重点考核的内容。该类题考察学生的读图、析图能力,知识应用及迁移能力,图形设计新颖、设问灵活、综合程度高,具体命题可能结合某一重大地理事件进行,往往以日照图为切入点,进行时间和空间上大跨度的综合考查,突出对学生综合能力的要求的考查,在平时及高三复习时应予以高度重视。 【难点透析】 1.认识实质:时间的计算与日期的变更其实质可从四方面理解。地球自转方向→自西向东→东早西晚(定性);地球自转周期→1个太阳日→15°/小时(定量);日地空间关系→确定时刻→矫正时刻(定标);东西时差计算→东加西减→大早小晚(定法)。时间计算本质上是地方时的计算。 2.理解概念:地方时是指因经度而不同的时刻(同线同时);区时是指各时区都以本区中央经线的地方时作为全区共同使用的时刻(同区同时);日界线有两条,①人文日界线:为了避免日期的紊乱,1884年在华盛顿国际经度会议上,规定原则上以180°经线作为地球上“今天”和“昨天”的分界线,叫做“国际日期变更线”,简称“日界线”。②自然日界线:地球上地方时为0时(子夜)所在的隐形经线。 3.掌握方法: (1)地方时。地球上的地方时以太阳作为参照物确定,某地的太阳高度角达到一天中的最大值时,当地的地方时为12点,与12点相对的地方时为0点。同一条经线上的地方时相同,不同经线的地方时不同,越往东时刻越早,即东早西晚(大早小晚),每隔15度,相差1个小时。地方时的计算分三步进行。 ①空间定位清楚,用图式两点的经度定点,清楚准确直观反映空间关系; ②地理分析到位(已知、未知、东西关系、经度差和时间差的相互转换,四者知其三,可以任求其一); ③数学计算准确(认真计算,仔细检查)。同时应注意以下隐含条件:晨线与赤道交点所在经线上的地方时为6时,昏线与赤道交点所在经线上的地方时为18时。即赤道在任何时刻晨线上都是6时,昏线上都是18时;太阳直射点所在经线上的地方时为12时,和正午正相对的另一经线地方时为0时。即正相对的两条经线地方时相差12时;经度相差15°,时刻相差1小时;经度相差1°,时刻相差4分钟(东加西减,东早西晚);经度相同,地方时相同;经度不同,地方时不同;日照图中,平分昼半球的经线为中午12时,平分夜半球经线所在地方时为0时;区时与地方时一致的地方在各时区的中央经线上(中央经线度数=15°×时区数);过日界线时日期要发生变化。即日界线两侧时刻相同,日期不同。 (2)区时。时区的划分:每隔15度划分为一个时区,每个时区的中央经线都是15的倍数,据此可以求出任一条经线所在的时区。特别注意零时区(中时区)和12时区的划分。各时区都以本区中央经线的地方时作为全区共同使用的时刻,称为区时,同区同时(国际标准时间,一般是指零时区的区时;美国东部时间一般是西五区的区时;西部时间一般是指西八区的区时;北京时间是指东八区的区时,即东经120度的地方时)。区时的计算:①确定经线所在的时区,并判断两时区的东西位置关系,东早西晚;②分析已知与未知条件,计算时区序号差及区时;③根据时区序号之差等于区时之差,算出结果,认真计算,并仔细检查。

单片机写延时程序的几种方法

单片机写延时程序的几种方法 1)空操作延時(12MHz) void delay10us() { _NOP_(); _NOP_(); _NOP_(); _NOP_(); _NOP_(); _NOP_(); } 2)循環延時 (12MHz) Void delay500ms() { unsigned char i,j,k; for(i=15;i>;0;i--) for(j=202;j>;0;j--) for(k=81;k>;0;k--); }

延時總時間=[(k*2+3)*j+3]*i+5 k*2+3=165 us 165*j+3=33333 us 33333*i+5=500000 us=500 ms 3)計時器中斷延時(工作方式2) (12MHz) #include; sbit led=P1^0; unsigned int num=0; void main() { TMOD=0x02; TH0=6; TL0=6; EA=1; ET0=1; TR0=1; while(1) { if(num==4000) { num=0;

led=~led; } } } void T0_time() interrupt 1 { num++; } 4)C程序嵌入組合語言延時 #pragma asm …… 組合語言程序段 …… #pragma endasm KEIL軟件仿真測量延時程序延時時間

這是前段事件總結之延時程序、由於不懂組合語言,故NO.4無程序。希望對你有幫助!!! 對於12MHz晶振,機器周期為1uS,在執行該for循環延時程式的時候 Void delay500ms() { unsigned char i,j,k; for(i=15;i>;0;i--) for(j=202;j>;0;j--) for(k=81;k>;0;k--); } 賦值需要1個機器周期,跳轉需要2個機器周期,執行一次for循環的空操作需要2個機器周期,那么,對於第三階循環 for(k=81;k>;0;k--);,從第二階跳轉到第三階需要2機器周期,賦值需要1個機器周期,執行81次則需要2*81個機器周期,執行一次二階for循環的事件為81*2+1+2;執行了220次,則(81*2+3)*220+3,執行15次一階循環,則 [(81*2+3)*220+3]*15,由於不需要從上階跳往下階,則只加賦值的一個機器周期,另外進入該延時子函數和跳出該函數均需要2個機器周期,故

单片机延时程序分析#(优选.)

上一次课中,我们已经知道,程序中的符号R7、R6是代表了一个个的RAM单元,是用来放一些数据的,下面我们再来看一下其它符号的含义。 DELAY:MOV R7,#250;(6) D1:MOV R6,#250 ;(7) D2:DJNZ R6,D2 ;(8) DJNZ R7,D1;(9) RET ;(10) 〈单片机延时程序〉 MOV:这是一条指令,意思是传递数据。说到传递,我们都很清楚,传东西要从一本人的手上传到另一本人的手上,也就是说要有一个接受者,一个传递者和一样东西。从指令M OV R7,#250中来分析,R7是一个接受者,250是被传递的数,传递者在这条指令中被省略了(注意:并不是每一条传递指令都会省的,事实上大部份数据传递指令都会有传递者)。它的意义也很明显:将数据250送到R7中去,因此执行完这条指令后,R7单元中的值就应当是250。在250前面有个#号,这又是什么意思呢?这个#就是用来说明250就是一个被传递的东西本身,而不是传递者。那么MOV R6,#250是什么意思,应当不用分析了吧。 DJNZ:这是另一条指令,我们来看一下这条指令后面跟着的两个东西,一个是R6,一个是D2,R6我们当然已知是什么了,查一下D2是什么。D2在本行的前面,我们已学过,这称之为标号。标号的用途是什么呢?就是给本行起一个名字。DJNZ指令的执行过程是这样的,它将其后面的第一个参数中的值减1,然后看一下,这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移,转到什么地方去呢?可能大家已猜到了,转到第二个参数所指定的地方去(请大家用自已的话讲一下这条语句是怎样执行的)。本条指令的最终执行结果就是,在原地转圈250次。

三年级数学时间和日期练习题的计算

三年级时间单位的联系与巩固 一、填一填。(每空1分,共18分) 1.常用的时间单位有()、()、()、()、()、()。2.一年有()个月,平年全年有()天,闰年全年有()天。3.通常4年里有()个平年,()个闰年。公历年份是()的倍数的一般是闰年,公历年份是整百数的,必须是()的倍数才是闰年。4.每年上半年都有()个大月,分别是()。下半年一共有()天。 5.汽车上午9时出发,下午4时30分返回,共行驶了()。6.从晚上10时到早上4时,共经过了()小时。 二、判一判。(对的在括号里打“√”,错的打“×”。)(每题1分,共6分)1.平年比闰年少一天。() 2.因为1900年是4的倍数,所以1900年是闰年。()3.明明的生日是公历2月30日。()4.今天是5月30日,明天就是六一儿童节了。() 5.小明的爸爸到北京去开会,4月31日才会回来。() 6.从早上8时到晚上8时,共经过了10小时。() 三、选一选。(把正确答案的序号填在括号里。)(每题1分,共8分)1.下列年份是闰年的是()。 A.1900年 B.1949年 C.2004年

2.2004年5月10日是强强8岁的生日,强强的出生日期是()。A.1990年5月10日 B.1996年5月10日 C.1992年5月1日 3.明明的生日比国庆节早一天,他的生日是()。 A.9月31日 B.9月30日 C.5月31日 4.分针走一圈的时间是()。 A.12小时 B.12分钟 C.60分钟 D.5分钟 5.一星期共有()小时。 A.168 B.144 C.160 6.0时也叫()。 A.中午12时 B.夜里12时 C.凌晨1时 7.从上午9:10到下午5:10经过的时间是()。 A.9小时 B.7小时 C.8小时 8.小飞晚上8:30睡觉,第二天早上6:30起床,他共睡了()。A.9小时 B.10小时 C.13小时 四、在()里填上合适的数。(共18分) 3星期=()小时 5日=()小时2年=()个月144小时=()日 4时30分=()分 2分15秒=()秒

时间计算与日期变更

时间计算与日期变更 一、地方时 1 产生的原因:由于地球的自转,地表各地相对于太阳的方向不断发生变化,因而各地的时刻便依次推进。于是,在同一瞬间,地球上的各种时刻不同。 2 、定义:地方时就是因经度不同而不同的时间,它把一天中太阳升到最高时的时间为定为中午12时,将连续两个12小时之间等分为24小时,这样形成的时间系统,称为地方时。遵循“东早西晚”的原则,其差异是1小时/150、4分钟/10、4秒钟/1‘。 注意:“如日中天”中的“日中天”就是一天中太阳最高的时刻,是一天中地方时为12点的时刻,这时太阳辐射在一天中最强。但此时气温并不一定最高,因为地表受热需要一个过程。 3、与地理位置的关系:经度相同的地方,地方时相同 地理位置越靠东边的地方,地方时的值越大(同一天,24小时制) 若两地分别为东经或西经地区,则经度差=两地经度数之和 二、时区和区时 1、时区:国际上规定把全球分为24个时区,即每隔15划分24个时区 注意:东12区位于东经范围以内,西12区位于西经范围以内,其中东12区与西12区都只跨个经度,东、西12区合为一个时区。但东、西12区都位于西半球。 2、区时:每个时区的区时,以该时区中央经线的地方时为整个时区的统一时间,又称为标准时。注意:①、中央经线是指该时区的“标准经线”,其度数的大小为该时区数〓150 ②、在任意两个时区之间,相差几个时区,就相差几个小时。较东的时区,区时较早。 ③、东西12时区时刻相同,而日期相差1天。 3、根据经度推算时区的方法 ①经度〔150/h=整数和余数。若余数小于度,同该经度的时区数就是整数; ②若该余数大于度,则该经度的时区数就是整数+1;③某地为东经度,为东时区;某地为西经度,为西时区;若整数为12,则为东西12区 4、时区差的计算方法:同区相减,异区相加 5、世界各个国家区时的确定: (1)北京时间:北京所在的东8区的区时,即1200E的地方时,是中国各地统一采用的时间 (2)国际标准时:本初子午线的地方时,即中时区的区时。 (3)世界各国根据本国具体情况,在区时的基础上,采用一些特别的计时方法:有的国家根据本国所跨的经度范围,采用半区时,即采用与中央经线相差的时区的边界线的地方时,如印度采用东区;的有国家为了充分利用太阳照明,采取本国东部时区的中央经线的地方时,如朝鲜采用东9区的区时。 三、时间的计算方法 方法:第一步:求两地的经度差或时区差――同经(区)相减,异经(区)相加 第二步:求两地的时间差=经度差〔150/h=时区差的大小第三步:求所求地的时间――东加西减04、经度差的计算方法:若两地同为东经或同为西经地区,则经度差=大的经度数-小的经度数 1/6页 东和西是指所求地在已知地的东或西方。判断方法有:①在光照图中可根据地球自转的方向进行判断;②有经度的时候,则用东经度数越大,越往东去;西经度数越小,越往东去; ③在进行时区计算时,则东时区数越大,越往东去;西时区数越小,越往东区。 (1)已知某一地的地方时,求另一地的地方时:所求地方时=已知地方时〒经度差〓4(分钟/度)或所求地方时=已知地方时〒时区差

相关文档
相关文档 最新文档