51单片机怎么实现计时?

问题在于,虽然网上有好多朋友问过同样的问题,但是还是不清楚怎么做才能计算出单片机执行了多少指令,然后再除以晶振频率是吗?
先回顾一下一般的程序都是怎么计时的吧:
//重新赋值 12M晶振计算,指令周期1uS,500x2=1mS方波
TH0=(65536-500)/256;
TL0=(65536-500)*256;
这种是最常见的,问题在于我完全不知道原理,改变th0的值应该是对定时器设定的值,下一次溢出后产生作用吗?
还有常用的循环耗时法,虽然不是什么聪明的办法,但是很好理解,靠循环一定的指令来计算所花的时间,但是指令的量我们怎么精确知道?每条指令的时间怎么算,和晶振的关系是成反比例的么?

嘿嘿 还是让俺来帮你解决吧
1 关于定时器定时时间的计算问题:
如果使用的是12M晶振计算,指令周期1uS,定时器是加1计数器,即是对内部时钟即指令周期脉冲计数 每当1uS到时,计数器加1。
假设 定时器的初始值=X,则每到1uS 计数器的值就加1 ,则计数器值=X+1+1+...+1 值越来越大,最后达到FFFFH+1 就会产生溢出 结果计数器值回0(FFFFH+1=65536)
可以推出 定时时间=计数的1的个数×1uS=(65536—X )1 uS
结论: 定时时间跟初始值即时间常数X有关。
如果要定时0.5毫秒=500uS 根据定时时间公式 500=(65536—X )
即X=(65536-500) 一般把高8位送TH0 即 (65536-500)/256
把 (65536-500)%256即除上256后的余数 即低8位数送给TL0
每当定时时间到 计数器值都回0 必须重新送时间常数X
2每条指令的时间怎么算? 答复:
可以查指令表 每一条指令的执行时间的周期数 都是固定的 如 NOP 为一个机器周期
MOV R6,#200; 为2个机器周期
机器周期=12/晶振频率 如果晶振频率=12MHZ 则机器周期=1 uS
就可以知道 ; 执行NOP指令的执行时间为 1 uS
执行MOV R6,#200指令的执行时间为 2 uS
因此 是可以精确计算出指令的延时时间的
呵呵 就介绍这些吧 满意就 给加分吧追问

我眼花了,后面第二部分居然没看到,有了这个答案,那我在楼上留的言就都是屁话了,这一段才是关键,其它人看到这个问题后也一定可以得到清晰的答案,满意答案就选你了,十分感谢。

追答

呵呵

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-20
定时器的初值问题:定时器一旦启动,就会在原来的数值上开始加1计数,若在程序开始时我们没有设置TH0和TL0,他们的默认值都是0,假设时钟频率为12MHZ,12个时钟周期为一个机器周期,那么此时机器周期就是1us,计满TH0和TL0就需要2的16次方-1个数,即65535,再来一个脉冲就会溢出,即向CPU申请中断。因此溢出一次需要65536us,大约65.5ms,如果我们要定时50ms的话,那么就需要先给TH0和TL0装初值,在初值的基础上计数50000个后,定时器溢出,此时刚好是50ms中断一次,当需要定时1s时,产生20次的50ms的定时器中断后便认为是1s,这样就能精确控制时间。
计算方法:当用定时器的方式1时,设机器周期为Tcy,定时器产生一次中断的时间为t,那么需要计数的个数为N=t/Tcy,装入THX、TLX的数分别为 THX=(65536-N)/256 TLX=(65536-N)%256追问

您的回答比较清晰,虽然楼下也很清晰,而且还对与我具体的程序做了例子来分析,但是我先看到你的,所以只好把满意答案给你了。对了,机器周期tcy的取值怎么查?以51系列的来讲,都为12么?其它常用的取值又有哪些呢?我想这个对其它人也同样有用.

追答

机器周期为12*(1/晶振频率),晶振频率有12M的,11.0592M的等等

第2个回答  2015-11-21
如果使用的是12M晶振计算,指令周期1uS,定时器是加1计数器,即是对内部时钟即指令周期脉冲计数 每当1uS到时,计数器加1。
假设 定时器的初始值=X,则每到1uS 计数器的值就加1 ,则计数器值=X+1+1+...+1 值越来越大,最后达到FFFFH+1 就会产生溢出 结果计数器值回0(FFFFH+1=65536)可以推出 定时时间=计数的1的个数×1uS=(65536—X )1 uS
结论: 定时时间跟初始值即时间常数X有关。
如果要定时0.5毫秒=500uS 根据定时时间公式 500=(65536—X )即X=(65536-500) 一般把高8位送TH0 , 即 (65536-500)/256把 (65536-500)%256即除上256后的余数, 即低8位数送给TL0 ,每当定时时间到 计数器值都回0 必须重新送时间常数X。
51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是52系列的单片机一般不具备自编程能力。
相似回答