9744|32

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

单片机的精确延时问题,请各位作答! [复制链接]

最近学习单片机,因为要用到红外解码,所以对单片机的延时要求特别高,找了很久,问了许多人,看了很多代码,到处都是用for循环来进行延时(用c51的c语言),好好想了想,这样作只能在对延时精度要求不高的场合才能随便用用,但要是在有其他中断或其他干扰时这种做法就很不准确,所以我想了两种方法:

1.这种方法最主要了:定时器的初值,也就是对TH1,TL1(T0也是如此)重装初值,这种方法需要先计算(一定要注意波特率和PCON的初始化)。

2.就是用汇编来实现,我先贴一段汇编的延时子程序大家看看:

;1s的延时程序

delay1s: mov r1,#50

    del0:mov r2,#100

    del1:mov r3,$

          djne r2,del1

         djnz r1,del0

  ret

抱歉得很,没有注释,因为我也不太明白这种延时是不是很准确,这是我在电子制作这本杂志上看到的,当时如获至宝抄了下来,不过在网上看了很多汇编程序都是这样,不过要是在C语言上使用还是要内嵌这段汇编代码。

所以我想问问各位要用到精确延时时究竟该怎么做?

最新回复

用定时器工作在方式2(不用重装初值)即M1M0=10,定时的时间由你自己设定 采用汇编的循环也可能会有中断的影响  详情 回复 发表于 2010-5-16 19:39
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
哦对了,上面汇编代码有点问题。具体是这样的:
delay1s:  mov r1,#50

    del0: mov r2,#100

    del1: mov r3,#100
          djnz r3,$

          djnz r2,del1

          djnz r1,del0

  ret
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这种方法应该还是比较精确的
它是用每一条语句运行的时间,时钟每跳一次的时间来算的
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

4
 
谢谢
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
用循环还是会受中断干扰,用定时器是较可靠的,但软件复杂些
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 
同意楼上的意见,用软件循环延时在关中断的情况下可以实现精确定时,因为每条指令的执行时间是已知的。用定时器来实现一般较为精确,但是涉及到中断和主程序的协调和同步问题,程序结构较为复杂。
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

7
 
用定时器吧...不过我不懂
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

8
 
你的汇编代码主要是应用了DJNZ的2个时钟周期,靠这2个时钟周期定时.在KEIL下C语言也可以实现,具体代码我没有,你可以一边调试(反汇编),一边测试.KEIL是很强大的,它的优化功能做的很好.在"中山单片机"有人专门写了个贴子是关于用c语言写的延时,精确度较高.



调试是一种很好的方法
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

9
 
上述汇编代码其实也是通过循环来延时,只不过汇编指令的时间比较精确。不过不同的晶振频率对应于不同循环计数。用定时器的话,要使用一个定时器,并且禁止定时器中断。如果单片机有多余的定时器的话,可以优先考虑这种方法。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 
最近看了看书有点明白了上面的汇编延时原理是这样的,一个mov语句是耗时2个周期,例如我经常用的11.0592的晶振,一个单片机周期约1us,那么一个mov语句为2us,djnz r3,$就是在本行不停地作减1,r3为100,那就要在本句做100次执行,明白这两句话的含义上面的延时时间就好算了,具体为:50*(2+2+100*2+(2*100+2)*100)+2=1020200us大约为1s的延时,不知我算得对不对?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

11
 
精确的话就用定时器啦
我只会C语言的,还没学好汇编的
所以就给个C的吧
void time() interrupt ?(0~4) //中断函数 ?表示中断号,0到4分别为外部中断,定时器中断,串口中断
{TH?=0x??;//重装初值
TL?=0x??;
}
main()
{
TMOD=0x??; //定时器工作模式
TH0=0x??;  //装初值
TL0=0x??;
TR0=1;    //开定时器 使之工作
EA=1;    //开所有中断
ET?=1; //开定时器中断
for(;;){;}//无限循环 等待中断
}
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

12
 
定时器延时精确
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 
同意定时器
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(初级)

14
 
定时器是最佳选择
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

15
 
定时器也不是很准确,也在找更好的方法。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

16
 
本身晶振也是存在误差的。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

17
 
写好延时函数后,用定时器测试一下 看看具体是多长时间哈
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

18
 
每条语句执行的时间是一定的   你把 tr1  th1 重新装初始值     delay函数的延迟时间 一般情况还是很精确的在毫秒级内
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

19
 
用定时器还是比较好的
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

20
 
其实红外协议根本不用那么精确的延时,可以在一段延时之后判断i/o口的方法做。
我在3.8M定时器时钟下都能正常解码。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表