找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1838|回复: 10
收起左侧

求大神解答单片机红外遥控一直接受信号停不下来的程序问题问题

[复制链接]
ID:944932 发表于 2021-12-14 18:43 | 显示全部楼层 |阅读模式
改的密码锁,红外遥控器一个按键按下之后一直会接受到这个信号,然后一直会执行这个按键的功能,本来按下1是会在1602显示一个1的,接着按下其他按键会显示其他数字,但是现在按下1之后,会一直有111111111一直往后延续
到底是红外设置的不对还是输入程序不对啊

  1. if(i<16&&num1!=14&&num1!=13)
  2.                         {
  3.         
  4.                                 passwordtemp[i]=num1;
  5.                                 LCD_Write_Char(i,1,num1+0x30
  6.                                 delay(100);

  7.                         }
  8.                 i++;





  9. //红外模块的


  10. void IR_decode() interrupt 0
  11. {
  12.         uchar j,k,count=0;
  13.   EX0 = 0;           



  14.         delayy(20);               
  15.         if (irin==1)                 
  16.   {
  17.                  EX0 =1;               
  18.                    return;        
  19.         }                                                            
  20.   while (!irin) delayy(1);
  21.         for (j=0;j<4;j++)      
  22.          {
  23.           for (k=0;k<8;k++)      
  24.           {
  25.                    while (irin)           
  26.                      delayy(1);
  27.                         while (!irin)         
  28.                      delayy(1);
  29.                      while (irin)         
  30.                       {
  31.                             delayy(1);        
  32.                             count++;         
  33.                             if (count>=30)        
  34.                                  {
  35.                                         EX0=1;               
  36.                                          return;
  37.                                 }                  
  38.                       }   
  39.                      IrValue[j]=IrValue[j] >> 1;              
  40.                      if (count>=6) {IrValue[j] = IrValue[j] | 0x80;}
  41.                      count=0;                                        //????0        
  42.           }
  43. }
  44.         if (IrValue[2]!=~IrValue[3])        
  45.          {
  46.         
  47.      EX0 = 1;                 
  48.         return;
  49. }




  50. /******************************************************************/
  51.   waimm=0;

  52.   EX0 = 1;                        

  53. }
  54. uchar hong()
  55. {
  56.         if(waimm==0)
  57.         {
  58. switch(IrValue[2])
  59. {

  60.   case 0x0c:return 1;break;//1
  61.   case 0x18:return 2;break;//2
  62.   case 0x5E:return 3;break;//3
  63.   case 0x08:return 4;break;//4

  64.   case 0x1C:return 5;break;//5                          
  65.   case 0x5A:return 6;break;//6
  66.   case 0x42:return 7;break;//7
  67.   case 0x52:return 8;break;//8

  68.   case 0x4A:return 9;break;//9
  69.   case 0x16:return 0;break;//0
  70.   case 0x44:return 10;break;//a
  71.   case 0x40:return 11;break;//b

  72.   case 0x43:return 12;break;//c
  73.   case 0x19:return 13;break;//d
  74.   case 0x0D:return 14;break;//e
  75.   case 0x07:return 15;break;//f
  76.   default:return 0xff;break;
  77. }waimm=1;
  78. }
  79.         
  80. }

复制代码

回复

使用道具 举报

ID:301191 发表于 2021-12-14 22:56 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:944932 发表于 2021-12-15 00:30 | 显示全部楼层
求大神解答啊,用矩阵键盘好好的,用红外发射信号接收的停不下来了
回复

使用道具 举报

ID:844772 发表于 2021-12-15 08:43 | 显示全部楼层
  语句 LCD_Write_Char(i,1,num1+0x30,显示的是num1,   但之前的语句是 passwordtemp[i]=num1; num1也不会变,写反了吧?
回复

使用道具 举报

ID:425825 发表于 2021-12-15 09:01 | 显示全部楼层
你发的程序不全呀
回复

使用道具 举报

ID:944932 发表于 2021-12-15 10:08 来自手机 | 显示全部楼层
glinfei 发表于 2021-12-15 08:43
语句 LCD_Write_Char(i,1,num1+0x30,显示的是num1,   但之前的语句是 passwordtemp=num1; num1也不会变 ...

num1是在之前的程序的过去到了一个键值,现在它是红外接受信号只要接受到了这个信号会一直存在,该咋办啊
回复

使用道具 举报

ID:811729 发表于 2021-12-15 12:24 | 显示全部楼层
首先不知道你的num1在哪赋值的,貌似红外中断里没有。。
其次。。别这样写程序。。。if(i<16&&num1!=14&&num1!=13) 你这你自己看的懂吗?
if(i<16)
{
     if(num1 != 14)
     {
           if(num1 != 13)
          {
               // do your work
          }
     }
} 程序写明白,注释一下,完整点发上来。
回复

使用道具 举报

ID:944932 发表于 2021-12-15 13:53 | 显示全部楼层
love_ourlife 发表于 2021-12-15 12:24
首先不知道你的num1在哪赋值的,貌似红外中断里没有。。
其次。。别这样写程序。。。if(i

就以部分显示来说吧,我的思路是这样的,如果我在遥控器按下一个键,通过键值解析来实现具体功能,现在按下一个按键之后,一直在循环这个按键的处理程序


uchar code password[]={1,2,3,4,5,6,7,8};
sbit led1=P2^0;
sbit led2=P2^1;
sbit dz=P1^5;
sbit moto=P1^0;
sbit IRIN = P3^2;
unsigned char irok;  
unsigned char IrValue[6];
unsigned char Time;这是主程序里的
        while(1)
        {
                 
                //num=Keyvalue
                switch(IrValue[2])  //  通过红外键值来给s赋值,b暂时没有用
          {
                       
                case 0x16: b=0;s=0;break;
                case 0x0c: b=1;s=1;break;
                case 0x18: b=2;s=2;break;
                case 0x5e: b=3;s=3;break;
                case 0x08: b=4;s=4;break;
                case 0x1c: b=5;s=5;break;
                case 0x5a: b=6;s=6;break;
                case 0x42: b=7;s=7;break;
                case 0x52: b=8;s=8;break;
                case 0x4a: b=9;s=9;break;
                       
                case 0x07: b=15;s=15;break;
                case 0x19: b=14;s=14;break;
                case 0x0d: b=13;s=13;break;                       
//        default:h=1;s=0xff;;break;
          }
               
                  //       
       
                {

                            num=s;
//将s在赋值给num,通过判断num的数字来实现具体功能
               
if(i<16&&num!=14&&num!=15)//如果输入的数字小于16并且14和15按键都没有按下
                        {
                                passwordtemp=num;//将num得到的数字放进密码缓存
                                 
                                LCD_Write_Char(i,1,num+0x30);//在1602显示
                       
                                delay(100);
                               
                        }
                        i++;
                       
                                                                               
                }

//红外初始化接收
void IrInit()
{
        IT0=1
        EX0=1
        EA=1;

        IRIN=1;
}



红外数值读取的中断函数,
void ReadIr() //interrupt 0
{
        unsigned char j,k;
        unsigned int err;
        Time=0;                                         
        DelayMs(70);

        if(IRIN==0)        确认是否接收到正确的信号
        {         
               
                err=1000;               
                while((IRIN==0)&&(err>0))          //等待前面9ms低电平过去       
                {                       
                        DelayMs(1);
                        err--;
                }
                if(IRIN==1)        //如果正确等到9ms低电平过去
                {
                        err=500;
                        while((IRIN==1)&&(err>0))        //等待4.5ms起始高电平过去
                        {
                                DelayMs(1);
                                err--;
                        }
                        for(k=0;k<4;k++)//共4组数据
                        {                               
                                for(j=0;j<8;j++)  //接收一组数据
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0)//等待信号前面的560us过去
//                                        while (!IRIN)
                                        {
                                                DelayMs(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))   //计算高电平时间长度
                                        {
                                                DelayMs(1);//0.14ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        EX0=1;
                                                        return;
                                                }
                                        }
                                        IrValue[k]>>=1;   //k表示第几组数据
                                        if(Time>=8)                //如果高电平出现大于565us,是1
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                //用完时间重新赋值                                       
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }                       
}




回复

使用道具 举报

ID:624769 发表于 2021-12-15 23:14 | 显示全部楼层
        if(IRIN==0)        确认是否接收到正确的信号
回复

使用道具 举报

ID:624769 发表于 2021-12-15 23:15 | 显示全部楼层
        if(IRIN==0)        确认是否接收到正确的信号
只要你 没有 IRIN = 1;  就会不停的处理。
你要他停止处理, 就找个适当的地方  IRIN = 1
回复

使用道具 举报

ID:843335 发表于 2021-12-16 16:39 | 显示全部楼层
switch(IrValue[2])你这里不清空键值那当然一直循环这一个键值啊,用完一次就把他清0就行了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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