搜索
bottom↓
回复: 22

传统51单片机,at89c52在只考虑软件,能否精确延时1s没有误差

[复制链接]

出0入4汤圆

发表于 2012-6-16 14:59:41 | 显示全部楼层 |阅读模式
实在是想不明白,做了很多实验,用keil 软件模拟,没有发现没有误差,只能是相对比较小,我是用C语言编写的。
不过用汇编可能好一些,但不知道能不能实现精确延时。
哪位高人有好的算法,请指点

公司一长着说完全可以实现。题目要求用11.0592的晶振。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-6-16 15:26:06 | 显示全部楼层
不可能完全没有误差的
晶振本身还带有误差呢

就看你的精度要求了

出0入0汤圆

发表于 2012-6-16 15:26:43 | 显示全部楼层
本帖最后由 sync765 于 2012-6-16 15:27 编辑

网速卡
发重复了

出0入50汤圆

发表于 2012-6-16 15:30:31 | 显示全部楼层
没有误差的说法本身就有误差,确切地讲,应该有一个允许的误差范围。用延时要达到高精度,必须在程序中没有任何中断,否则延时的时候,执行了中断程序,你很难扣除这段时间产生的误差。不过这样的话,貌似定时器全废了,把好好的定时器废掉,确用有限的CPU资源去执行一个需要高精度的延时?实在想不通

出0入50汤圆

发表于 2012-6-16 15:35:56 | 显示全部楼层
如果可以用定时器做延时,那么使用任何一个定时器都可以,算好16位定时器的最大延时,然后在这个时间之下,查到一个是1000mS可以等分的时间,而且这个定时时间的TH和TL值里边,TL的初值正好又是0,那么每次中断不需要关闭中断,只要给TH赋值,定时时钟不会被中断延时造成计数误差,256时钟周期结束前,你完成TH的重新赋值就可以,在此之前TH不会产生进位。然后定时中断里,你用一个变量累加到正好1秒,产生一个输出,就可以了,这个精度不受任何其它内外部条件影响,直接可以做到和晶振同级的精度水平。

出0入0汤圆

发表于 2012-6-16 15:57:21 | 显示全部楼层
多多少少都会有误差,推荐你个单片机小精灵,算的还是比较准确的。

出0入0汤圆

发表于 2012-6-16 16:05:59 | 显示全部楼层
精确延时1S?
精确到什么程度???所谓的误差永远是相对存在的,只是大小的区别而已
具体看你的项目要求高低了
无源晶振需有适当值的电容配合
有源晶振相对会准确一点
也可以挂示波器实测晶振的频率后再去计算软件延时的参数
还可以根据延时的结果去反向调整延时参数
等等等等

出0入0汤圆

发表于 2012-6-16 17:46:58 | 显示全部楼层
晶振的选择
使用11.0592MHZ的晶振可以得到精确的波特率
使用12MHZ的晶振可以得到精确的延时

出0入0汤圆

发表于 2012-6-16 18:36:21 | 显示全部楼层
即使是理想晶振,软件延时某个值也会有些许误差
  1. void delay1s() //11.0592MHz误差 -0.00000000024us
  2. {
  3.     unsigned char a,b,c;
  4.     for(c=95;c>0;c--)
  5.         for(b=26;b>0;b--)
  6.             for(a=185;a>0;a--);
  7. }
复制代码
【 调试测试 】

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

 楼主| 发表于 2012-6-16 19:58:28 | 显示全部楼层
BXAK 发表于 2012-6-16 18:36
即使是理想晶振,软件延时某个值也会有些许误差【 调试测试 】

哇  辛苦啊  竟然能做到这样   如果用定时器  有什么好的算法吗  据说让定时器一直跑着  不重新装载   更准确些

出0入85汤圆

发表于 2012-6-16 20:20:45 | 显示全部楼层
零误差不现实,用汇编只是理论上编出准确的时间,没有考虑晶振的震荡频率的精度和温度系数

出0入0汤圆

发表于 2012-6-16 20:29:52 | 显示全部楼层
xiaoyigechaos 发表于 2012-6-16 19:58
哇  辛苦啊  竟然能做到这样   如果用定时器  有什么好的算法吗  据说让定时器一直跑着  不重新装载   更 ...

网上很多现成的小工具,这个延时函数是用“单片机小精灵1.3”自动生成的,不过这样的大延时delay函数没多大用处(CPU空耗着很浪费)

出0入0汤圆

发表于 2012-6-16 22:25:41 | 显示全部楼层
同意楼上说法,让CPU如痴浪费确实不划算,建议用定时器

出0入4汤圆

发表于 2012-6-16 23:21:24 | 显示全部楼层
11.0592mhz的晶振不太好算吧,用12mhz的晶振比较好,一个机器周期就是1us比比较容易

出0入0汤圆

发表于 2012-6-16 23:40:11 | 显示全部楼层
用12mhz的晶振比较好

出0入4汤圆

 楼主| 发表于 2012-6-17 00:19:35 | 显示全部楼层
5楼ilikemcu 说的可以好好思考一下

出0入0汤圆

发表于 2012-6-17 00:40:16 | 显示全部楼层
用定时器做延时,keil仿真,在定时器理论计算值的基础上细调,达到晶振的精度反正我是从来没有做到过,差不多千分之一内吧。

出0入0汤圆

发表于 2012-6-17 04:45:54 | 显示全部楼层
公司一长着说完全可以实现。


s/he doesn't know what s/he is talking about.

出0入0汤圆

发表于 2012-6-17 06:05:41 | 显示全部楼层
用T2延时

出10入10汤圆

发表于 2012-6-17 08:39:34 | 显示全部楼层
选好晶振,软件调试(I/O口输出脉冲,用示波器检测,调节延时参数)

出0入0汤圆

发表于 2012-6-17 12:40:05 | 显示全部楼层
xiaoyigechaos 发表于 2012-6-16 19:58
哇  辛苦啊  竟然能做到这样   如果用定时器  有什么好的算法吗  据说让定时器一直跑着  不重新装载   更 ...

http://www.amobbs.com/thread-787722-1-1.html

马老师当年讲过这个问题

出0入0汤圆

发表于 2012-6-17 13:02:01 | 显示全部楼层
millwood0 发表于 2012-6-17 04:45
s/he doesn't know what s/he is talking about.

他只知道完全可以实现

出0入0汤圆

发表于 2012-6-17 18:55:33 来自手机 | 显示全部楼层
用定时器方式2自动重装功能,不过我没有做过,没必要
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表