找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机红外线调光控制台灯问题求助

[复制链接]
跳转到指定楼层
楼主
ID:99548 发表于 2018-1-1 21:32 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好。最近准备试做一个台灯。红外线和按钮同时控制调光的。红外线采用查询into后计时的方式解码。程序编完后只用遥控可以,只用按键控制也可以。但如果用遥控后,再用按键就不行了,不知为什么?求高手指教。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:151348 发表于 2018-1-2 19:58 | 只看该作者
应该不是电路问题,程序贴上来看看
回复

使用道具 举报

板凳
ID:123289 发表于 2018-1-2 20:34 | 只看该作者
是你的扫键程序与查询into的构思不好。程序执行的时间按排不妥当。
记住:单片机的软件(CPU)在任何时间刻只能做一件事。
你合理的规划一下,千万不要让程序做一不做二,要以最短的时间轮流进行扫键与处理红外事件。
不能查键就顾不上红外,处理红外又顾不上查键。
提示:全部用中断来做。用单片机中的硬件资源代替软件的硬等待。
回复

使用道具 举报

地板
ID:164602 发表于 2018-1-3 08:26 | 只看该作者
yzwzfyz 发表于 2018-1-2 20:34
是你的扫键程序与查询into的构思不好。程序执行的时间按排不妥当。
记住:单片机的软件(CPU)在任何时间 ...

讲得好!
其实,红外用中断就好了,查键随时查。
中断的作用,就是对付不知道什么时候出现红外信号这种突发事件。多件事儿都想适时执行,就只有用中断系统。
回复

使用道具 举报

5#
ID:99548 发表于 2018-1-3 15:03 来自手机 | 只看该作者
yzwzfyz 发表于 2018-1-2 20:34
是你的扫键程序与查询into的构思不好。程序执行的时间按排不妥当。
记住:单片机的软件(CPU)在任何时间 ...

好的。谢谢!
回复

使用道具 举报

6#
ID:99548 发表于 2018-1-3 21:32 | 只看该作者
yzwzfyz 发表于 2018-1-2 20:34
是你的扫键程序与查询into的构思不好。程序执行的时间按排不妥当。
记住:单片机的软件(CPU)在任何时间 ...
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit K1=P3^6;
  5. sbit K2=P3^7;
  6. sbit JD1=P1^0;
  7. sbit JD2=P1^1;
  8. sbit JD3=P1^2;
  9. sbit IR=P3^2;


  10. bit kg;

  11. uchar kval;

  12. uchar a[4];
  13. uint lowtime,hightime;

  14. bit decode(void)
  15. {
  16.     uchar i,j;
  17.         uchar temp;
  18.         for(i=0;i<4;i++)
  19.         {
  20.           for(j=0;j<8;j++)
  21.            {
  22.              temp=temp>>1;
  23.                  TH0=0;
  24.                  TL0=0;
  25.                  TR0=1;
  26.                  while(IR==0);
  27.                  TR0=0;
  28.                  lowtime=TH0*256+TL0;
  29.                  TH0=0;
  30.                  TL0=0;
  31.                  TR0=1;
  32.                  while(IR==1);
  33.                  TR0=0;
  34.                  hightime=TH0*256+TL0;
  35.                  if((lowtime<370)||(lowtime>640))
  36.                  return 0;
  37.                  if((hightime>420)&&(hightime<620))
  38.                  temp=temp&0x7f;
  39.                  if((hightime>1300)&&(hightime<1800))
  40.                  temp=temp|0x80;
  41.                 }
  42.                 a[i]=temp;
  43.         }
  44.         if(a[2]=~a[3])
  45.         {
  46.         return 1;
  47.         }
  48. }

  49. void int0(void) interrupt 0
  50. {
  51.   EX0=0;
  52.   TH0=0;
  53.   TL0=0;
  54.   TR0=1;
  55.   while(IR==0);
  56.   TR0=0;
  57.   lowtime=TH0*256+TL0;
  58.   TH0=0;
  59.   TL0=0;
  60.   TR0=1;
  61.   while(IR==1);
  62.   TR0=0;
  63.   hightime=TH0*256+TL0;
  64.   if((lowtime>7800)&&(lowtime<8800)&&(hightime>3600)&&(hightime<4700))
  65.    {
  66.       if(decode()==1)
  67.           {
  68.            if(a[2]==0x0c)
  69.              {
  70.             JD1=0;JD2=1;JD3=1;
  71.                 }
  72.            if(a[2]==0x18)
  73.            {
  74.             JD1=0;JD2=0;JD3=1;
  75.                 }
  76.            if(a[2]==0x5e)
  77.            {
  78.             JD1=0;JD2=0;JD3=0;
  79.                 }
  80.            }
  81.         }
  82.         EX0=1;
  83. }


  84. delay()
  85. {
  86. uchar n,m;
  87. for(n=0;n<200;n++)
  88. for(m=0;m<100;m++);
  89. }

  90. void timeint() interrupt 3
  91. {
  92.   TR1=0;
  93.   if(K1==0)
  94.     {
  95.          delay();
  96.           if(K1==0)
  97.           {
  98.            JD1=0;JD2=1;JD3=1;
  99.            }
  100.         }
  101.    if(K2==0)
  102.      {
  103.           delay();
  104.            if(K2==0)
  105.            {
  106.             JD1=0;JD2=0;JD3=1;
  107.                 }
  108.          }
  109.    TH1=0X00;
  110.    TL1=0XDC;
  111.    TR1=1;
  112.    }


  113. void main()
  114. {
  115. EA=1;
  116. EX0=1;
  117. ET0=1;
  118. ET1=1;
  119. IT0=1;
  120. TMOD=0X01;
  121. TR0=0;
  122. TH1=0X00;
  123. TL1=0XDC;
  124. TR1=1;
  125. while(1);
  126. }
