⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ok.c

📁 红外遥控风扇的接收程序
💻 C
字号:
/*************************   说 明 *********************************/
  /*    以一个9ms的低电平和4.5ms的高电平为引导码,后跟32位二进制代码 */
  /*    前16位为8位用户码及其反码,后16位为8位的操作码及其反码      */
  /*    以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示"0";    */
  /*    以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示"1"。    */
  /*    注意:接收码的脉宽与间隔是对发射码取反的,即间隔是0.565ms     */
  /******************************************************************/
   #include <REGX52.h>
   #define uchar unsigned char
   uchar   time=0;   
   uchar   period=40;         //定义定时周期   
   int   timer_count=0;
   uchar   high;              //定义高电平时间变量
   uchar data    IRcode[4];     //定义一个4字节的数组用来存储代码
   uchar     CodeTemp;       //编码字节缓存变量
   uchar     i,j,k,m,g,h;
   uchar     a=0,b=0;         //延时用的循环变量
   sbit     IRsignal=P3^2;     //MS0038接收头OUT端直接连P3.2(INT0)
   sbit    feilin=P1^0; 
   sbit    mogu=P2^0;
   sbit    love=P1^7;
   sbit    father=P1^6;
   sbit    mother=P1^5;
  /**************************延时0.9ms子程序**********************/
     void Delay0_9ms(void)
     {uchar j,k;
          for(j=18;j>0;j--)
            for(k=20;k>0;k--) ;
     }
  /***************************延时1ms子程序**********************/
     void Delay1ms(void)
     {uchar i,j;
        for(i=2;i>0;i--)
           for(j=230;j>0;j--) ;
     }
  /***************************延时4.5ms子程序**********************/
     void Delay4_5ms(void)
     {uchar i,j;
          for(i=10;i>0;i--)
           for(j=225;j>0;j--) ;
     }	 	
   
   /**************************** 延时子程序 ************************/
     void Delay(void)
     {uchar i,j,k;
     for(i=200;i>0;i--)  
        for(j=200;j>0;j--)
           for(k=3;k>0;k--) ;
     }
   
   /************************定时1中断服务子程序**********************/  
   void  time1()   interrupt 3 using 3
   { EX0=1;
     TH1=0x3C;
	 TL1=0xB0;
	 timer_count++;
	 if(h==1&&timer_count==100)                          //定时5S
	   {   ET1=0;           
           timer_count=0;h=0;
		   high=1;g=0;love=1;P0=0x81;ET0=1;Delay4_5ms(); 
       }
	 if(h==2&&timer_count==200)                          //定时10S
 	    {  ET1=0;
           timer_count=0;h=0;
		   high=1;g=0;father=1;P0=0x81;ET0=1;Delay4_5ms(); 
		}
	 if(h==3&&timer_count==300)                          //定时30S
 	    {  ET1=0;
           timer_count=0;h=0;
		   high=1;g=0;mother=1;P0=0x81;ET0=1;Delay4_5ms(); 
		}
	   
	 } 

   /************************定时0中断服务子程序**********************/   
   /*采用12MHz晶振,在P1.0脚上输出周期为100ms的脉冲信号*/   
   /*定时2.5ms,周期100ms需40次中断,高电平10ms需4次中断*/   
  
   void  time0()   interrupt 2  using 1
   {     
       EX0=1; 
       TH0=0xF6;                 /*定时器初值重装载*/   
       TL0=0x3C;   
       time++;   
       if(time==high)              /*高电平持续时间结束,变低*/   
            {   mogu=0;}   
       else   if(time==period)      /*周期时间到,变高*/   
            {   time=0;   
                mogu=1;
				if(g==1)           /*睡眠风控制*/
				  {a++;
				   if(a==100)
					  {a=0;
					   b++;
					   if(b%6==1)   /*停止运行10S*/
					   high=50;
					   if(b%6==2)   /*二档运行10S*/
					   high=13;
					   if(b%6==3)   /*停止运行10S*/
					   high=50;
					   if(b%6==4)   /*三档运行10S*/
					   high=22;
					   if(b%6==5)   /*停止运行10S*/
					   high=50;
					   if(b%6==0)   /*一档运行10S*/
					   high=1;
					   }
					}
                if(g==2)            /*自然风控制*/
                  {a++;
					if(a==100)
					  {a=0;
					   b++;
					    if(b%4==1)  /*二档运行10S*/
					    high=13;		  
					    if(b%4==2)  /*三档运行10S*/
					    high=22;						   
					    if(b%4==3)  /*停止运行10S*/
					    high=50;
					    if(b%4==0)  /*一档运行10S*/
					    high=1;
		               }						 
                    }
                if(g==3)            /*正常风控制*/
                  {a++;
					if(a==100)
					  {a=0;
					   b++;
					    if(b%3==1)  /*二档运行10S*/
					    high=13;		  
					    if(b%3==2)  /*三档运行10S*/
					    high=22;						   
					    if(b%3==0)  /*一档运行10S*/
					    high=1;
					   }
		           }						 
          }
		}   
 
     
   /************************中断0解码服务子程序**********************/
   void int0(void) interrupt 0 using 2      
   {
    EA=0;
    for(k=0;k<10;k++)
       {Delay0_9ms();
        if (IRsignal==1)                 //如果0.9ms后IRsignal=1,说明不是引导码
           {k=10;break;}
        else if(k==9)                    //如果持续了10×0.9ms=9ms的低电平,说明是引导
           {while(IRsignal==0);
            Delay4_5ms();              //跳过持续4.5ms的高电平
            for(i=0;i<4;i++)             //分别读取4个字节
               {for(j=1;j<=8;j++)        //每个字节8个bit的判断
                   { while(IRsignal==0); //等待上升沿
                     Delay0_9ms();     //从上升沿那一时刻开始延时0.9ms,再判断IRsignal
                     if(IRsignal==1)     //如果IRsignal是"1",则向右移入一位"1"
                       {Delay1ms();
                        CodeTemp=CodeTemp|0x80;
                        if(j<8) CodeTemp=CodeTemp>>1;
                        }
                     else
                     if(j<8)CodeTemp=CodeTemp>>1;//如果IRsignal是"0",则向右移一位,自动补"0"
                  }
                IRcode[i]=CodeTemp;              //接收的码型存到IRcode
                CodeTemp=0;
               }
 
            }
         }
	 EA=1;
	 EX0=0;
   if(IRcode[3]==0xA1)             //检测到一档按键按下
     {IRcode[3]=0;
      P0=0x81;                     //数码管显示1  
	  feilin=0;Delay();feilin=1;   //发光二极管闪一闪
	  high=1;g=0;ET0=1;}
   if(IRcode[3]==0xE2)             //检测到二档按键按下
     {IRcode[3]=0;P0=0x3B;
	  feilin=0;Delay();feilin=1;
	  high=13;g=0; ET0=1; }
   if(IRcode[3]==0xE1)              //检测到三档按键按下/
     {IRcode[3]=0;P0=0xAB;
	  feilin=0;Delay();feilin=1;    
  	  high=22;g=0; ET0=1;}
  
   if(IRcode[3]==0xE0)	            //检测到关机按键按下/
     {IRcode[3]=0;P0=0x00;
	  feilin=0;Delay();feilin=1;
	  high=50;g=0; ET0=1;}  
  
   if(IRcode[3]==0xA8)              //检测到睡眠风按键按下/
     {IRcode[3]=0;P0=0x9F;
	  feilin=0;Delay();feilin=1;
	  g=1;high=1; ET0=1;}     
   if(IRcode[3]==0xEB)              //检测到自然风按键按下/
     {IRcode[3]=0;P0=0xBC;
	  feilin=0;Delay();feilin=1;
	  g=2;high=1; ET0=1;}
   if(IRcode[3]==0xE8)              //检测到正常风按键按下/
     {IRcode[3]=0;P0=0x36;
	  feilin=0;Delay();feilin=1;
	  g=3;high=1; ET0=1;}
 

   if(IRcode[3]==0xA9)                     //检测定时5s/
     {IRcode[3]=0;
      P0=0xB9;love=0;mogu=1;h=1;ET1=1;}
   if(IRcode[3]==0xEA)                     //检测定时10s/
     {IRcode[3]=0;
      P0=0xB9;father=0;mogu=1;h=2; ET1=1;}
   if(IRcode[3]==0xE9)                     //检测定时15s/
     {IRcode[3]=0;
      P0=0xB9;mother=0;mogu=1;h=3;ET1=1;}
    
   Delay();
 }
    
     /**************************主程序*************************/
    void main()
    {P0=0; 
	 ET1=0;
     ET0=0;       //关定时中断
     TMOD=0x11;   /*定时器0和1方式1*/   
     TH0=0xF6;    /*定时器装载初值*/   
     TL0=0x3C;
 	 TH1=0x3C;
	 TL1=0xB0;
	 PT1=0;
	 TR1=1;       //启动定时器1/
  	 TR0=1;       /*启动定时器0*/ 
     IT0=1;       //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
     EX0=1;       //外部中断INT0开
     EA=1;        //开所有中断
     CodeTemp=0;  //初始化红外编码字节缓存变量
     Delay();
     while(1)      //等外部中断0
	{}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -