导航:首页 > 操作系统 > 单片机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毫秒定时不准确相关的资料

热点内容
php中括号定义数组 浏览:600
php打印堆栈 浏览:514
华为adb命令行刷机 浏览:963
人像摄影pdf 浏览:755
解压文件密码怎样重新设置手机 浏览:999
高考指南pdf 浏览:693
爬虫python数据存储 浏览:240
u盘怎么取消加密 浏览:429
567除以98的简便算法 浏览:340
pdf手机如何解压 浏览:15
python描述器 浏览:60
战地联盟3解压密码 浏览:805
s型命令 浏览:25
php年薪5年 浏览:71
如何上网上设个人加密账户 浏览:44
linux打开ssh服务 浏览:78
微信位置可以加密吗 浏览:470
算法蛮力法 浏览:438
随机排练命令 浏览:147
python多进程并发 浏览:41