delay延时教程

上传人:飞*** 文档编号:53051525 上传时间:2018-08-27 格式:PDF 页数:4 大小:16.38KB
返回 下载 相关 举报
delay延时教程_第1页
第1页 / 共4页
delay延时教程_第2页
第2页 / 共4页
delay延时教程_第3页
第3页 / 共4页
delay延时教程_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《delay延时教程》由会员分享,可在线阅读,更多相关《delay延时教程(4页珍藏版)》请在金锄头文库上搜索。

1、delay 延时教程(用的是 12MHz 晶振的MCS-51)一、1)NOP指令为 单 周期指令2)DJNZ指令为 双周期指令3)mov 指令为 单 周期指令4)子程序调用(即LCALL指令)为 双周期指令5)ret 为双 周期指令states 是指令周期数,sec是时间 ,=指令周期 states,设置好晶振频率就是准确的了调试 设置 / 取消断点”设置或移除断点,也可以用鼠标在该行双击实现同样的功能二、编程最好:1.尽量使用unsigned 型的数据结构。2.尽量使用char 型,实在不够用再用int,然后才是long。3.如果有可能,不要用浮点型。4.使用简洁的代码,因为按照经验,简洁的

2、C代码往往可以生成简洁的目标代码(虽说不是在所有的情况下都成立)。5.在 do,while, while 语句中,循环体内变量也采用减减方法。三、编辑注意:1、在 C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。2、在延时子程序设计时,采用do,while,结构做循环体要比for 结构做循环体好。3、在延时子程序设计时,要进行循环体嵌套时,采用先内循环,再减减比先减减,再内循环要好。四、a:delaytime 为us级直接调用库函数:#include/ 声明了 void _nop_(void); _nop_(); / 产生一条

3、 NOP 指令作用:对于延时很短的,要求在us 级的,采用 “_nop_”函数,这个函数相当汇编NOP 指令,延时几微秒。eg:可以在 C 文件中通过使用带 _NOP_( ) 语句的函数实现, 定义一系列不同的延 时函数,如 Delay10us( ) 、Delay25us( ) 、Delay40us( ) 等存放在一个自定义的C 文件中,需要时在主程序中直接调用。如延时10 s 的延时函数可编写如下:void Delay10us( ) _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); 延迟时间 =6*1us+2us+2us=

4、10us b:delaytime 为us级我们用汇编语言写单片机延时10ms 的程序,可以编写下面的程序来实现:unsigned char i,j for(i=255;i0;i-) for(j=255;j0;j-); 或unsigned char i,j i=255; do j=255; doj- while(j); i-; while(i); 或unsigned char i,j i=255; while(i) j=255; while(j) j-; i-; 这三种方法都是用DJNZ指令嵌套实现循环的,由C51编译器用下面的指令组合来完成的MOVR7, 0FFH LOOP2 :MOVR6,

5、0FFH (1 周期)LOOP1 :DJNZR6 ,LOOP1 DJNZR7 ,LOOP2 (2 周期)这些指令的组合在汇编语言中采用DJNZ指令来做延时用,因此它的时间精确计算也是很简单,假上面变量i 的初值为 m,变量 j 的初值为n,则总延时时间为:m( n22+1) ,注: DJNZ A,B是一条转移指令,先将A减 1,若减后,1) A=0;不转移到 B处;2) A!=0;跳到 B 处;例 2:void delay500ms(void) unsigned charR7,R6,R5; for(R7=15;R70;R7-) for(R6=202;R60;R6-) for(R5=81;R50

6、;R5-); 产生的汇编 : C:0x0800 7F0F MOV R7,#0x0F C:0x0802 7ECA MOV R6,#0xCA C:0x0804 7D51 MOV R5,#0x51 C:0x0806 DDFE DJNZ R5,C:0806最内层C:0x0808 DEFA DJNZ R6,C:0804 C:0x080A DFF6 DJNZ R7,C:0802 C:0x080C 22 RET 计算分析 : 程序共有三层循环一层循环n:R5*2 = 81*2 = 162us DJNZ 2us 二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋

7、值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 总结:延时时间 =( (2*内 0+3)*内 1+3)*内 2 五、使用示波器确定延时时间利用示波器来测定延时程序执行时间。方法如下: 编写一个实现延时的函数,在该函数的开始置某个I/O 口线如 P1.0 为高

8、电平,在函数的最后清P1.0 为低电平。在主程序中循环调用该延时函数,通过示波器测量P1.0 引脚上的高电平时间即可确定延时函数的执行时间。方法如下:sbitT_point = P10; void Dly1ms(void) unsignedinti,j; while (1) T_point = 1; for(i=0;i2;i+) for(j=0;j124;j+); T_point = 0; for(i=0;i1;i+) for(j=0;j124;j+); void main (void) Dly1ms(); 把 P1.0 接入示波器, 运行上面的程序,可以看到P1.0 输出的波形为周期是3 ms 的方波。 其中,高电平为2 ms,低电平为 1 ms,即 for 循环结构“ for(j=0;j124;j+) ; ”的执行时间为1 ms。通过改变循环次数,可得到不同时间的延时。当然,也可以不用for 循环而用别的语句实现延时。这里讨论的只是确定延时的方法。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号