导航:首页 > 操作系统 > 单片机1毫秒定时不准确

单片机1毫秒定时不准确

发布时间:2022-07-12 11:37:24

1. 51单片机定时器初值用变量设置定时不准确,为什么,求高手。TH0=(65536-X)/256,TL0=(65536-X)%256

看一下C代码编译后的汇编代码就知道了,用变量方式很耗时,而直接用数字,编译器已经将算式的值算好了,代码里就是一个MOV指令而已,只需1us!!!
TH0=(65536-2000)/256; TL0=(65536-2000)%256;

汇编后,只要2us就完事了。 而用变量方式,单片机很忙,计算几十乃至上百微妙才完事!
15: TH0=(65536-a)/256;
C:0x0190 AE09 MOV R6,a(0x09)
C:0x0192 AF0A MOV R7,0x0A
C:0x0194 AB07 MOV R3,0x07
C:0x0196 AA06 MOV R2,0x06
C:0x0198 E4 CLR A
C:0x0199 C3 CLR C
C:0x019A 9B SUBB A,R3
C:0x019B FF MOV R7,A
C:0x019C E4 CLR A
C:0x019D 9A SUBB A,R2
C:0x019E FE MOV R6,A
C:0x019F 7401 MOV A,#0x01
C:0x01A1 9400 SUBB A,#0x00
C:0x01A3 FD MOV R5,A
C:0x01A4 E4 CLR A
C:0x01A5 9400 SUBB A,#0x00
C:0x01A7 FC MOV R4,A
C:0x01A8 E4 CLR A
C:0x01A9 FB MOV R3,A
C:0x01AA 7A01 MOV R2,#0x01
C:0x01AC F9 MOV R1,A
C:0x01AD F8 MOV R0,A
C:0x01AE 1201EA LCALL C?SLDIV(C:01EA)
C:0x01B1 8F8C MOV TH0(0x8C),R7
16: TL0=(65536-a)%256;
C:0x01B3 AE09 MOV R6,a(0x09)
C:0x01B5 AF0A MOV R7,0x0A
C:0x01B7 AB07 MOV R3,0x07
C:0x01B9 AA06 MOV R2,0x06
C:0x01BB E4 CLR A
C:0x01BC C3 CLR C
C:0x01BD 9B SUBB A,R3
C:0x01BE FF MOV R7,A
C:0x01BF E4 CLR A
C:0x01C0 9A SUBB A,R2
C:0x01C1 FE MOV R6,A
C:0x01C2 7401 MOV A,#0x01
C:0x01C4 9400 SUBB A,#0x00
C:0x01C6 FD MOV R5,A
C:0x01C7 E4 CLR A
C:0x01C8 9400 SUBB A,#0x00
C:0x01CA FC MOV R4,A
C:0x01CB E4 CLR A
C:0x01CC FB MOV R3,A
C:0x01CD 7A01 MOV R2,#0x01
C:0x01CF F9 MOV R1,A
C:0x01D0 F8 MOV R0,A
C:0x01D1 1201EA LCALL C?SLDIV(C:01EA)
C:0x01D4 AF03 MOV R7,0x03
C:0x01D6 8F8A MOV TL0(0x8A),R7
17: TH1=(65536-1000)/256;
C:0x01D8 758DFC MOV TH1(0x8D),#0xFC
18: TL1=(65536-1000)%256;
C:0x01DB 758B18 MOV TL1(0x8B),#0x18

2. 单片机高手给点拨下,定时器这个不太理解,定时器初始化有几种方法啊比如说定时1毫秒

51 单片机中定时器,是个 16 位的加法计数器。
其内容是 0000H ~ FFFFH,即:0 ~ 65535。
每隔一个机器周期,加一次一。加到 65536,就会溢出,产生中断。

在外部振荡器频率 = 11.0592 MHz 时,机器周期=1085.06944...us。
要想定时 1000us,这就有点困难了。

在外部振荡器频率 = 12 MHz 时,机器周期=1us。
要想定时 1000us,就可以设初始值为:65536 - 1000 = 64536。

分成高、低八位后,写入 THx、TLx,即可。

