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

📄 s51yk.c

📁 基于89C52红外遥控解码数码管显示,用用红外遥控在数码管上显示
💻 C
字号:
/***********************************************************
实验名称:红外遥控解码数码管显示实验
程序说明:本程序要用数码管显示遥控接头解出来的码值,并配有蜂鸣器鸣叫
作者:RF-X1开发板团队
日期:2008-07-20
***********************************************************/
  
      #include <reg51.h>
      #define c(x) (x*120000/120000) 

      sbit Ir_Pin=P1^7;   //遥控接头接口	
	   sbit beep=P3^7;		//蜂鸣器接口
      unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
      0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};                        //共阳极数码显示码0-F.
      unsigned char code Led_Sel[]={0xfe,0xfd,0xfb,0xf7};
      unsigned char Led_Buf[4]; //显示缓冲区
      char Led_Index;                   //位选
      unsigned char Ir_Buf[4]; //用于保存解码结果

/******************************************/ 
/*              延时子程序                */ 
/******************************************/ 
		void delay_50ms(unsigned int t)
		{
 		unsigned int j;   
 		for(;t>0;t--) 
  		  for(j=6245;j>0;j--) 
			{;}
		}

/******************************************/ 
/*          数码管定时扫描                */ 
/******************************************/ 
      timer0() interrupt 1 using 1
      {
      TL0=65536-1000;
      TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
      P0=0xff;
      P2=Led_Sel[Led_Index];                            //位选
      P0=Led_Tab[Led_Buf[Led_Index]];                    //段选

      if(++Led_Index>3) Led_Index=0;                    //四个扫描完了,到第一个数码管
      }

/******************************************/ 
/*        获取码值的低位                  */ 
/******************************************/ 
      unsigned int Ir_Get_Low()
      {
      TL1=0;
      TH1=0;
      TR1=1;
      while(!Ir_Pin && (TH1&0x80)==0);                
      TR1=0;           
      return TH1*256+TL1;
      }

/******************************************/ 
/*        获取码值的高位                  */ 
/******************************************/
      unsigned int Ir_Get_High()
      {
      TL1=0;
      TH1=0;
      TR1=1;
      while(Ir_Pin && (TH1&0x80)==0);
      TR1=0;
      return TH1*256+TL1;
      }

/******************************************/ 
/*            主函数		                  */ 
/******************************************/
      main()
      {
      unsigned int temp;
      char i,j;
      Led_Index=1;

      TMOD=0x11;
      TL0=65536-1000;
      TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
      EA=1;
      ET0=1;
      TR0=1;

      Led_Buf[0]=0;
      Led_Buf[1]=0;
      Led_Buf[2]=0;
      Led_Buf[3]=0; //显示区设成0
      do{
      restart:
      while(Ir_Pin);
      temp=Ir_Get_Low();
      if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000
      temp=Ir_Get_High();
      if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500
      for(i=0;i<4;i++) //4个字节
      for(j=0;j<8;j++) //每个字节8位
      {
      temp=Ir_Get_Low();
      if(temp<c(200) || temp>c(800)) goto restart;
      temp=Ir_Get_High();
      if(temp<c(200) || temp>c(2000)) goto restart;
      Ir_Buf[i]>>=1;
      if(temp>c(1120)) Ir_Buf[i]|=0x80;
      }
      Led_Buf[0]=Ir_Buf[2]&0xf;
      Led_Buf[1]=(Ir_Buf[2]/16)&0xf;
      Led_Buf[2]=Ir_Buf[3]&0xf;
      Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //显示结果
	  P1=Ir_Buf[2];
      beep=0;
	  delay_50ms(2);
	  beep=1;
      }

	  while(1);
   
      }
	 

⌨️ 快捷键说明

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