找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[求助]关于一个程序的疑问??

[复制链接]
跳转到指定楼层
楼主
ID:25357 发表于 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++)

    {

    }

  }

}

 

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

使用道具 举报

沙发
ID:1 发表于 2010-8-25 14:01 | 只看该作者

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

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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