找回密码
 立即注册

QQ登录

只需一步,快速开始

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

红外发送失败

[复制链接]
跳转到指定楼层
楼主
ID:277539 发表于 2018-7-7 22:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
static u16 count;       //延时计数器
static u16 endcount; //终止延时计数
static u8 flag;      //红外发送标志
sbit  P1_0=P1^0;//红外发射管的亮灭控制位
u8 iraddr;  //地址码
void SendIRdata(u8 p_irdata);//发送子函数
void delay();
void main(void)
{
  count = 0;
  flag = 0;       //无载波
  P1_0 = 1;       //不亮
  EA = 1; //允许CPU中断
  TMOD = 0x10; //设定时器0和1为16位模式1
  ET1 = 1; //定时器0中断允许
  TH1 = 0xFF;
  TL1 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
  TR1 = 1;//开始计数
  iraddr=0;//自定义的一个地址
  do{
      delay();
      SendIRdata(0x45);
  }while(1);
}

void timeint(void) interrupt 3//定时器1中断处理
{
  TH1=0xFF;//载入初值
  TL1=0xE6; //设定时值为38K 也就是每隔26us中断一次
  count++;
  if (flag==1)//如果是待发送的有效数据flag=1,就在此产生载波(亮灭交变)
  {
                P1_0=!P1_0;
        }
  else
  {
                P1_0 = 0
        }
}
void SendIRdata(u8 p_irdata)   
{
  u8 i;                                                                                               
  u8 irdata=p_irdata;
  //发送9ms的起始码,并是载波模式有效
  endcount=223;
  flag=1;
  count=0;
  while(count<endcount);//等待中断,控制亮灭交变的总时间为9ms
  //发送4.5ms的结果码,并是载波模式无效
  endcount=117;
  flag=0;
  count=0;
  do
        {
               
        }while(count<endcount);

  //发送十六位地址的前八位
  irdata=~iraddr;
  for(i=0;i<8;i++)
  {//一个周期里规定先以高电平开始,在以低电平结束。先发送0.56ms的38KHZ“1”的红外波(即编码中0.56ms的高电平)
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);
//停止发送红外信号(即编码中的低电平)
   if(irdata&0x01)  //判断二进制数个位为1还是0
   {
                endcount=41;
         }  //1为宽的高电平1.68ms
   else
         {
                endcount=15;
         }  //0为窄的高电平0.56ms
    flag=0;
    count=0;
    while(count<endcount);
    irdata=irdata>>1;//依次取位
  }
  //发送十六位地址的后八位
  irdata=iraddr;    //此处已经是地址的反码
  for(i=0;i<8;i++)
  {
     endcount=10;
     flag=1;
     count=0;
     while(count<endcount);
     if(irdata&0x01)
     {
                        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;
     while(count<endcount);
     if(irdata&0x01)
     {
                        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;
     while(count<endcount);
     if(irdata&0x01)
     {
                        endcount=41;
                 }
     else
     {
                        endcount=15;
                 }
     flag=0;
     count=0;
     while(count<endcount);
     irdata=irdata>>1;
  }
  endcount=10;
  flag=1;
  count=0;
  do{}while(count<endcount);
  flag=0;
}
void delay()
{
  u16 i;
  u8 j;
  for(i=0;i<400;i++)
    for(j=0;j<100;j++);
}

不知道·哪里出问题了

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

使用道具 举报

沙发
ID:367189 发表于 2018-7-8 10:06 | 只看该作者
看下你的 第四行,,是否逻辑有问题,

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:313084 发表于 2018-7-8 11:21 | 只看该作者
我有过经验的,delay函数尽量少用,会与定时器有冲突

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:367252 发表于 2018-7-8 12:14 | 只看该作者
38K频率不对,时间长度需耐心调整。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:367285 发表于 2018-7-8 13:39 | 只看该作者
应该是频率发送与接收不对应

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:367378 发表于 2018-7-8 16:21 | 只看该作者
估计38kHz的频率不合适
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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