biyabc 发表于 2012-8-3 12:26:59

定时器定时精度问题的疑惑


马老师,你好!我想问下单片机定时器的定时时间。请您解答 一下,谢谢!程序如下:
1.51单片机的,晶振频率12MHz,程序只摘录与定时器0有关的程序片段。
static unsigned int count;       //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char Flag;      //红外发送标志
void main(void)
{
char key;
flag=0;
P3_4 = 1;
count = 0;
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1;//开始计数
}

//定时器0中断处理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
count++;
}

void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;

//发送9ms的起始码
endcount=223;
Flag=1;
count=0;
P3_4=0;
do{}while(count<endcount);

//发送4.5ms的结果码
endcount=117;
Flag=0;
count=0;
P3_4=1;
do{}while(count<endcount);
//后面还有其他地址,数据,反码处理等
}

我想问下,定时器0,每个26us中断一次,count加1。9ms的起始码为count=223,那么就是223*26us=5798us,这样计算也不等于9ms,是不是我遗漏了什么。请问这个具体应该怎样计算,我用attiny2313做遥控器时也发现同样的问题。

lpc1788 发表于 2012-8-3 12:31:30

未计算压入栈时间

biyabc 发表于 2012-8-3 12:38:49

lpc1788 发表于 2012-8-3 12:31 static/image/common/back.gif
未计算压入栈时间

请问这个怎样去计算呢?我上次用attiny2313做遥控器,调了很久,结果发现定时器定时精度有问题,做好count改小了就好啦!还有马老师那个讲义在哪儿下载啊,谢谢啦!

machao 发表于 2012-8-3 17:31:48

本栏有关于如何正确使用定时器,以及其精度的详细介绍和讨论的帖子,请找一下

biyabc 发表于 2012-8-4 08:23:44

machao 发表于 2012-8-3 17:31 static/image/common/back.gif
本栏有关于如何正确使用定时器,以及其精度的详细介绍和讨论的帖子,请找一下 ...

谢谢马老师,我昨天发完贴了就看见与我相同的问题啦!
页: [1]
查看完整版本: 定时器定时精度问题的疑惑