17835|11

22

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

C51 做自学习红外空调遥控器 解码发射问题。 [复制链接]

老师叫我这几天做自学习红外遥控器,目前以美的空调遥控器为例。查阅过资料说空调遥控器码和普通电视遥控器 码不同。我用示波器看了下 我的这款美的空调遥控器的码 是  先4MS高电平和4MS低电平引导码,然后是用户码和数据码 然后再是5MS间隔码 接下 来再重复引导码 用户码和数据码。
我解码 能解码,发射也能发 在示波器上看基本波形也是模仿出来了,可是对着空调的时候按键按下 没反应。有做过的或懂的高手解答下。谢啦!
附程序:
/*******************************************************************/


/*******************************************************************/
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit studylamp = P2^4;          //学习状态指示灯
sbit sendlamp  = P2^5;          //发射状态指示灯
sbit remotein  = P3^4;          //遥控信号输入口
sbit remoteout = P3^5;          //遥控输出口
sbit studykey  = P2^0;          //学习键
sbit sendkey   = P2^1;          //发射键
uint i,j,m = 400,n,k,s;
uchar idata remotedata[206];    //存脉冲宽度数据
uint head1,head2;                      //存起始位
uint remdata;
uint KEY1NUM;

/**********1MS Delay**********/
void delay1ms(uint t)
{
  for(i = 0; i < t; i++)
    for(j = 0;j < 120; j++);
}

/**********INIT FUNCTION**********/
void Init_clear()
{
  P0 = 0x00;
  studylamp = 0;                 //关学习灯
  sendlamp  = 0;                 //关发射灯
  remoteout = 1;                 //关遥控输出
  remotein  = 1;                 //
  for(i = 0;i < 206;i++)         //清内存
  {remotedata = 0x00;}
  IE = 0x00;
  IP = 0x01;
  TMOD = 0x20;                   //8位自动重装模式
  PCON = 0x00;
  TH1  = 0x0f3;  //38KHZ初值
  TL1  = 0x0f3;
  //IT0  = 1;
  EX0  = 1;                      //INT0中断允许
  EA   = 1;                      //开总中断
    P0 = 0x00;
  studylamp = 1;                 //关学习灯
  sendlamp  = 1;                 //关发射灯
  }

/**********KEY FUNCTION**********/
void keywork()
{
  if(sendkey == 0)
  {
    while(sendkey == 0);     //等待键释放
ET1 = 1;
TR1 = 1;                 //发起始位
for(i = head1;i > 0;i--)
{;}
remoteout = 1;
ET1 = 0; 
TR1 = 0;
for(i = head2;i > 0;i--)
{
  _nop_();_nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
}
n = 0;
while(1)
{
  if(remotedata[n] == 0x00)
  {
    delay1ms(10);break;                             //数据为0结束
  }
  ET1 = 1;TR1 = 1;                                  //奇地址发调制脉冲
  for(i = remotedata[n];i > 0;i--)
  {;}
  remoteout = 1;ET1 = 0;TR1 = 0;n++; 
  for(i = remotedata[n];i > 0;i--)
  {
    _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
  }
  P0 = 0x00;sendlamp = ~sendlamp; n++;              //偶地址不发脉冲

 }
   }  
}      

/**********Study Function**********/
//
void study()
{
  ET1 = 0;TR1 = 0;EA = 0;//EX0 = 0;
  head1 = 0;head2 = 0;
  P0 = 0x00;
  studylamp = 0;
  sendlamp  = 1;
  while(studykey == 0);          //等待键释放
  while(remotein == 1);          //等待遥控码输入
  head1 = 0;head2 = 0;           //读入起始位
  while(remotein == 0)
  {
    _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
head1++;
  }
  while(remotein == 1)
  {
    _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
head2++;
  }
  n = 0;
  remdata = 0x0000;
  while(1)
  {
    while(remotein == 0)
{
  _nop_();_nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();
  remdata++;
}

remotedata[n] = remdata;  //存高电平脉宽数据
n++;                              
remdata = 0x0000;            //脉宽计数器清零
while(remotein == 1)
{
  _nop_();_nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();
  remdata++;  //低电平计数
if(remdata > m)              //High TTL>5MS Exit 
{
  remotedata[n] = 0x00;EA = 1;goto end;//EX0 = 1;
}
}

remotedata[n] = remdata;
n++;
remdata = 0x0000;            //存低电平脉宽数据
}
end:P0 = 0x00;sendlamp = 1;studylamp = 1;
}

void Key_Scan()
{
  if(studykey == 0)
  {
    KEY1NUM++;
    if(KEY1NUM >= 30)
    {
      KEY1NUM = 0;
  study();
    }
  }
}               

void main()
{
  Init_clear();
  while(1)
  {
    keywork();
Key_Scan();
  }
}

/**********38KHZ**********/
//定时中断T1
void time_intt1(void)interrupt 3
{
  remoteout = ~remoteout;
}
此帖出自51单片机论坛

最新回复

能说一下是怎么改的吗?给个思路也行  详情 回复 发表于 2017-5-4 00:08
点赞 关注
 

回复
举报

22

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
呵呵 刚又调试了下 行了  主要是时间宽度没有给好。
此帖出自51单片机论坛

点评

keywork();P0 = 0x00;sendlamp = ~sendlamp; n++; //偶地址不发脉冲 怎么理解 为什么要赋值给po口  详情 回复 发表于 2012-7-25 10:09

赞赏

1

查看全部赞赏

 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

那具体是怎样改的?我也遇到这问题,求最终代码

此帖出自51单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

4
 
同求源码
此帖出自51单片机论坛
 
 
 

回复

547

帖子

0

TA的资源

纯净的硅(初级)

5
 
那具体是怎样改的?我也遇到这问题,求最终代码
我也是、、、
此帖出自51单片机论坛
 
个人签名嵌入式培训www.51great.org
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

6
 
学习下
此帖出自51单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 沙发 米兰的小工匠 的帖子

keywork();P0 = 0x00;sendlamp = ~sendlamp; n++;              //偶地址不发脉冲
怎么理解
为什么要赋值给po口
此帖出自51单片机论坛
 
 
 

回复

30

帖子

0

TA的资源

一粒金砂(初级)

8
 
学习下
此帖出自51单片机论坛
 
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

9
 
程序怎样改呢谁能指导
此帖出自51单片机论坛
 
个人签名JUN
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

10
 
QQ2537087503
此帖出自51单片机论坛
 
个人签名JUN
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
我想知道怎么通过示波器看他的波形
此帖出自51单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

12
 
能说一下是怎么改的吗?给个思路也行
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表