找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 374|回复: 6
收起左侧

求指导,单片机红外遥控实现LED闪烁程序及PWM调光

[复制链接]
574402413 发表于 2020-8-26 15:13 | 显示全部楼层 |阅读模式
求指导,想要实现按键4按下LED4延时0.5秒闪烁,按其他键或者再按一下熄灭;按键2按下LED2稍暗,按其他键或者再按一下熄灭,按键3按下LED2稍亮,按其他键或者再按一下熄灭,程序应该怎么修改呢?程序及按键编码值如下:按键编码值:
按键1:00-FF-0C-F3
按键2:00-FF-18-E7
按键3:00-FF-5E-A1
按键4:00-FF-08-7F
按键5:00-FF-1C-E3
按键6:00-FF-5A-A5
按键7:00-FF-42-BD
按键8:00-FF-52-AD

程序:

#include <reg52.h>
#include <intrins.h>
#define  NOP()   _nop_()   
#define uchar unsigned char
#define uint  unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_()};

void delay(uchar x);
void delay1(int ms);
void delayms(uint);
void beep(void);

sbit IRIN = P3^2;        
sbit LED1 = P1^0;        
sbit LED2 = P1^1;  
sbit LED3 = P1^2;  
sbit LED4 = P1^3;  
sbit LED5 = P1^4;  
sbit LED6 = P1^5;  
sbit LED7 = P1^6;
sbit LED8 = P1^7;
sbit BEEP = P2^3;      
uchar IRCOM[7];
unsigned char Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9,i,j;

main()
{
    IE = 0x81;                 
    TCON = 0x01;                  
    IRIN=1;
    BEEP=1;        
    LED1=1;
    LED2=1;
    LED3=1;
    LED4=1;
    LED5=1;
    LED6=1;
    LED7=1;
    LED8=1;
    delay1(10);              
   while(1);
}

void IR_IN(void) interrupt 0   
{
  unsigned char j,k,N=0;
         EX0 = 0;   
         delay(15);
         if (IRIN==1)
                                {
                            EX0 =1;
          return;
                                }                     
    while (!IRIN)           
    {delay(1);}

    for (j=0;j<4;j++)         
                {
                        for (k=0;k<8;k++)        
                        {
                                while (IRIN)            
                                {delay(1);}
                                while (!IRIN)         
                                {delay(1);}
                                while (IRIN)         
                                {
                                        delay(1);
                                        N++;           
                                        if (N>=30)
                                        {
                                         EX0=1;
                                         return;
                                        }               
                                }                                 
                                IRCOM[j]=IRCOM[j] >> 1;                  
                                if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  
                                N=0;
                        }
                }

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

   IRCOM[5]=IRCOM[2] & 0x0F;   
   IRCOM[6]=IRCOM[2] >> 4;   

   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;

   Y1=Y2=Y3=Y4=Y5=Y6=Y7=Y8=Y9=0;
               
   switch(IRCOM[2])
   {
                        case 0x0C: Y1=0x01; break;
      case 0x18: Y2=0x01; break;
      case 0x5E: Y3=0x01; break;
      case 0x08: Y4=0x01; break;
      case 0x1C: Y5=0x01; break;
      case 0x5A: Y6=0x01; break;
      case 0x42: Y7=0x01; break;
      case 0x52: Y8=0x01; break;


   }
                        
                        if(Y1&0xFF)LED1=0;               
      else LED1=1;         
      if(Y2&0xFF)LED2=0;
      else LED2=1;
      if(Y3&0xFF)LED3=0;
      else LED3=1;
      if(Y4&0xFF)LED4=0;
      else LED4=1;
      if(Y5&0xFF)LED5=0;
      else LED5=1;
      if(Y6&0xFF)LED6=0;
      else LED6=1;
      if(Y7&0xFF)LED7=0;
      else LED7=1;
      if(Y8&0xFF)LED8=0;
      else LED8=1;                                 

    beep();
    EX0 = 1;

}


void beep(void)
{
  unsigned char i;
  for (i=0;i<100;i++)
   {
   delay(4);
   BEEP=!BEEP;               
   }
  BEEP=1;                     
}

void delay(unsigned char x)   
{
        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_();
                }
        }
}



回复

使用道具 举报

XTXB 发表于 2020-8-26 16:30 | 显示全部楼层
你这个程序功能代码互相交叉,牵一发动全身,没有修改价值,先按照之前的按键控制LED的例子先做一遍,各功能模块要独立出来:LED显示,蜂鸣器驱动,键值解析,红外接收,单独封装成一个函数,先把这些一个个调试正常,然后一个个组合起来。另外,定时中断中再用delay很不妥。
回复

使用道具 举报

bro0310 发表于 2020-8-26 17:44 | 显示全部楼层
用个小状态机描述比较清晰:
idle state :   ledOff();
                  if (capture(Key4))
                  {
                        shine(LED4);
                        goto  state  1;
                   }

                  if (capture(Key2))
                  {
                        darken(LED2)
                        goto  state  2;
                   }

                   if (capture(Key3))
                  {
                        brighten(LED2)
                        goto  state  3;
                   }

state 1、state2、state3:
                   if (capture(anykey))
                   {
                         goto state idle;
                   }

伪代码,自己实现函数
回复

使用道具 举报

 楼主| 574402413 发表于 2020-8-26 18:07 来自手机 | 显示全部楼层
XTXB 发表于 2020-8-26 16:30
你这个程序功能代码互相交叉,牵一发动全身,没有修改价值,先按照之前的按键控制LED的例子先做一遍,各功 ...

这个程序搞了好久,把各个功能模块分出来,然后再组合,对于我们初学者来说很难的,不知道从何入手
回复

使用道具 举报

XTXB 发表于 2020-8-26 22:02 | 显示全部楼层
你上次不是提过类似问题么,我给的参考程序有没有敲一遍?首先在IO口加几个按键代替红外接收,把LED按照需求点亮,
然后再单独调通红外接收。
最后组合在一起。
别急,花点时间把这些吃透,以后就轻松了。
做项目其实都是大同小异。
你这个我以前玩过。
001.jpg
004.jpg





回复

使用道具 举报

 楼主| 574402413 发表于 2020-8-27 10:16 来自手机 | 显示全部楼层
我有开发板的,就是不知道怎么组合程序
S00827-10150649.png
回复

使用道具 举报

XTXB 发表于 2020-8-27 12:53 | 显示全部楼层
截个图看看,你完成的单个功能。
你这个需求由于有红外编码,对时序要求比较严,先把单个功能高质量完成才行,别一开始就搞组合功能,到时不能工作都不知道如何查起。
比如先做一个简单功能,把这个功能封装成函数,有了封装换一个不同的遥控器就不至于全部推倒重来。
别想着只用几行代码就能解决所有问题,要舍得多声明变量,多声明函数,思维要有层次,不要眉毛胡子一把抓,结果啥都没抓到。
我给你的代码有你所缺乏的编程思维,认真做一遍后,你目前的很多问题都可迎刃而解。
千万不要小瞧按键点灯程序,你试着完成下面需求:
1,单击按键在按下时马上点亮
2,单击按键在抬起后才点亮
3,双击点亮,
4,长按3秒点亮
5,连续按3次点亮
6,按住按键不放,1秒后,LED每秒钟闪烁3次,松开手后,LED熄灭

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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