找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1633|回复: 1
打印 上一主题 下一主题
收起左侧

循环等待定时器中断后,累加次数只要一多,时间就不准,这是为什么?

[复制链接]
跳转到指定楼层
楼主
ID:93430 发表于 2015-10-31 12:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
HI,ALL
     本来是红外发射码,但是发现只要定时器用得多了,就有问题,只能将代码一点一点删除,现在就剩下发38K脉冲持续500次,延时一段时间,再循环。实测38K持续时间忽长忽短,不知所以,请大侠解释一下。。
#include <reg51.h>
//#include <C51_ZY.h>
sbit P1_1=P1^1;     //  LED
static bit OP;                //the turn on or off of the IR led
sbit P1_3=P1^3;      // IR pin
static unsigned char flag;     //the flag of IRemission
static unsigned int lead_high;
static unsigned int lead_low;
static unsigned int count;     //delaycount
static unsigned int endcount;   //terminatecount
void   SendIRdata(void);
void timer0_int(void);
void IR_transfer_test(void);
void delay_100ms(int);
void main(void)  
{
  IE=0x0;
    P1_1=0;
    //AUXR |= 0x80;        //SET TIMER0 1T MODE
  P1M1 &= 0xF7;
  P1M0 |= 0x08;        //SETP1_3 PUSH-PULL MODE
   
      
  timer0_int();
     
    IR_transfer_test();
   
}   
void IR_transfer_test()
{     
       //int i;
//  int j;
    count=0;  
  flag=0;   
    OP=0;  
    P1_3=0;                     
    lead_high=500;  
    lead_low=500;
   
    do{  
   EA=1;
   SendIRdata();
       EA=0;  
       P1_3=0;
     delay_100ms(1);
      
  } while(1);
}
void SendIRdata()
{     
   
    endcount=lead_high;
  flag=1;  
  count=0;   
  //ET0=1;TR0 = 1;
   
  do{}while(count<endcount);  
              
    //TR0 = 0;ET0=0;
    //endcount=lead_low;
  //flag=0;  
// count=0;   
    //ET0=1;TR0 = 1;
      
  //do{}while(count<endcount);
    // TR0 =0;ET0=0;
    }
      
void timer0_int()
{         
  EA=1;
    AUXR |= 0x80;     //定时器时钟1T模式
    TMOD &=0xF0;     //设置定时器模式
    TMOD |= 0x02;     //设置定时器模式
    TL0 = 0x64;       //设置定时初值
    TH0 = 0x64;       //设置定时重载值
    TF0 = 0;      //清除TF0标志
    ET0=1;
    TR0 = 1;      //定时器0开始计时
   
}
void timeint(void) interrupt 1
{   
   
    count++;   
    if (flag==1)
     {
       OP=~OP;
         
     }
    else  
     {
        OP = 0;
        
      }
      P1_3= OP;
   
}   
void delay_100ms(int k)
{     
  int i,j;   
  for(k;k>0;k--)
{  
  for(i=0;i<150;i++)   
     {
           for(j=0;j<100;j++);
     }
    }      
        
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96682 发表于 2015-11-24 07:56 | 只看该作者
这个问题建议加入汇编程序来解决延时会更精准。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表