91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

紅外調光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
回復
主站蜘蛛池模板: 项城市| 屏南县| 蕲春县| 陆川县| 兴化市| 达拉特旗| 滦南县| 北碚区| 翼城县| 当雄县| 获嘉县| 磴口县| 百色市| 扎囊县| 买车| 三明市| 鄯善县| 弥渡县| 崇文区| 安达市| 柘荣县| 根河市| 南宫市| 青铜峡市| 岳普湖县| 青龙| 明星| 鹤壁市| 锦州市| 观塘区| 罗江县| 云和县| 赤城县| 邹城市| 搜索| 武清区| 中卫市| 溆浦县| 柘荣县| 福贡县| 浮梁县|