只是截图时用的 Notepad++ 文本编辑器
应用了 tomorrow_night_bright 皮肤 [此贴子已经被作者于2012-9-4 8:48:55编辑过]
|
敢问楼主用的什么代码编辑器 貌似不是keil? |
单独计量一个us是不容易,但是10天差5秒是可以计量的。 |
结果是闪烁1次慢1微秒,折换到1小时就是慢 18ms 软件仿真本就不准! 在网上查了一下,能测1微秒的量具还真没找到。 [此贴子已经被作者于2012-9-1 22:31:50编辑过]
|
你的理解是对的!
按我上面给你的回复试一试,就那么多。 |
继续学习~发现T0 T1 的工作方式2 也是具有自动重装的,
只不过只能有8位也就是最大256us [12M晶振]
256us 时间有点短,留给程序执行的其它代码时间不多。
我这样理解不错吧? |
TH2=(65536-46080)/256 ;//46080...11.0592MHZ晶振的初装值
[此贴子已经被作者于2012-9-1 9:36:46编辑过]
|
呵呵,我的代码里,12M晶振不准引起的误差,我就是再怎么个强迫症,我也无能为力了 【STC-ISP下载时显示的貌似确实不是精确12M,是不满12M】
我们开发板 STC89C52单片机 芯片 是有 定时器/计数器2 的吧,
查了 reg52.h , 定时器/计数器2 不是很懂, 是不是这样 IE 寄存器的 ET2 位是 定时器/计数器2 开关 对应的 T2CON 寄存器的 TR2和TF2位是 开始计时和溢出的标志位
T2CON 其它位都是什么作用? 始初值、工作方式啊 什么的是哪在个寄存器位?
看不懂啊,还缺点理论知识, 定时器/计数器2 使用教程在哪有的没?
[此贴子已经被作者于2012-8-31 12:07:58编辑过]
|
首先你的精益求精的精神我是赞赏的。
基于你这种精神和目的,但是我不得不告诉你:定时器工作在这种模式下,不可能那么精确!(12m晶振,只要有误差就肯定大于1us)
原因是由于51单片机在响应中断请求时的一些条件(具体的你自己再看看资料吧),不可能任何情况下都及时响应。由于重新装载定时初值是在中断内,所以就会造成重新装载初值的时间不确定(当然是us级的),自然就造成了误差。
怎么办呢?如果是做单片机时钟(不用时钟芯片),确实需要这么高的精度时,可以采用定时器/计数器2(51没有,52有),自动重装载初值的工作模式。 |
看了那个贴子,汇编不懂~哈
参照贴子,按思路试了一下,应该也是可以调整 延迟语句 精确定时到200ms, 但这种 延迟语句 没办法方便调整成其它时间,比如改成250ms,又得反复调 延迟语句 到精确。 【这方法也可以把精确定时调小,比如 延迟语句 1次是50ms,要250ms定时 就调用5次】
又顺着贴子看到 _nop_() 函数正好是 1 μs,看了之前的程序, 闪烁1次慢1 μs 不对,而是快了1 μs; 加个 _nop_() 应该正好
调了下我的程序,关了数码管干扰,加了 _nop_() 空函数,正好间隔200ms,非常精确。 改定时就修改 if 的判断语句,可以随便改 50ms 倍数 的间隔时间,都是精准的。
当然主程序循环体语句数量改变等,定时器中断程序里的 堆栈 操作时间也会随着变,调起来也麻烦了 =_=!
我的程序改成这样了:
[此贴子已经被作者于2012-8-30 22:01:37编辑过]
|
我原来曾经专门开过一个帖子介绍过精确定时的问题 http://www.51hei.com/bbs/dpj-4711-1.html
你按上面网址的做 能精确到1微妙 . |