• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

红外调光RGB

include
#define uint unsigned int
#define uchar unsigned char
unsigned char a[4];    //储存用户码、用户反码与键数据码、键数据反码
unsigned int LowTime,HighTime; //储存高、低电平的宽度 
sbit led_r=P1^0;
sbit led_g=P1^2;
sbit led_b=P1^4;
sbit IR=P3^2;
sbit BEEP = P2^3;
bit  kg_flag;
bit  zb_flag;
bit  m_flag;
bit  bit_flag;
uchar num,tl,tb,tm,tj;
uchar number;
uchar scw;
uchar pwm_r,pwm_g,pwm_b;
uchar pwm[3];
uchar bright,bright_t;
uchar x[30]={0};
uchar type[30]={0};
void dealy(uint z)
{  uint x,y;	for(x=z;x>0;x--)
	for(y=110;y>0;y--);
}
/*void delay1ms()
{
   unsigned char i,j;	
	 for(i=0;i<10;i++)
	  for(j=0;j<33;j++)
	   ;		 
 }
void delay(unsigned char n)
 {
   unsigned char i;
	for(i=0;i>1;  //temp中的各数据位右移一位,因为先读出的是高位数据									
			   TH0=0;         //定时器清0
			   TL0=0;         //定时器清0
			   TR0=1;         //开启定时器T0
		      while(IR==0)   //如果是低电平就等待
	               ;	      //低电平计时
		  	   TR0=0;         //关闭定时器T0
			   LowTime=TH0*256+TL0;    //保存低电平宽度
			   TH0=0;         //定时器清0
			   TL0=0;         //定时器清0
			   TR0=1;         //开启定时器T0
			   while(IR==1)   //如果是高电平就等待
			       ;			   
			   TR0=0;        //关闭定时器T0
			   HighTime=TH0*256+TL0;   //保存高电平宽度
			   if((LowTime<370)||(LowTime>640))
			  		    return 0;        //如果低电平长度不在合理范围,则认为出错,停止解码			
			   if((HighTime>420)&&(HighTime<620))   //如果高电平时间在560微秒左右,即计数560/1.085=516次
			           temp=temp&0x7f;       //(520-100=420, 520+100=620),则该位是0
			   if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
			           temp=temp|0x80;       //(1550-250=1300,1550+250=1800),则该位是1
		     }  			            
	   a[i]=temp;	//将解码出的字节值储存在a[i]																					 
    }  				 		 
  if(a[2]=~a[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户码
	 return 1;     //解码正确,返回1
}


void exter_int0() interrupt 0
{  EX0=0;
         //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
     TH0=0;      //定时器T0的高8位清0
	  TL0=0;      //定时器T0的低8位清0
	  TR0=1;	    //开启定时器T0	 
	  while(IR==0);          //如果是低电平就等待,给引导码低电平计时
	  TR0=0;                //关闭定时器T0     
	  LowTime=TH0*256+TL0;  //保存低电平时间
	  TH0=0;      //定时器T0的高8位清0
	  TL0=0;      //定时器T0的低8位清0
	  TR0=1;	    //开启定时器T0
	  while(IR==1);  //如果是高电平就等待,给引导码高电平计时
	  TR0=0;        //关闭定时器T0
	  HighTime=TH0*256+TL0;	//保存引导码的高电平长度
     if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
		 {
		    //如果是引导码,就开始解码,否则放弃,引导码的低电平计时
	       //次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.
	      if(DeCode()==1); // 执行遥控解码功能
		 {// beep();
      
        switch(a[2])
      {
      case 0x07:
      {kg_flag=1;
       TR0=1;
       dealy(5); 
       TR1=1;
       TR0=0;
       zb_flag=1;
       number=0;
       m_flag=1;
       bright_t=225;
       pwm[0]=bright_t;  
       pwm[1]=bright_t;
       pwm[2]=bright_t;
       }
        //TR0=1;
        break;
         case 0x06:
       { //TR0=0;
        kg_flag=0;
        pwm[0]=0;  
        pwm[1]=0;
        pwm[2]=0;
       } break; 
       //TR0=1;
       case 0x04:
		{
		 if((kg_flag==1)&&(m_flag==0))
          {
       if((0<=number)&&(number<=14))
		 {
		  if(bright_t!=25)
          {
           bright_t=bright_t-10;
          }
       }
          }
      }    break;
        case 0x05:
		{
		 if((kg_flag==1)&&(m_flag==0))
          {
       if((0<=number)&&(number<=14))
		 {
		  if(bright_t!=255)
          {
           bright_t=bright_t+10;
          }
       }
          }
      }        break;
        case 0x09:
       {  //TR0=0;
          //TR1=1; 
         if(kg_flag==1)
        {pwm[0]=bright_t; 
          pwm[1]=0;
          pwm[2]=0;
         } 
       }   break; 
         //TR0=1;
        case 0x08:
       {if(kg_flag==1)
         {pwm[0]=0; 
          pwm[1]=bright_t;
          pwm[2]=0;}  
        }break;
         case 0x0A:
       {if(kg_flag==1)
         {pwm[0]=0; 
          pwm[1]=0;
          pwm[2]=bright_t;}  
        }break; 
      }
    }
	 }
       EX0=1;
  }
 
void main()
 {
  init();
  while(1);
 } 
void timer1()interrupt 1   
 {
  TH1=(65536-200)/256;
  TL1=(65536-200)%256;
  if(scw==1)
    {
      scw=0;
      pwm_r=pwm[0];
      pwm_g=pwm[1];
      pwm_b=pwm[2];
    }
  else
    {
      if(pwm_r>0){led_r=0;pwm_r--;}
      else{led_r=1;}
      if(pwm_g>0){led_g=0;pwm_g--;}
      else{led_g=1;}
      if(pwm_b>0){led_b=0;pwm_b--;}
      else{led_b=1;}
      scw++;
       
    }
        请高手指点下两个定时器怎么回事,SCW的值加大,按遥控调光就延时,怎么回事,T1不工作
  }
全部回复(32)
正序查看
倒序查看
2016-04-01 17:14
怎么没人回复呢,研究了下现在调光还是没解决,按亮度调度后就开始一直闪烁
0
回复
2016-04-01 21:43
@l184890962
怎么没人回复呢,研究了下现在调光还是没解决,按亮度调度后就开始一直闪烁
你的红外解码程序有问题,解码程序不能一直在哪暂停。
0
回复
2016-04-02 09:14
@yueyunno1
你的红外解码程序有问题,解码程序不能一直在哪暂停。
怎么修改指点下大师
0
回复
2016-04-02 15:01
@yueyunno1
你的红外解码程序有问题,解码程序不能一直在哪暂停。
请教下怎么改下才有用
0
回复
2016-04-05 09:26
怎么就没高人指点下呢
0
回复
2016-04-05 09:36
@l184890962
怎么就没高人指点下呢
估计高人今儿忙~ 在等等哩~
0
回复
2016-04-05 17:12
@l184890962
怎么就没高人指点下呢
你的程序逻辑有问题,在 timer1函数中首先执行的是else函数,导致pwm_r都没有初始化
0
回复
2016-04-06 09:02
@黑夜公爵
你的程序逻辑有问题,在timer1函数中首先执行的是else函数,导致pwm_r都没有初始化
T1没有起作用,T1定时器函数删了一样改变SCW的值定时时间是T0定时器而不是T1
0
回复
l184890962
LV.2
10
2016-04-06 10:21
@黑夜公爵
你的程序逻辑有问题,在timer1函数中首先执行的是else函数,导致pwm_r都没有初始化
有没有高手教下怎么修改
0
回复
2016-04-06 12:34
@l184890962
T1没有起作用,T1定时器函数删了一样改变SCW的值定时时间是T0定时器而不是T1
你的程序完整么?scw这个变量只有初始0,和在time1中被赋值变化,time1是个中断函数,但是主程序没有中断入口,代码估计不是楼主自己写的吧
0
回复
l184890962
LV.2
12
2016-04-06 14:43
@黑夜公爵
你的程序完整么?scw这个变量只有初始0,和在time1中被赋值变化,time1是个中断函数,但是主程序没有中断入口,代码估计不是楼主自己写的吧
代码是自已写的,我是初学者,主程序中不是初始化了吗怎么没有中断入口不太明白,具体怎么改能指点下吗
0
回复
jcpower
LV.4
13
2016-04-07 13:43
@l184890962
有没有高手教下怎么修改
你现在就是高人了呀!
0
回复
l184890962
LV.2
14
2016-04-08 11:45
@黑夜公爵
你的程序完整么?scw这个变量只有初始0,和在time1中被赋值变化,time1是个中断函数,但是主程序没有中断入口,代码估计不是楼主自己写的吧
#include
#define uint unsigned int
#define uchar unsigned char
unsigned char a[4];    //储存用户码、用户反码与键数据码、键数据反码
unsigned int LowTime,HighTime; //储存高、低电平的宽度 
sbit led_r=P1^0;
sbit led_g=P1^2;
sbit led_b=P1^4;
sbit IR=P3^2;
sbit BEEP = P2^3;
bit  kg_flag;
bit  zb_flag;
bit  m_flag;
bit  s_flag;
bit  f_flag;
uchar num,tl,tb,tm,tj;tt;
uchar number;
uchar scw;
uchar pwm_r,pwm_g,pwm_b;
uchar pwm[3];
uchar bright,bright_t;
uchar x[30]={0};
uchar type[30]={0};
void dealy(uint z)
{  uint x,y;	for(x=z;x>0;x--)
	for(y=110;y>0;y--);
}

void init()
 { 
  TMOD=0x01;
  TH0=0;         //定时器清0
  TL0=0;
  EA=1;
  ET0=1; 
 // IT0=1;
  EX0=1;
  //PT0=1;
  //PX0=0;
  TR0=1;
 
  TH1=(65536-1000)/256;
  TL1=(65536-1000)%256;
  ET1=1;
  EA=1; 
  //IT0=1;
  //EX0=1;
  PT1=1;
  //PX0=0;
  TR1=1;
 scw=0;
  tl=20;tb=100;tm=20;tj=100;
  kg_flag=0;
  zb_flag=0; m_flag=0;s_flag=0;
  f_flag=0;
  bright=255;bright_t=255;
  pwm[0]=0;  
  pwm[1]=0;
  pwm[2]=0; 
}

//void beep()		//蜂鸣器响一声函数
//{
 // unsigned char i;
  //for (i=0;i<100;i++)
  // {
  // delay1ms();
   //BEEP=!BEEP;       //BEEP取反
   //} 
  // BEEP=1;           //关闭蜂鸣器
  // delay(250);       //延时     
//}

      
bit DeCode(void)        
{
    
   unsigned char  i,j;
	unsigned char temp;    //储存解码出的数据
	for(i=0;i<4;i++)      //连续读取4个用户码和键数据码
	  {
		 for(j=0;j<8;j++)  //每个码有8位数字
			 {
	         temp=temp>>1;  //temp中的各数据位右移一位,因为先读出的是高位数据									
			   TH0=0;         //定时器清0
			   TL0=0;         //定时器清0
			   TR0=1;         //开启定时器T0
		      while(IR==0)   //如果是低电平就等待
	               ;	      //低电平计时
		  	   TR0=0;         //关闭定时器T0
			   LowTime=TH0*256+TL0;    //保存低电平宽度
			   TH0=0;         //定时器清0
			   TL0=0;         //定时器清0
			   TR0=1;         //开启定时器T0
			   while(IR==1)   //如果是高电平就等待
			       ;			   
			   TR0=0;        //关闭定时器T0
			   HighTime=TH0*256+TL0;   //保存高电平宽度
			   if((LowTime<370)||(LowTime>640))
			  		    return 0;        //如果低电平长度不在合理范围,则认为出错,停止解码			
			   if((HighTime>420)&&(HighTime<620))   //如果高电平时间在560微秒左右,即计数560/1.085=516次
			           temp=temp&0x7f;       //(520-100=420, 520+100=620),则该位是0
			   if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
			           temp=temp|0x80;       //(1550-250=1300,1550+250=1800),则该位是1
		     }  			            
	   a[i]=temp;	//将解码出的字节值储存在a[i]																					 
    }  				 		 
  if(a[2]=~a[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户码
	 return 1;     //解码正确,返回1
}


void exter_int0() interrupt 0 using 0
{  EX0=0;
         //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
     TH0=0;      //定时器T0的高8位清0
	  TL0=0;      //定时器T0的低8位清0
	  TR0=1;	    //开启定时器T0	 
	  while(IR==0);          //如果是低电平就等待,给引导码低电平计时
	  TR0=0;                //关闭定时器T0     
	  LowTime=TH0*256+TL0;  //保存低电平时间
	  TH0=0;      //定时器T0的高8位清0
	  TL0=0;      //定时器T0的低8位清0
	  TR0=1;
     	    //开启定时器T0
	  while(IR==1);  //如果是高电平就等待,给引导码高电平计时
	  TR0=0;        //关闭定时器T0
	  HighTime=TH0*256+TL0;	//保存引导码的高电平长度
     if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
		 {
		    //如果是引导码,就开始解码,否则放弃,引导码的低电平计时
	       //次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.
	      if(DeCode()==1);// 执行遥控解码功能
			 {// beep();
			   //TR1=0;
			   //TH1=(65536-1000)/256;
			   //TL1=(65536-1000)%256; 
			    //TR1=1; 
      
        switch(a[2])
      {
      case 0x07:
      {kg_flag=1;
       
       	
       f_flag=0;
       s_flag=0;
       zb_flag=0;
       number=0;
       m_flag=0;
       //bright_t=225;
       pwm[0]=bright_t;  
       pwm[1]=bright_t;
       pwm[2]=bright_t;
       
       }
        
        break;
        
         case 0x06:
       { 
        kg_flag=0;
        pwm[0]=0;  
        pwm[1]=0;
        pwm[2]=0;
       } break; 
       
       case 0x04:
		{
		 if((kg_flag==1)&&(m_flag==0)&&
         (s_flag==0)&&
         (zb_flag==0)&&(f_flag==0))
          {
          if(bright_t!=25)
          {
           bright_t=bright_t-10;
          }
           
          }
      }    break;
        case 0x05:
		{
		 if((kg_flag==1)&&(m_flag==0)&&
         (s_flag==0)&&
         (zb_flag==0)&&(f_flag==0))
          {
           if(bright_t!=255)
          {
           bright_t=bright_t+10;
          }
           
          }
      }        break;
        case 0x09:
       {  
           
         if(kg_flag==1)
        {pwm[0]=bright_t; 
          pwm[1]=0;
          pwm[2]=0;
         } 
       }   break; 
         
        case 0x08:
       {if(kg_flag==1)
         {pwm[0]=0; 
          pwm[1]=bright_t;
          pwm[2]=0;}  
        }break;
         case 0x0A:
       {if(kg_flag==1)
         {pwm[0]=0; 
          pwm[1]=0;
          pwm[2]=bright_t;}  
        }break; 
      }
    }
	 }
       EX0=1;
  }
 
void main()
 {
  init();
  while(1);
 } 
void timer1()interrupt 3 using 1  
 {
  
   
   TH1=(65536-1000)/256;
   TL1=(65536-1000)%256; 
     
    scw++;  
  if(scw==255)
    { 
      scw=0;
      
      pwm_r=pwm[0];
      pwm_g=pwm[1];
      pwm_b=pwm[2];
      
    }
  else
    {
      if(pwm_r>0){led_r=0;pwm_r--;}
      else{led_r=1;}
      if(pwm_g>0){led_g=0;pwm_g--;}
      else{led_g=1;}
      if(pwm_b>0){led_b=0;pwm_b--;}
      else{led_b=1;}                       这个调了下T1工作了但还是不能调光,调光部分怎么写请高手指点
0
回复
l184890962
LV.2
15
2016-04-08 13:49
@l184890962
#include#defineuintunsignedint#defineucharunsignedcharunsignedchara[4];//储存用户码、用户反码与键数据码、键数据反码unsignedintLowTime,HighTime;//储存高、低电平的宽度sbitled_r=P1^0;sbitled_g=P1^2;sbitled_b=P1^4;sbitIR=P3^2;sbitBEEP=P2^3;bitkg_flag;bitzb_flag;bitm_flag;bits_flag;bitf_flag;ucharnum,tl,tb,tm,tj;tt;ucharnumber;ucharscw;ucharpwm_r,pwm_g,pwm_b;ucharpwm[3];ucharbright,bright_t;ucharx[30]={0};uchartype[30]={0};voiddealy(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidinit(){TMOD=0x01;TH0=0;//定时器清0TL0=0;EA=1;ET0=1;//IT0=1;EX0=1;//PT0=1;//PX0=0;TR0=1;TH1=(65536-1000)/256;TL1=(65536-1000)%256;ET1=1;EA=1;//IT0=1;//EX0=1;PT1=1;//PX0=0;TR1=1;scw=0;tl=20;tb=100;tm=20;tj=100;kg_flag=0;zb_flag=0;m_flag=0;s_flag=0;f_flag=0;bright=255;bright_t=255;pwm[0]=0;pwm[1]=0;pwm[2]=0;}//voidbeep()//蜂鸣器响一声函数//{//unsignedchari;//for(i=0;i420)&&(HighTime1300)&&(HighTime7800)&&(LowTime3600)&&(HighTime0){led_r=0;pwm_r--;}else{led_r=1;}if(pwm_g>0){led_g=0;pwm_g--;}else{led_g=1;}if(pwm_b>0){led_b=0;pwm_b--;}else{led_b=1;}这个调了下T1工作了但还是不能调光,调光部分怎么写请高手指点
怎么没有一个高手解答下
0
回复
jcpower
LV.4
16
2016-04-08 13:51
@l184890962
#include#defineuintunsignedint#defineucharunsignedcharunsignedchara[4];//储存用户码、用户反码与键数据码、键数据反码unsignedintLowTime,HighTime;//储存高、低电平的宽度sbitled_r=P1^0;sbitled_g=P1^2;sbitled_b=P1^4;sbitIR=P3^2;sbitBEEP=P2^3;bitkg_flag;bitzb_flag;bitm_flag;bits_flag;bitf_flag;ucharnum,tl,tb,tm,tj;tt;ucharnumber;ucharscw;ucharpwm_r,pwm_g,pwm_b;ucharpwm[3];ucharbright,bright_t;ucharx[30]={0};uchartype[30]={0};voiddealy(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidinit(){TMOD=0x01;TH0=0;//定时器清0TL0=0;EA=1;ET0=1;//IT0=1;EX0=1;//PT0=1;//PX0=0;TR0=1;TH1=(65536-1000)/256;TL1=(65536-1000)%256;ET1=1;EA=1;//IT0=1;//EX0=1;PT1=1;//PX0=0;TR1=1;scw=0;tl=20;tb=100;tm=20;tj=100;kg_flag=0;zb_flag=0;m_flag=0;s_flag=0;f_flag=0;bright=255;bright_t=255;pwm[0]=0;pwm[1]=0;pwm[2]=0;}//voidbeep()//蜂鸣器响一声函数//{//unsignedchari;//for(i=0;i420)&&(HighTime1300)&&(HighTime7800)&&(LowTime3600)&&(HighTime0){led_r=0;pwm_r--;}else{led_r=1;}if(pwm_g>0){led_g=0;pwm_g--;}else{led_g=1;}if(pwm_b>0){led_b=0;pwm_b--;}else{led_b=1;}这个调了下T1工作了但还是不能调光,调光部分怎么写请高手指点

首先可以肯定,没人看你的代码

你的PWM调光原理是什么?你可以用一个给定数据调光,也就是程序自动慢慢调节,用于验证你的调光程序与硬件是否OK

其次你可以通过调试或是串口方式读出接收到的代码是否正确,接收到的代码是否能得到执行?

0
回复
l184890962
LV.2
17
2016-04-08 14:51
@l184890962
#include#defineuintunsignedint#defineucharunsignedcharunsignedchara[4];//储存用户码、用户反码与键数据码、键数据反码unsignedintLowTime,HighTime;//储存高、低电平的宽度sbitled_r=P1^0;sbitled_g=P1^2;sbitled_b=P1^4;sbitIR=P3^2;sbitBEEP=P2^3;bitkg_flag;bitzb_flag;bitm_flag;bits_flag;bitf_flag;ucharnum,tl,tb,tm,tj;tt;ucharnumber;ucharscw;ucharpwm_r,pwm_g,pwm_b;ucharpwm[3];ucharbright,bright_t;ucharx[30]={0};uchartype[30]={0};voiddealy(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidinit(){TMOD=0x01;TH0=0;//定时器清0TL0=0;EA=1;ET0=1;//IT0=1;EX0=1;//PT0=1;//PX0=0;TR0=1;TH1=(65536-1000)/256;TL1=(65536-1000)%256;ET1=1;EA=1;//IT0=1;//EX0=1;PT1=1;//PX0=0;TR1=1;scw=0;tl=20;tb=100;tm=20;tj=100;kg_flag=0;zb_flag=0;m_flag=0;s_flag=0;f_flag=0;bright=255;bright_t=255;pwm[0]=0;pwm[1]=0;pwm[2]=0;}//voidbeep()//蜂鸣器响一声函数//{//unsignedchari;//for(i=0;i420)&&(HighTime1300)&&(HighTime7800)&&(LowTime3600)&&(HighTime0){led_r=0;pwm_r--;}else{led_r=1;}if(pwm_g>0){led_g=0;pwm_g--;}else{led_g=1;}if(pwm_b>0){led_b=0;pwm_b--;}else{led_b=1;}这个调了下T1工作了但还是不能调光,调光部分怎么写请高手指点
看来在这里请教是浪费时间
0
回复
2016-04-08 17:19
@l184890962
看来在这里请教是浪费时间
那么多工程师在回答问题,看来没有找到好的方案呀,不过既然是请教,当然需要耐心一些喽。
0
回复
l184890962
LV.2
19
2016-04-08 17:24
@电源网-天边
那么多工程师在回答问题,看来没有找到好的方案呀,不过既然是请教,当然需要耐心一些喽。
问了这么多天没有谁说点实际的,指点代码哪里有问题改哪里这才是关键
0
回复
l184890962
LV.2
20
2016-04-08 17:27
@jcpower
首先可以肯定,没人看你的代码你的PWM调光原理是什么?你可以用一个给定数据调光,也就是程序自动慢慢调节,用于验证你的调光程序与硬件是否OK其次你可以通过调试或是串口方式读出接收到的代码是否正确,接收到的代码是否能得到执行?
调光时一直闪,按调光健后,要再按下其它颜色键再会变暗,而且一直闪
0
回复
2016-04-12 09:10

大概把你的程序看完了,主要问题还是在解码那部分 ,算没算 完全解码一次,你在EX0等待了多久时间  如果这段时间 有TIME1中断触发,会跳出来么?不知道你的PWM输出频率多少,猜测问题应该是这里。

解码的方式 最好是中断查询的方式   不怎么占用时间  

0
回复
l184890962
LV.2
22
2016-04-12 09:58
@xiaoxiong1988
大概把你的程序看完了,主要问题还是在解码那部分,算没算完全解码一次,你在EX0等待了多久时间 如果这段时间有TIME1中断触发,会跳出来么?不知道你的PWM输出频率多少,猜测问题应该是这里。解码的方式最好是中断查询的方式 不怎么占用时间 
没有PWM,51模拟pwm,一个周期255MS,中断查询方式解码怎么写
0
回复
daihui713
LV.6
23
2016-04-14 18:18
@l184890962
没有PWM,51模拟pwm,一个周期255MS,中断查询方式解码怎么写

中断查询解码————意思就是  边解码  边PWM循环,   例如:以50us的时基础作为定时中断, 时间一到就去中断里面解码, 以累计的方式判断什么引导码 用户码 数据码 反码等,  中断函数里面最多也就是++,判断,循环存放之类的语句,占用不了多少时间,最多十几uS就退出中断了,这样就不用一直在那里等电平的变化。退出后又接着继续主函数中的PWM循环,十几US的执行时间根本不影响PWM调光的视觉暂留效应,这样就看不到闪。

 

给你个参考——利用定时器的固定时基来查询红外脉冲的宽度,从而进行解码!

可以自己去分析,至于中间的高电平是多少时间,低电平是多少时间都不用去管,只需计算两个下降沿间隔时间就可以判断0和1,同时也可以判断是否是引导码,或是结束码,或是连续码

定时器查看时间设置为125us,执行定时器中断程序一次

void Timer0 interrupt 1()                                                            

{      

        irTime++;   

        if(irTime==240) // ir解码后码值存放时间, 240*125us = 30ms   

       {

             irTime--;  

             codeCnt=0x3f;

       }       

       if(IR_IO)   Irprot_LastState=1; // 记录IO状态   

       else if(Irprot_LastState)       // 有下降沿 

       {      

              Irprot_LastState = 0;        // 下降沿后IO状态记录为0      

              if(irTime<24)                // 小于24*125us=3ms的间隔才进行处理      

             {         

                    codeCnt++;  

                    codeCnt &= 0x1f;         

                    IR_data[codeCnt>>3] <<= 1;       

                    if( irTime>15)   

                    IR_data[codeCnt>>3]++;  // 大于15*125us=1.875ms的间隔为数据1      

             }    

             irTime = 0;                  // 下降沿处理完成,将时间清0   

        }

}

 

0
回复
l184890962
LV.2
24
2016-04-21 09:51
@daihui713
中断查询解码————意思就是 边解码 边PWM循环,  例如:以50us的时基础作为定时中断,时间一到就去中断里面解码,以累计的方式判断什么引导码用户码数据码反码等, 中断函数里面最多也就是++,判断,循环存放之类的语句,占用不了多少时间,最多十几uS就退出中断了,这样就不用一直在那里等电平的变化。退出后又接着继续主函数中的PWM循环,十几US的执行时间根本不影响PWM调光的视觉暂留效应,这样就看不到闪。 给你个参考——利用定时器的固定时基来查询红外脉冲的宽度,从而进行解码!可以自己去分析,至于中间的高电平是多少时间,低电平是多少时间都不用去管,只需计算两个下降沿间隔时间就可以判断0和1,同时也可以判断是否是引导码,或是结束码,或是连续码定时器查看时间设置为125us,执行定时器中断程序一次voidTimer0interrupt1()                                        {           irTime++;         if(irTime==240)//ir解码后码值存放时间,240*125us=30ms         {            irTime--;              codeCnt=0x3f;      }             if(IR_IO)  Irprot_LastState=1;//记录IO状态        elseif(Irprot_LastState)    //有下降沿       {                 Irprot_LastState=0;      //下降沿后IO状态记录为0                 if(irTime>3]>3]++;  //大于15*125us=1.875ms的间隔为数据1                }              irTime=0;            //下降沿处理完成,将时间清0         }} 
意思是不是只要用一个定时器就可以解码和PWM控制
0
回复
jcpower
LV.4
25
2016-04-24 10:22
@l184890962
意思是不是只要用一个定时器就可以解码和PWM控制

代码有什么问题?

首先你需要保证硬件没问题,你是没用心看我16楼的指点。

如果硬件有问题,你什么调代码有用吗???????

现在大把带PWM片子,为何不用片内PWM?

用片内PWM正常的话,那就是传输数据的问题,查起来也方便。

0
回复
l457902798
LV.2
26
2016-04-25 08:57
@jcpower
代码有什么问题?首先你需要保证硬件没问题,你是没用心看我16楼的指点。如果硬件有问题,你什么调代码有用吗???????现在大把带PWM片子,为何不用片内PWM?用片内PWM正常的话,那就是传输数据的问题,查起来也方便。
都说了硬件没有问题,程序问题,做产品要考虑成本问题不是做的玩
0
回复
jcpower
LV.4
27
2016-04-25 17:49
@l457902798
都说了硬件没有问题,程序问题,做产品要考虑成本问题不是做的玩

好一个硬件没问题。

通常出问题也只在一小部份,也不用把所有程序都贴出来。

现在你都没搞清楚是收不到数还是收到的数据不正常?还是加载时不正常?

正常情况下。如你要控制50%的占空比,那你出问题你就要找收到的是不是50%占空比数据?

是加载过程中闪还是一直闪?

做产品是要考虑成本,但现在带PWM的片子也1块多,你要用几毛的片子,那我也只能呵呵了!!!

0
回复
jcpower
LV.4
28
2016-04-25 17:51
@jcpower
好一个硬件没问题。通常出问题也只在一小部份,也不用把所有程序都贴出来。现在你都没搞清楚是收不到数还是收到的数据不正常?还是加载时不正常?正常情况下。如你要控制50%的占空比,那你出问题你就要找收到的是不是50%占空比数据?是加载过程中闪还是一直闪?做产品是要考虑成本,但现在带PWM的片子也1块多,你要用几毛的片子,那我也只能呵呵了!!!

如果没有加载数据,就一直闪???那不是硬件问题?????

就算你用的软PWM出问题,也归为硬件问题,明白不?

0
回复
2016-04-26 11:15
@l184890962
意思是不是只要用一个定时器就可以解码和PWM控制

一个定时器  边解码 边输出PWM 

如:设定一个基准时间50us  中断  处理解码和PWM  

调试时  先把PWM屏蔽  测试解码是否正常   然后把解码屏蔽  测试PWM是否正常   然后两个都不屏蔽测试 是否正常   

调程序 要有耐心   一步一步的测试   每个人写程序的思路是不一样的    只要你的思路正确了   怎么都能写出功能完整的程序  

类似这种的 最好是靠定时中断去处理    外部触发中断  需要速度跑出中断   不然很容易中断嵌套   

0
回复
2016-04-26 11:18
@jcpower
[图片]如果没有加载数据,就一直闪???那不是硬件问题?????就算你用的软PWM出问题,也归为硬件问题,明白不?
闪的问题  首先要确定你的PWM 输出没有问题   最好用示波器去看PWM 波形  如果 不调光的时候PWM 正常  调光的时候 PWM有问题灯闪  那你说是不是解码程序和PWM程序  在时间上有冲突呢?
0
回复
2016-04-26 11:20
@l184890962
意思是不是只要用一个定时器就可以解码和PWM控制

你列出的程序  没多少人会耐心的看完的  写程序的习惯不好   看着挺费劲   为什么不在每个函数之前 标一下 函数功能?

0
回复