这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » ysjabcd的功放DIY进程贴(更新 更新红外遥控功能)

共12条 2/2 1 2 跳转至
院士
2015-04-25 17:50:07     打赏
11楼

借用了论坛里给出的模块,先把按键调通了,为了方便大家看,没用模块化编程,都在一个大程序里,直接贴上来了。

#include<reg52.h>
#include<intrins.h>
#define UINT8 unsigned char    

sbit LED = P1^5;   //指示灯 
sbit IR_INT0 = P3^2;     //红外   
//调音按键  
sbit KEY_SUB = P1^2;  
sbit KEY_ADD = P1^3;  
sbit KEY_MUTE = P1^1;  
  
sbit CHECK = P1^0; //检测音频线有没有接入  
  
sbit MUTE = P1^4;     //功放静音  

  //MCU调音量  
sbit CLOCK = P3^3;  
sbit UPDOWN = P3^6;    
//还有几个全局变量,主要是存功放和按键状态的  
unsigned char uup=0;    //有连续按键时用  
unsigned char IRtimer;//  
unsigned char phonejack = 1;//    //有没有音频线状态  
unsigned char MUTEstate = 0;    //MUTE状态  

void Delay1ms() //@11.0592MHz
{
unsigned char i, j;

_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
//控制音量加   
void Volume_add(void)  
{//  
    UINT8 iadd = 5;  
    UPDOWN = 1;  
    while(--iadd)  
        Delay1ms();  
    CLOCK = 0;  
    iadd = 5;  
    while(--iadd)  
        Delay1ms();  
    CLOCK = 1;  
}  
  
  
// 控制音量减  
  void Volume_sub(void)  
  {  
    UINT8 isub = 5;  
      UPDOWN = 0;  
      while(--isub)  
        Delay1ms();  
      CLOCK = 0;  
      isub = 5;  
      while(--isub)  
        Delay1ms();  
      CLOCK = 1;  
  }  

void flash_LED(UINT8 a)
{
LED = 0;
while(a--)
{ Delay1ms(); }
LED = 1;


//关于按键,软件上一定要做延时处理  
//下面是给大家一个延时的方法,高手请略过;  
void Scan_key(void)  
{  
    int loop;  
    if(KEY_SUB == 0)  
        {LED = 1;  
            loop = 10;  
            while((KEY_SUB == 0) && (loop >0))  
                {--loop;Delay1ms();}  
            if(KEY_SUB == 0)  
                {  
                    Volume_sub();  
               //     u_sstr("-1\n\r");  
                  flash_LED(20); 
                      
                    loop = 1500;  
                    while((KEY_SUB == 0) && (loop >0))  
                        {--loop;Delay1ms();}  
           
                }  
            while(KEY_SUB == 0)  
                {  
                    Volume_sub();  
              //      u_sstr("-1\n\r");  
                    flash_LED(20);;  
                    loop = 200;  
                    while((KEY_SUB == 0) && (loop >0))  
                        {--loop;Delay1ms();}  
                }  
                      
        }  
  
    if(KEY_ADD == 0)  
        {LED = 1;  
        loop = 10;  
        while((KEY_ADD == 0) && (loop >0))  
            {--loop;Delay1ms();}  
        if(KEY_ADD == 0)  
            {  
                Volume_add();  
              //  u_sstr("+1\n\r");  
                flash_LED(20);  
                  
                loop = 1500;  
                while((KEY_ADD == 0) && (loop >0))  
                    {--loop;Delay1ms();}  
                  
            }
        while(KEY_ADD == 0)  
            {  
                Volume_add();  
              //  u_sstr("+1\n\r");  
                flash_LED(20);  
                loop = 200;  
                while((KEY_ADD == 0) && (loop >0))  
                    {--loop;Delay1ms();}  
            }                       
        }  
  
        if(KEY_MUTE == 0)  
        {     
            LED = 1;  
            loop = 10;  
            while((KEY_MUTE == 0) && (loop >0))  
            {--loop;Delay1ms();}  
             if(KEY_MUTE == 0)
{   
                 if(MUTEstate == 1)  
                 {  
                    MUTEstate = 0;  
//                    MUTE = 0;  
                 //  u_sstr("MUTE\n\r");  
                  }  
                  else   
                  {  
                    MUTEstate = 1;  
 //                   MUTE = 1;  
                  //  u_sstr("CLOSE MUTE\n\r");  
                   }  
                flash_LED(20);  
  }
            while(KEY_MUTE==0);               
        }
}  

void checkphone(void) 

    if(CHECK == 0)  //没有耳机插入  
        {  
                MUTE = 1;  
                phonejack = 0;  //没有耳机  
        }  
   else    //有耳机  
        {  
  
  if(phonejack == 0)  
                {  
                   flash_LED(20); 
                }                  
  phonejack = 1;
            if(MUTEstate == 1)  
                {  
                    MUTE = 1;  
                }  
            else   
                {  
                    MUTE = 0;  
                }   
        } 
}
void main()
{
while(1)
{
checkphone();
Scan_key();
}
}


院士
2015-05-15 19:20:19     打赏
12楼

实现了遥控控制音量大小、静音等功能


视频地址:http://player.youku.com/player.php/sid/XOTU2MzYwODMy/v.swf

源代码仍然延续之前的方式添加。

#include<reg52.h>
#include<intrins.h>
#define UINT8 unsigned char    

sbit LED = P1^5;   //指示灯 
sbit IR_INT0 = P3^2;     //红外   
//调音按键  
sbit KEY_SUB = P1^2;  
sbit KEY_ADD = P1^3;  
sbit KEY_MUTE = P1^1;  
  
sbit CHECK = P1^0; //检测音频线有没有接入  
  
sbit MUTE = P1^4;     //功放静音  

  //MCU调音量  
sbit CLOCK = P3^3;  
sbit UPDOWN = P3^6;    
//还有几个全局变量,主要是存功放和按键状态的  
unsigned char uup=0;    //有连续按键时用  
unsigned char IRtimer;//  
unsigned char phonejack = 1;//    //有没有音频线状态  
unsigned char MUTEstate = 0;    //MUTE状态  
UINT8 IRCOM[7];//红外数组
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;

_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
//控制音量加   
void Volume_add(void)  
{//  
    UINT8 iadd = 5;  
    UPDOWN = 1;  
    while(--iadd)  
        Delay1ms();  
    CLOCK = 0;  
    iadd = 5;  
    while(--iadd)  
        Delay1ms();  
    CLOCK = 1;  
}  
  
  
// 控制音量减  
  void Volume_sub(void)  
  {  
    UINT8 isub = 5;  
      UPDOWN = 0;  
      while(--isub)  
        Delay1ms();  
      CLOCK = 0;  
      isub = 5;  
      while(--isub)  
        Delay1ms();  
      CLOCK = 1;  
  }  

void flash_LED(UINT8 a)
{
LED = 0;
while(a--)
{ Delay1ms(); }
LED = 1;


//关于按键,软件上一定要做延时处理  
//下面是给大家一个延时的方法,高手请略过;  
void Scan_key(void)  
{  
    int loop;  
    if(KEY_SUB == 0)  
        {LED = 1;  
            loop = 10;  
            while((KEY_SUB == 0) && (loop >0))  
                {--loop;Delay1ms();}  
            if(KEY_SUB == 0)  
                {  
                    Volume_sub();  
               //     u_sstr("-1\n\r");  
                  flash_LED(20); 
                      
                    loop = 1500;  
                    while((KEY_SUB == 0) && (loop >0))  
                        {--loop;Delay1ms();}  
           
                }  
            while(KEY_SUB == 0)  
                {  
                    Volume_sub();  
              //      u_sstr("-1\n\r");  
                    flash_LED(20);;  
                    loop = 200;  
                    while((KEY_SUB == 0) && (loop >0))  
                        {--loop;Delay1ms();}  
                }  
                      
        }  
  
    if(KEY_ADD == 0)  
        {LED = 1;  
        loop = 10;  
        while((KEY_ADD == 0) && (loop >0))  
            {--loop;Delay1ms();}  
        if(KEY_ADD == 0)  
            {  
                Volume_add();  
              //  u_sstr("+1\n\r");  
                flash_LED(20);  
                  
                loop = 1500;  
                while((KEY_ADD == 0) && (loop >0))  
                    {--loop;Delay1ms();}  
                  
            }
        while(KEY_ADD == 0)  
            {  
                Volume_add();  
              //  u_sstr("+1\n\r");  
                flash_LED(20);  
                loop = 200;  
                while((KEY_ADD == 0) && (loop >0))  
                    {--loop;Delay1ms();}  
            }                       
        }  
  
        if(KEY_MUTE == 0)  
        {     
            LED = 1;  
            loop = 10;  
            while((KEY_MUTE == 0) && (loop >0))  
            {--loop;Delay1ms();}  
             if(KEY_MUTE == 0)
{   
                 if(MUTEstate == 1)  
                 {  
                    MUTEstate = 0;  
//                    MUTE = 0;  
                 //  u_sstr("MUTE\n\r");  
                  }  
                  else   
                  {  
                    MUTEstate = 1;  
 //                   MUTE = 1;  
                  //  u_sstr("CLOSE MUTE\n\r");  
                   }  
                flash_LED(20);  
  }
            while(KEY_MUTE==0);               
        }
}  

void checkphone(void) 

    if(CHECK == 0)  //没有耳机插入  
        {  
                MUTE = 1;  
                phonejack = 0;  //没有耳机  
        }  
   else    //有耳机  
        {  
  
  if(phonejack == 0)  
                {  
                   flash_LED(20); 
                }                  
  phonejack = 1;
            if(MUTEstate == 1)  
                {  
                    MUTE = 1;  
                }  
            else   
                {  
                    MUTE = 0;  
                }   
        } 
}
void init()
{
EA=1;    //开总中断
EX0=1; //开外部中断0
IT0=0;               //外部中断1设为低电平触发
}
void delayhw(unsigned char x)    //x*0.14MS 红外延时 此延时适于11.0592,STC15系列单片机,如换单片机,需改延时。
{
unsigned char i, j;

i = 2;
j = 126;
do
{
while (--j);
} while (--i);
}
  
void main()
{
init();
while(1)
{
checkphone();
Scan_key();
}
}
void exter0() interrupt 0
{
     unsigned char j,k,N=0;
     EX0 = 0;   
// delayhw(15);
if (IR_INT0==1) 
     { EX0 =1; 
  return;
 } 
                            
while (!IR_INT0)   //确认IR信号出现   //等IR变为高电平,跳过9ms的前导低电平信号。
    {delayhw(1);}

for (j=0;j<4;j++)         //收集四组数据

for (k=0;k<8;k++)        //每组数据有8位
{
  while (IR_INT0)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  {delayhw(1);}
  while (!IR_INT0)          //等 IR 变为高电平
  {delayhw(1);}
  while (IR_INT0)           //计算IR高电平时长
  {
   delayhw(1);
   N++;           
   if (N>=30)
{ EX0=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])
   { EX0=0;
     return; }

if(IRCOM[2]==0x19)
{
flash_LED(20); 
Volume_add();
}    

if(IRCOM[2]==0x16)
{
flash_LED(20);
Volume_sub();
}
 
if(IRCOM[2]==0x47)
{
flash_LED(20);
MUTEstate = !MUTEstate;
}
 
     EX0 = 1;
return;
}




共12条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]