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

📄 hongwai.c

📁 大家好
💻 C
字号:
//此程序用来显示红外遥控的键码值 包括8位系统识别码及其反码 8位数据码及其反码
#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int

uchar	TH0_BUF=0;     //定义定时器时间缓冲
uchar	TL0_BUF=0;
uchar   INT0_TIMES=0;  //定义中断次数
uchar   RCV_NUM=0;     //接收的数据是第几位
uint  	RH_CODE=0;	   //定义接收码高位
uint 	RL_CODE=0;	   //定义接收码低位
bit   START_FLAG=0;    //定义接收数据开始标志位
bit   RCV_BIT_FLAG=0;  //定义位接收标志位 1 表示接收成功
bit   RCV_SUS_FLAG=0;  //定义字接收标志位 1 表示接收成功

char code disp[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0x30,0x25,0x67,0x23,0x64,0x74};
//                  0    1    2    3    4    5    6    7    8    9    a    b   c    d    e    f    

//char code disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x8e,0xff,0x00};
//                  0    1    2    3    4    5    6    7    8    9   -    f    空   显

char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0; //显示缓冲 其中i0为虚拟位 


delay(uint t)
{ char a;
  while(t--)
  for(a=100;a>0;a--);  }


void initial(void)
{   TMOD=0x01;
	IT0=1;         //外部中断0采用高到低的跳变有效
  	IE=0x81;       //开外部中断0 
	TH0=0;
	TL0=0;
	TR0=0;
	START_FLAG=0;
 	TH0_BUF=0;     //定义定时器时间缓冲
 	TL0_BUF=0;
    INT0_TIMES=0;  //定义中断次数
    RCV_NUM=0;     //接收的数据是第几位
 	RH_CODE=0;	   //定义接收码高位
 	RL_CODE=0;	   //定义接收码低位
    START_FLAG=0;    //定义接收数据开始标志位
    RCV_BIT_FLAG=0;  //定义位接收标志位 1 表示接收成功
    RCV_SUS_FLAG=0;  //定义字接收标志位 1 表示接收成功

	}

display(t)
{while(t--)
 {P0=disp[i8];
  P2=0x7f;
 delay(1); 
 P2=0xff;
  P0=disp[i7];
  P2=0xbf;
  delay(1);
  P2=0xff;
  P0=disp[i6];
  P2=0xdf;
  delay(1);
  P2=0xff;
  P0=disp[i5];
  P2=0xef;
  delay(1);
  P2=0xff;
  P0=disp[i4];
  P2=0xf7;
  delay(1);
  P2=0xff;
  P0=disp[i3];
  P2=0xfb;
  delay(1);
  P2=0xff;
  P0=disp[i2];
  P2=0xfd;
  delay(1);
  P2=0xff;
  P0=disp[i1];
  P2=0xfe;
  delay(1);
  P2=0xff;}     }


void RCV_SUS(void)
{ 
    i8=RH_CODE/4096%16;i7=RH_CODE/256%16;i6=RH_CODE/16%16;i5=RH_CODE%16;
  	i4=RL_CODE/4096%16;i3=RL_CODE/256%16;i2=RL_CODE/16%16;i1=RL_CODE%16;
	initial();
                                                                        }
void RCV_BIT(void)
{ 	uint time0=TH0_BUF*256+TL0_BUF;
	uint KEY_BIT;                         //当前的键值 为0或1
	if(START_FLAG==0)
	   	{   if( time0>12000 && time0<15000 )
			{ START_FLAG=1;  }         //开始 
   												}
 	else if(START_FLAG==1)
		{	
			if( time0> 2000 && time0<2400 )  KEY_BIT=0x8000;
			else if( time0> 900 && time0<1300 )  KEY_BIT=0;
			else KEY_BIT=0;
							
			if(RCV_NUM<16) 
			{ 	RH_CODE=RH_CODE>>1; 
				RH_CODE^=KEY_BIT;		}
			else  
			{	RL_CODE=RL_CODE>>1;
		  		RL_CODE^=KEY_BIT;		}
			
			RCV_NUM++;
			if(RCV_NUM==32) 
				{ 	RCV_NUM=0;	 RCV_SUS();	}		
														}
	RCV_BIT_FLAG=0;												}


main()
{ display(60);
  delay(400);
  initial();
  while(1)
  { 
    display(1);  }
	               }

void ex_input(void) interrupt 0   //外部中断 
{ 
	INT0_TIMES++;
	if(TR0==0) TR0=1;                
  	else if(TR0==1) 
	{ 	TH0_BUF=TH0;
		TL0_BUF=TL0;
		TH0=0;
		TL0=0;
	    //RCV_BIT_FLAG=1;	     //置标志位
        TR0=1;               //开始下一个脉冲的检测
        RCV_BIT();
						}
							}


⌨️ 快捷键说明

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