单片机C语言一秒定时程序详解

来源:百度知道 编辑:UC知道 时间:2024/06/06 09:46:36
这是一个经典一秒定时我看不懂,希望那位大哥给指点一下,越详细越好。小弟在这拜谢了。诚意求解!!
void timer0(void) interrupt 1 using 1
{
TH0=-5000/256;
TL0=-5000/256;
BUFFER[0]=BUFFER[0]+1;
if(BUFFER[0]==100)
{
CIRCLE=CIRCLE<<1;
if(CIRCLE==0)
{
CIRCLE=0X10;
}
BUFFER[0]=0;
BUFFER[1]=BUFFER[1]+1;
if(BUFFER[1]==60)
{
BUFFER[1]=0;
}
}
}
破书害死人啊,要是知道是这个,我晕。谢谢大哥指点了,要不不知道什么时候才能清楚呢,那个%是我打错了。后面BUFFER[0]==100;是书上原话,再问大哥一个问题后面为什么要if(BUFFER[1]==60)呢?为什么是60就要清零?大哥能把邮箱给小弟么?我想以后如果有什么不懂的就直接问大哥了,我的邮箱epdqffma357@163.com。再一次谢谢了

几M晶振
-----------------------------------
如果是12M晶振的话,那么定时器一个计数频率是12M / 12 = 1M,即一个计数周期是1us。

你给的程序看出,是定时器工作在MODE1。16位计数器。但是你给的程序应该有问题。
一个是TL0 = - 5000 / 256,应该是TL0 = - 5000 % 256;
另一个是if(BUFFER[0]==100),应该是if(BUFFER[0]==200)。

首先你要懂定时计数器原理,51是累加型,MODE1的上限是0xFFFF,即代表可计65535个数。这里程序想计5000个数(5000us),那么TH和TL组成的16位初值应该是60535。要表示这个数,可分两步理解,其一,5000表示成高低字节的两个8位数,高字节为5000 / 256(整数)= 19 = 0x13,低字节为5000 % 256(余数)= 136 = 0x88,结果是5000的16进制表示就是0x1388;其二,65535 - 5000 = 0xFFFF - 0x1388,相当于对0x1388取负。所以就有了TH0 = - 5000 / 256;TL0 = - 5000 % 256;

第二,如上分析,一个中断就是5ms,那么,在中断内部就要判断BUFFER[0]是否到达200,而不是100。如果到了,CIRCLE就向左移一位,然后BUFFER[1]加1,表示增加1秒,同时判断BUFFER[1]是否到60,如果是60就清零。

这小部分代码,还不能说清CIRCLE的具体作用,可能是用来点亮小灯的吧,移一位,小灯也移一次。

不知这样的回答满意不?
www.donald.net.cn

我的博客上就有一个比较好的同样功能的程序,不要用这相,里面有点故弄玄虚的.