复制代码
回复

使用道具 举报

7#
ID:99548 发表于 2018-1-3 21:32 | 只看该作者
yzwzfyz 发表于 2018-1-2 20:34
是你的扫键程序与查询into的构思不好。程序执行的时间按排不妥当。
记住:单片机的软件(CPU)在任何时间 ...

刚才是我程序的源代码,麻烦您给看看
回复

使用道具 举报

8#
ID:99548 发表于 2018-1-3 21:34 | 只看该作者
想用红外线遥控和按钮同时控制继电器,但按如下程序如果单独用遥控没问题,单独用按钮也没问题,但不能同时使用,不知为什么?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit K1=P3^6;
sbit K2=P3^7;
sbit JD1=P1^0;
sbit JD2=P1^1;
sbit JD3=P1^2;
sbit IR=P3^2;


bit kg;

uchar kval;

uchar a[4];
uint lowtime,hightime;

bit decode(void)
{
    uchar i,j;
        uchar temp;
        for(i=0;i<4;i++)
        {
          for(j=0;j<8;j++)
           {
             temp=temp>>1;
                 TH0=0;
                 TL0=0;
                 TR0=1;
                 while(IR==0);
                 TR0=0;
                 lowtime=TH0*256+TL0;
                 TH0=0;
                 TL0=0;
                 TR0=1;
                 while(IR==1);
                 TR0=0;
                 hightime=TH0*256+TL0;
                 if((lowtime<370)||(lowtime>640))
                 return 0;
                 if((hightime>420)&&(hightime<620))
                 temp=temp&0x7f;
                 if((hightime>1300)&&(hightime<1800))
                 temp=temp|0x80;
                }
                a[i]=temp;
        }
        if(a[2]=~a[3])
        {
        return 1;
        }
}

void int0(void) interrupt 0
{
  EX0=0;
  TH0=0;
  TL0=0;
  TR0=1;
  while(IR==0);
  TR0=0;
  lowtime=TH0*256+TL0;
  TH0=0;
  TL0=0;
  TR0=1;
  while(IR==1);
  TR0=0;
  hightime=TH0*256+TL0;
  if((lowtime>7800)&&(lowtime<8800)&&(hightime>3600)&&(hightime<4700))
   {
      if(decode()==1)
          {
           if(a[2]==0x0c)
             {
            JD1=0;JD2=1;JD3=1;
                }
           if(a[2]==0x18)
           {
            JD1=0;JD2=0;JD3=1;
                }
           if(a[2]==0x5e)
           {
            JD1=0;JD2=0;JD3=0;
                }
           }
        }
        EX0=1;
}


delay()
{
uchar n,m;
for(n=0;n<200;n++)
for(m=0;m<100;m++);
}

void timeint() interrupt 3
{
  TR1=0;
  if(K1==0)
    {
         delay();
          if(K1==0)
          {
           JD1=0;JD2=1;JD3=1;
           }
        }
   if(K2==0)
     {
          delay();
           if(K2==0)
           {
            JD1=0;JD2=0;JD3=1;
                }
         }
   TH1=0X00;
   TL1=0XDC;
   TR1=1;
   }


void main()
{
EA=1;
EX0=1;
ET0=1;
ET1=1;
IT0=1;
TMOD=0X01;
TR0=0;
TH1=0X00;
TL1=0XDC;
TR1=1;
while(1);
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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