标题: [求助]关于一个程序的疑问?? [打印本页]

作者: magicedward    时间: 2010-8-20 10:17
标题: [求助]关于一个程序的疑问??

对以下程序,我有些不明白的地方?请教高手。

红外发射 启动 9.12ms +4.5 ms     0.565+0.56为0  0.565+1.685 为1

下面程序中断一次26us  好像算起来,时间间隔不对的???

可是,我用红外测试仪测了一下,好像又相差不大????

到底是哪里的问题???谢谢

 

 

#include <AT89X51.h>

static bit OP;        //红外发射管的亮灭

static unsigned int count;       //延时计数器

static unsigned int endcount; //终止延时计数

static unsigned char flag;      //红外发送标志

char iraddr1;  //十六位地址的第一个字节

char iraddr2;  //十六位地址的第二个字节

void SendIRdata(char p_irdata);

void delay();

void main(void)

{

  count = 0;

  flag = 0;

  OP = 0;

  P3_4 = 0;

  EA = 1; //允许CPU中断

  TMOD = 0x11; //设定时器0116位模式1

  ET0 = 1; //定时器0中断允许

 

  TH0 = 0xFF;

  TL0 = 0xE5; //设定时值038K 也就是每隔26us中断一次 

  TR0 = 1;//开始计数

  iraddr1=3;

  iraddr2=252;

 

  do{

      delay();

      SendIRdata(0x55);// 在此填入发射数据

  }while(1);

}

//定时器0中断处理

void timeint(void) interrupt 1

{

  TH0=0xFF;

  TL0=0xE5; //设定时值为38K 也就是每隔26us中断一次

  count++;

  if (flag==1)

  {

    OP=~OP;

  }

  else

  {

    OP = 0;

  }

  P3_4 = OP;

}

 

void SendIRdata(char p_irdata)

{

  int i;

  char irdata=p_irdata;

  //发送9ms的起始码

  endcount=223; // 26us中断一次,不是5.7ms????

  flag=1;

  count=0;

  do{}while(count<endcount);

  //发送4.5ms的结果码

  endcount=117;//   这里好像只有3ms

  flag=0;

  count=0;

  do{}while(count<endcount);

  //发送十六位地址的前八位

  irdata=iraddr1;

  for(i=0;i<8;i++)

  {

     //先发送0.56ms38KHZ红外波(即编码中0.56ms的低电平)

     endcount=10;  // 不是0.26ms吗?哪有0.56ms???

flag=1;

     count=0;

     do{}while(count<endcount);

//停止发送红外信号(即编码中的高电平)

     if(irdata-(irdata/2)*2)  //判断二进制数个位为1还是0

     {

       endcount=41;  //1为宽的高电平 //算到1ms    

}

    else

     {

     endcount=15;   //0为窄的高电平 //只有0.39ms    

 }

    flag=0;

    count=0;

    do{}while(count<endcount);

    irdata=irdata>>1;

  }

  //发送十六位地址的后八位

  irdata=iraddr2;

  for(i=0;i<8;i++)

  {

     endcount=10;

     flag=1;

     count=0;

     do{}while(count<endcount);

     if(irdata-(irdata/2)*2)

     {

        endcount=41;

     }

     else

     {

       endcount=15;

     }

     flag=0;

     count=0;

     do{}while(count<endcount);

     irdata=irdata>>1;

  }

  //发送八位数据

  irdata=p_irdata;

  for(i=0;i<8;i++)

  {

     endcount=10;

     flag=1;

     count=0;

     do{}while(count<endcount);

     if(irdata-(irdata/2)*2)

     {

         endcount=41;

     }

     else

     {

       endcount=15;

     }

     flag=0;

     count=0;

     do{}while(count<endcount);

     irdata=irdata>>1;

  }

  //发送八位数据的反码

  irdata=~p_irdata;

  for(i=0;i<8;i++)

  {

     endcount=10;

     flag=1;

     count=0;

     do{}while(count<endcount);

     if(irdata-(irdata/2)*2)

     {

         endcount=41;

     }

     else

     {

       endcount=15;

     }

     flag=0;

     count=0;

     do{}while(count<endcount);

     irdata=irdata>>1;

  }

  endcount=10;

  flag=1;

  count=0;

  do{}while(count<endcount);

  flag=0;

}

void delay()

{

  int i,j;

  for(i=0;i<400;i++)

  {

    for(j=0;j<100;j++)

    {

    }

  }

}

 


作者: admin    时间: 2010-8-25 14:01

是因为c语言编译的,时间要消耗的多一些所以要预留出一些时间来,才能刚好匹配红外的那个脉宽,你反汇编看一下代码就能算出准确的时间了,用12兆的晶振,可精确到1微秒






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1