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

📄 rei.cpp

📁 以ms5060为例的红外遥控解码程序
💻 CPP
字号:
#include <AT89x051.h> 
 
void InitCom(void); 
void ComOutChar(unsigned char OutData); 
void DelayA(void); 
void DelayB(void); 
 



void main(void) 
{ 
 unsigned int TempCyc; 
 
 InitCom(); //初始化串口 
  EA = 1; //允许CPU中断 
  IT0 = 1; //INT0下降沿有效 
  EX0 = 1; //开INT0中断; 
 ComOutChar(1); 
 ComOutChar(5); 
 ComOutChar(3); 
 do 
  {  
   for (TempCyc=0; TempCyc<35000; TempCyc++) 
    P3_7 = 0; 
   for (TempCyc=0; TempCyc<30000; TempCyc++) 
    P3_7 = 1;  //工作指示LED 
  } 
 while(1); 
} 
 




//INT0中断 
void INT0Fun(void) interrupt 0 using 2 
{ 

  unsigned char IRCode[2], IROK; 
  unsigned int TempCyc, TempCycB, TempCycA; 

  EX0 = 0; //外部中断0关闭 
  IROK = 0; 

  DelayA(); //延时等待引导码的前半部结束 
  DelayA(); 

 if (!P3_2)  //检验前半部是否过早结束,防干扰 
  { 
       for (TempCycA=0; TempCycA<2; TempCycA++) 
	   { 
          DelayA(); 

          if (P3_2)  //检验前半部是否过早结束,防干扰 
		  { 
             for (TempCyc=0; TempCyc<300; TempCyc++) 
             if (!P3_2) break; //等待bian di , //////////////////////////////////

             if (TempCyc<300) //超时检验 
			 { 
                 for (TempCyc=0; TempCyc<8; TempCyc++) 
				 { 

                      while(!P3_2); //等待P3_2拉高,开始位的下部分 
                      DelayB(); //这里没设超时,实际应用在多功能的设计时应设超时 
                      IRCode[TempCycA] = IRCode[TempCycA]>>1;
					  
                      if (P3_2) //当延时750us 后P3_2仍为高则当前位为1 
					  { 
                         IRCode[TempCycA] = IRCode[TempCycA] | 0x80; 
                         for (TempCycB=0; TempCycB<100; TempCycB++) 
                         if (!P3_2) break; //等待下个位 当位1时高电平为1.5ms, 
                         if (TempCycB>99) //之前已延时了750us, 所以超时应大于1.5ms-750us 
                         goto endchk; //这里最大为1ms 
					  } 


				 } 

			 } else 
               goto endchk;  //超时 

		  }  else 
             goto endchk; 


             IROK++; //当自定码和数据码都完成时为2 
	   } 
 } 


endchk: 

        if (IROK==2) 
		  { 
		   ComOutChar(IRCode[0]); 
		   ComOutChar(IRCode[1]); //连接PC串口查看自定义码和数据码 

		   if (IRCode[1]==0x10) //1号键  //只演示点亮2只LED,读者可以自行扩展控制别的器件 
			P1_7 = ~P1_7; 

		   if (IRCode[1]==0x11) //2号键 
			P1_6 = ~P1_6; 

		   for (TempCyc=0; TempCyc<300; TempCyc++) 
			DelayA(); //延时 

		  } 

  EX0 = 1; 

} 




 
//向串口输出一个字符(非中断方式) 
void ComOutChar(unsigned char OutData) 
{ 
  SBUF = OutData; //输出字符 
 while(!TI); //空语句判断字符是否发完 
  TI = 0; //清TI 
} 





 
//串口初始化 晶振为12M  1 波特率 4800 
void InitCom(void) 
{ 
  SCON = 0x50; //串口方式1,允许接收 
  TMOD = 0x21; //定时器1定时方式2,定时0 为模式1,16 位模式 
  TCON = 0x40; //设定时器1开始计数 
  TH1 = 0xF3; //设波特率为4800 
  TL1 = 0xF3; 
  PCON = 0x80; //波特率加倍控制,SMOD位 
  RI = 0; //清收发标志 
  TI = 0; 
  TR1 = 1; //启动定时器 
} 
 





void  DelayA(void) 
{ 
 unsigned int TempCyc; 
  for (TempCyc=0; TempCyc<650; TempCyc++); //3.5 
} 
 





void DelayB(void) 
{ 
 unsigned int TempCyc; 
  for (TempCyc=0; TempCyc<93; TempCyc++); // 0.75ms 
} 

⌨️ 快捷键说明

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