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秒
接下来,你就自己算吧