一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 2707|回复: 10

[其他综合] 求助 红外遥控问题

[复制链接]
发表于 2013-5-12 17:37 | 显示全部楼层 |阅读模式
自己研究红外就是研究不懂在网上找了一些资料,自己拼凑的程序,出问题了,编译通过,就是按遥控和按按键 效果不一样啊!按 按键  ----亮---延时---灭  、按遥控 一直亮
小白求助
程序在下面
/******************************************************************************************/
                                                                                     分割线
/*******************************************************************************************/

#include<STC12C5A60S2.h>       //包含单片机寄存器的头文件
sbit IR=P3^2;           //将IR位定义为P3.2引脚
unsigned char a[4];    //储存用户码、用户反码与键数据码、键数据反码
unsigned int LowTime,HighTime; //储存高、低电平的宽度
sbit KEY1=P1^3;      //将Relay位定义为P1.3引脚
sbit LED=P1^0;      //将Relay位定义为P1.3引脚


/*********************************************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){

unsigned int i;

while( a-- != 0){

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

}
}
/*********************************************************************************************/
/************************************************************


/************************************************************
函数功能:主函数
*************************************************************/
void main()
{


EA=1;        //开启总中断
   EX0=1;       //开外中断0
   ET0=1;       //定时器T0中断允许
   IT0=1;       //外中断的下降沿触发  

TMOD=0x01;   //使用定时器T0的模式1

TR0=0;       //定时器T0关闭

while(1){

if(KEY1==0||a[2]==0x45)

{





LED=0;

DELAY_MS (1000);

LED=1;

}


}    //等待红外信号产生的中断


}
/************************************************************
函数功能:红外线触发的外中断处理函数
*************************************************************/
void Int0(void) interrupt 0 using 0
  {
   unsigned char  i,j;

unsigned char temp;    //储存解码出的数据
     EX0=0;      //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号

  TH0=0;      //定时器T0的高8位清0

  TL0=0;      //定时器T0的低8位清0

  TR0=1;
    //开启定时器T0


  while(IR==0)          //如果是低电平就等待,给引导码低电平计时

       ;     

  TR0=0;                //关闭定时器T0     

  LowTime=TH0*256+TL0;  //保存低电平时间

  TH0=0;      //定时器T0的高8位清0

  TL0=0;      //定时器T0的低8位清0

  TR0=1;
    //开启定时器T0

  while(IR==1)  //如果是高电平就等待,给引导码高电平计时

    ;

  TR0=0;        //关闭定时器T0

  HighTime=TH0*256+TL0;
//保存引导码的高电平长度
     if((LowTime>8500)&&(LowTime<9500)&&(HighTime>3600)&&(HighTime<4700))

{

  for(i=0;i<4;i++)      //连续读取4个用户码和键数据码

  
{

for(j=0;j<8;j++)  //每个码有8位数字

{

         temp=temp>>1;  //temp中的各数据位右移一位,因为先读出的是高位数据


   TH0=0;         //定时器清0

   TL0=0;         //定时器清0

   TR0=1;         //开启定时器T0

      while(IR==0)   //如果是低电平就等待

               ;
      //低电平计时

  
   TR0=0;         //关闭定时器T0

   LowTime=TH0*256+TL0;    //保存低电平宽度

   TH0=0;         //定时器清0

   TL0=0;         //定时器清0

   TR0=1;         //开启定时器T0

   while(IR==1)   //如果是高电平就等待

       ;
   

   TR0=0;        //关闭定时器T0

   HighTime=TH0*256+TL0;   //保存高电平宽度

   if((LowTime<370)||(LowTime>640))

  
    return;        //如果低电平长度不在合理范围,则认为出错,停止解码


   if((HighTime>420)&&(HighTime<620))   //如果高电平时间在560微秒左右,即计数560/1.085=516次

           temp=temp&0x7f;       //(520-100=420, 520+100=620),则该位是0

   if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次

           temp=temp|0x80;       //(1550-250=1300,1550+250=1800),则该位是1

     }  
            

   a=temp;
//将解码出的字节值储存在a

    }






if (a[2]!=~a[3])   //接收时间是否正确
    {
      EX0=1;
      return;
    }









  }






}

发表于 2013-5-12 19:30 | 显示全部楼层
两个问题,一,你的LED应该是设计为低电平亮是吧?你按遥控器后是由灭变亮后一直保持亮?
          二,遥控值为45,你确定是这个值?
回复

使用道具 举报

发表于 2013-5-12 19:31 | 显示全部楼层
输出debug信息,观看解码结果
debug输出可以用串口也可以用lcd,哪个方便用哪个
回复

使用道具 举报

 楼主| 发表于 2013-5-12 20:01 | 显示全部楼层
dianzichina 发表于 2013-5-12 19:30 static/image/common/back.gif
两个问题,一,你的LED应该是设计为低电平亮是吧?你按遥控器后是由灭变亮后一直保持亮?
          二,遥 ...

LED为低电平亮
遥控按键是0x45
按下遥控以后一直亮,按物理按键很正常
https://www.yleee.com.cn/forum.php?mod=image&aid=148524&size=300x300&key=435d51c388bcf22c&nocache=yes&type=fixnone
00FF(HA-2)NEC编码方式_旋转.bmp
回复

使用道具 举报

 楼主| 发表于 2013-5-12 20:02 | 显示全部楼层
文句子 发表于 2013-5-12 19:31 static/image/common/back.gif
输出debug信息,观看解码结果
debug输出可以用串口也可以用lcd,哪个方便用哪个

不会debug
刚接触单片机
回复

使用道具 举报

发表于 2013-5-12 22:28 | 显示全部楼层
f593651917 发表于 2013-5-12 20:01 static/image/common/back.gif
LED为低电平亮
遥控按键是0x45
按下遥控以后一直亮,按物理按键很正常

你的实验现象给出太少。比如在遥控过后,LED一直亮的情况下,物理按键是否还正常?
回复

使用道具 举报

 楼主| 发表于 2013-5-12 22:54 | 显示全部楼层
dianzichina 发表于 2013-5-12 22:28 static/image/common/back.gif
你的实验现象给出太少。比如在遥控过后,LED一直亮的情况下,物理按键是否还正常?

物理按键不正常了
回复

使用道具 举报

发表于 2013-5-13 10:26 | 显示全部楼层
while(1){
if(KEY1==0||a[2]==0x45)
{
LED=0;
DELAY_MS (1000);
LED=1;
}
这里是你的主程序循环部分,物理按键正常,说明程序在这里运行,一按红外,LED亮后,再按物理按键,程序没反映,说明主程序不在这里了。也就是说经过红外后,程序跑飞。。。。。
回复

使用道具 举报

 楼主| 发表于 2013-5-13 18:15 | 显示全部楼层
dianzichina 发表于 2013-5-13 10:26 static/image/common/back.gif
while(1){
if(KEY1==0||a[2]==0x45)
{

该怎么修改呢
回复

使用道具 举报

 楼主| 发表于 2013-5-13 18:24 | 显示全部楼层
我是想弄个红外遥控程序控制个电子钟,怎么就弄不好呢
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-1 08:12 , Processed in 0.043607 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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