打印
[AVR单片机]

关于定时器定时时间的疑惑

[复制链接]
1908|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
biyabc|  楼主 | 2012-8-3 09:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位前辈好,最近发现一个问题,那就是单片机定时器的定时时间。请各位解答 一下,谢谢!程序如下:
1.51单片机的,晶振频率12MHz,程序只摘录与定时器0有关的程序片段。
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做遥控器时也发现同样的问题。

相关帖子

沙发
joyme| | 2012-8-3 09:58 | 只看该作者
用示波器看一下波形呀,建议用500us的定时,12MHZ 51定时26us比较辛苦(定时器占用CPU资源过多)

使用特权

评论回复
板凳
biyabc|  楼主 | 2012-8-3 13:36 | 只看该作者
2# joyme 产生26us的定时,是产生38KHz的载波,我现在的疑惑是,我用定时器0产生26us的定时,那么count=223时,理论上应该223*26=5798us,但是9000/223=40.35875us。我知道有响应中断,保存当前操作等操作,但是应怎样计算它定时的精确值呢?

使用特权

评论回复
地板
joyme| | 2012-8-3 14:56 | 只看该作者
你还是没明白我说的意思,让你用示波器看38K的载波频率是否正确,说不定这个定时基数偏差很大实际不是26us

使用特权

评论回复
5
biyabc|  楼主 | 2012-8-3 15:29 | 只看该作者
4# joyme 哦,这个意思啊。我已经试过了,就是因为没有定时为我需要的26us啊,我是问怎样清楚的计算出它的定时时间!

使用特权

评论回复
6
NE5532| | 2012-8-4 11:17 | 只看该作者
搞清楚计数器是向上计数还是向下计数,向上计数器的算法是(255-223)*26!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

54

帖子

0

粉丝