求出:初始值、分成高低八位,可以人工计算,那么,程序就是:
TH1 = 0XFC;
TL0 = 0X67;
也可以由编译软件来算,程序中,写出公式,这就是:
TH0 = (65535 - 1000)/256;
TL0 = (65535 - 1000)%256;
-------
又因为,中断响应,是不会及时发生的,通常,都会迟到 3 ~ 8 个机器周期。
用 C 语言编程,会耽误更多吧。
所以,定时时间,应该缩短一些,定时才准确。
因此,才有+ 28 的算法

加上这个数之后,初始值,就大了一些,更接近 65536,定时时间,就短了。
这是个经验数据。

3. 单片机:用计时器给LCD计时间每一秒可能都会多个几毫秒,要怎么能减小这种误差

千分之几的误差,用定时器计时的这种方法误差很难消,
实在想消的话,可以用下面几种法子试试:
1. 挑选晶振,晶振频率有差,挑选个频率高一点的。

2. 调大计数器的初值,然后在中断服务 子程序中让计数器停止计数、马上再启动计数,目的是微微调整定时的周期。

两种方法都较难调好,要慢慢试,最好改其它定时法。比如用1302等芯片

4. 51单片机查询法设置初值为1ms的时候查询不准确

你液晶刷新的时间就超过1毫秒了,所以这样的程序结构并没有意义,查询法最大的弊病也在于此,当你有空查询标志的时候,殊不知已物是人非……所以查询法只能自己勤盯着,不要给意外以可乘之机

5. 51单片机中用定时器定时1毫秒,怎么编写

假设晶振为12MHz,不用中断时程序语句如下:
TMOD=0x01;//定时器0工作方式1
TH0=(65536-1000)/256;//装入初值
TL0=(65536-1000)%256;
TF0=0;//清溢出标志;
TR0=1;//启动定时器0
while(TF0==0);//等待定时时间到
TR0=0;
TF0=0;

6. 单片机定时器做的时钟,定时不准。

单片机定时器做时钟,确切的说在环境温度变化不大的前提下,可以调整的很准,毕竟它是基于MHz级的晶振的,提两点建议,1】建议使用12MHz晶振;2】请注意对于不同的编程,定时器赋值时,如果需要50ms定时则绝不一定是赋值50000,也不一定是循环20次就是1S;你琢磨下这里的道理,你就明白了,具体方法是,找一个比较准的时钟,比如在线时钟,每10小时记录一次找出规律,细细调整,毕竟它是在微秒范围内进行调整,你肯定行的,祝成功。

7. 为什么51单片机的定时器计时不准确

中断函数里面尽量少放语句,如果产生脉冲波形就只放一个

8. 51单片机定时器问题,定时不精准,差不多30s就有一秒的误差,

65536-46080=19456个机器周期。
你使用11.0592M,如果单片机是12T的话,那就是每秒有11059200/12=921600个周期
19456/921600=0.0211111秒
再加上你在中断函数中到TH0,TL0赋值的操作,包括,跳转,关键数据入栈,TH0,TL0赋值等的时间。
换句话说,你一次中断大概是0.021120秒
接下来,你就自己算吧

阅读全文

与单片机1毫秒定时不准确相关的资料

热点内容
世界上最快的动物是什么app 浏览:889
一打开微信文件夹就卡 浏览:265
什么软件可以做指标源码 浏览:464
java程序员饱和 浏览:149
路由器怎么加密更安全 浏览:695
内存卡加密卡是什么意思 浏览:695
帮别人做app需要注意什么 浏览:668
android获取string字符 浏览:181
python中的计数器 浏览:622
海地加密驱动安装 浏览:844
慧净电子12单片机开发板 浏览:940
什么网段服务器好 浏览:598
服务器商店怎么造 浏览:934
有什么跳鬼步舞的app 浏览:250
倚天2如何自己搭建服务器 浏览:553
我的世界如何让服务器刷神宠 浏览:624
为什么程序员要尽量进大厂 浏览:3
phpfiletype 浏览:936
PHP用户登录管理系统源码 浏览:199
你适合做程序员吗 浏览:896