找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教:红外线遥控如何设置可以实现刚通电时所有LED均是熄灭(低电平)?

[复制链接]
跳转到指定楼层
楼主
在网上找到的红外接遥控程序改编,计划实现功能:K1,K2 “开”与“关”,K3 以后是“点动”。
但问题:刚通电后所有LED均是亮(高电平),K1按一次后(K2还要再按一次)K3以下的LED才熄灭,以后不断电,才正常工作。不是很符合一般的情况。现在想:如何设置程序可以符合刚通电后所有LED均是熄灭(低电平)?谢谢!

红外接遥控LED程序:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
void delay(uchar x);  //x*0.14MS
void delay1(int ms);
void beep();
sbit IRIN = P3^3;         //红外接收器数据线
sbit K1=P1^0;                  //LED输出线
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;



uchar IRCOM[7];
uchar t1,t2;


main()
{
    IE = 0x84;                 //允许总中断中断,使能 INT1 外部中断
    TCON = 0x10;               //触发方式为脉冲负边沿触发
   IRIN=1;                    //I/O口初始化
  // delay1(10);                 //延时

    while(1)        ;

} //end main
/**********************************************************/
void IR_IN() interrupt 2 using 0
{
  unsigned char j,k,N=0;
     EX1 = 0;   
         delay(15);
         if (IRIN==1)
     { EX1 =1;
           return;
          }
                           //确认IR信号出现
  while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
    {delay(1);}

for (j=0;j<4;j++)         //收集四组数据
{
  for (k=0;k<8;k++)        //每组数据有8位
  {
   while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
     {delay(1);}
    while (!IRIN)          //等 IR 变为高电平
     {delay(1);}
     while (IRIN)           //计算IR高电平时长
      {
    delay(1);
    N++;           
    if (N>=30)
         { EX1=1;
         return;}                  //0.14ms计数过长自动离开。
      }                        //高电平计数完毕               
     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
     N=0;
  }
}

   if (IRCOM[2]!=~IRCOM[3])
   { EX1=1;
     return; }

   IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
   IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
  // IRCOM[5]=IRCOM[5]+0x30;
//  IRCOM[6]=IRCOM[6]+0x30;

if(IRCOM[5]>9)
    { IRCOM[5]=IRCOM[5]+0x37;}
   else
          IRCOM[5]=IRCOM[5]+0x30;

   if(IRCOM[6]>9)
    { IRCOM[6]=IRCOM[6]+0x37;}
   else
          IRCOM[6]=IRCOM[6]+0x30;
          t1=IRCOM[6];
          t2=IRCOM[5];
          //switch(t1,t2)
//  {
//          case '4','5': BEEP=~BEEP; break;
//          case '4','6': BEEP=1; break;
//          default: break;
//          }



// 开、关 键码:
if(IRCOM[6]=='1'&&IRCOM[5]=='2')
K1=!K1;                                   //“开关”功能

// 静音 键码:
if(IRCOM[6]=='5'&&IRCOM[5]=='E')
K2=!K2;


//OK 键码:
if(IRCOM[6]=='1'&&IRCOM[5]=='8')         //“点动”功能。          
K3=1;
delay(1000);
K3=0 ;

// V-(声音-) 键码:
if(IRCOM[6]=='5'&&IRCOM[5]=='F')
    K4=1;
    delay(1000);
    K4=0 ;

// V+(声音+) 键码:
if(IRCOM[6]=='5'&&IRCOM[5]=='B')
    K5=1;
    delay(1000);
    K5=0 ;

//P+(频道+) 键码:
if(IRCOM[6]=='5'&&IRCOM[5]=='5')
    K6=1;
    delay(1000);
    K6=0 ;

//P-(频道-) 键码:
if(IRCOM[6]=='5'&&IRCOM[5]=='A')
    K7=1;
    delay(1000);
    K7=0 ;



  EX1 = 1;                        
}                  

/**********************************************************/
void delay(unsigned char x)    //x*0.14MS
{
unsigned char i;
  while(x--)
{
  for (i = 0; i<13; i++) {}
}
}

/**********************************************************/
void delay1(int ms)
{
unsigned char y;
  while(ms--)
{
  for(y = 0; y<250; y++)
  {
   _nop_();
//   _nop_();
//   _nop_();
//   _nop_();
  }
}
}

电路图:


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

使用道具 举报

沙发
ID:168431 发表于 2017-3-6 14:04 | 只看该作者
楼主是高手啊  程序编的6
回复

使用道具 举报

板凳
ID:167337 发表于 2017-3-6 14:37 | 只看该作者
对不起,原程序输出21路,没打算完全使用,只用5-7路就可以了,由于我的疏漏,程序中K6,K7路没有删除!请删除K6,K7语句部分。补充电路图:
回复

使用道具 举报

地板
ID:151348 发表于 2017-3-6 14:37 | 只看该作者
通电后所有LED均是熄灭(低电平)?那就在初始化的时候加上P1=0x00;
回复

使用道具 举报

5#
ID:167337 发表于 2017-3-6 14:43 | 只看该作者
现在程序及电路:是通电后所有LED均是亮的(高电平)。希望改进程序,要求是相反!
回复

使用道具 举报

6#
ID:167337 发表于 2017-3-6 14:55 | 只看该作者
@imxuheng,本人不是太熟悉C,只能依葫芦画瓢,能更清楚说如何加上P1=0x00;吗?谢谢
回复

使用道具 举报

7#
ID:167337 发表于 2017-3-6 15:20 | 只看该作者
@imxuheng,本人不是太熟悉C,只能依葫芦画瓢,能否更清楚说如何加上:P1=0x00;吗?谢谢!
回复

使用道具 举报

8#
ID:151348 发表于 2017-3-6 19:37 | 只看该作者
YQS 发表于 2017-3-6 15:20
@imxuheng,本人不是太熟悉C,只能依葫芦画瓢,能否更清楚说如何加上:P1=0x00;吗?谢谢!

main()
{
   IE = 0x84;                 //允许总中断中断,使能 INT1 外部中断
   TCON = 0x10;               //触发方式为脉冲负边沿触发
   IRIN=1;                    //I/O口初始化
  // delay1(10);                 //延时
    P1=0x00;
    while(1)        ;

}
回复

使用道具 举报

9#
ID:7485 发表于 2017-3-6 20:22 | 只看该作者
进入主程序的第一条指令就应该是 P1=0xE0;或 P1=0x00;
回复

使用道具 举报

10#
ID:104825 发表于 2017-3-6 21:56 | 只看该作者
把发光二极管都反过来接,然后将公共端接到vcc试试看!
回复

使用道具 举报

11#
ID:167337 发表于 2017-3-7 08:39 | 只看该作者
哦,问题解决了!
原来单片机外围电路设计的时候,为了不让外围电路误动作,一般把外围电路设置成单片机IO口低电平的时候 尽心动作,点亮

LEd灯的时候应该是负电平有效,我现在的电路是正电平有效,自然就是费事了。好,将:供LED电源、LED极性反转,程序中相应

判断语句极性也反转,OK,一切正常。
看来只能自己基础不精哦!

谢谢s1g、mahshmj等指点!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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