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

📄 1.c

📁 本设计采用ATMEL公司的AT89S52单片机和红外遥控技术实现近距离无线通信的软硬件系统。为了使受控设备识别信号
💻 C
字号:
 #include<REG52.H>
 #define uchar unsigned char
 #define uint  unsigned int
 sbit sendport=P3^0;
 uchar bdata address;
 sbit ad7=address^7;
 uchar bdata datafan;
 sbit datafan7=datafan^7;
 uchar bdata datayuan;
 sbit datayuan7=datayuan^7;  
 uchar key=0x00;
 bit m=0;

 	
	 /*=========关显示==========*/

	 void undisplay()
	 {
	   P2=0x00;
	   P3=0x00;
	  }


	/*=========延时函数==========*/ 

      void delay(uint i) 
      {
        while(--i);        
	    } 


/*=========键盘扫描函数1==========*/ 

       uchar kbscan1()
   {
	 uchar l=0;	 	  	
	 P1=0xff;
	 if(P1==0xff)		 //没有键按下
	 while(1)
	 {
		if(P1!=0xff)
		break;	 
	 }

	 if(P1!=0xff)	     //有键按下
	 {	 
	  delay(0x04e1);			 //延时10毫秒
	  if(P1!=0xff)		//确有键按下
	  {
	      switch(P1)	 
	      {
	       case 0xfe:l=0x06;break;
		   case 0xfd:l=0x5b;break;
		   case 0xfb:l=0x4f;break;
		   case 0xf7:l=0x66;break;
		   case 0xef:l=0x6d;break;		 
		   case 0xdf:l=0x7d;break;
		   case 0xbf:l=0x07;break;
		   case 0x7f:l=0x01;break;	 
		   default: break; 					   //读键值
	       } 
		  }
	  }
	  return l;
  }

		/*=========键盘扫描函数2==========*/ 

 

 uchar kbscan2()
   {
	 uchar l=0;  	
	 P1=0xff;
	 if(P1==0xff)		 //没有键按下
  	while(1)
	 {
		if(P1!=0xff)
		break;
	 	 }
	 if(P1!=0xff)	     //有键按下
	 {
 	  delay(0x04e1);			 //延时10毫秒
	  if(P1!=0xff)		//确有键按下
	  {
	      switch(P1)
 	      {
	       case 0xfe:l=0x7f;break;
		   case 0xfd:l=0x6f;break;
		   case 0xfb:l=0x77;break;
		   case 0xf7:l=0x7c;break;
		   case 0xef:l=0x39;break;	
		   case 0xdf:l=0x5e;break;
		   case 0xbf:l=0x79;break;
		   case 0x7f:l=0x02;break;	 
		   default: break; 					  //读键值
	       } 
		  }
	  }
	  return l;
  }

      /*=========显示函数==========*/ 
    	void display(uchar n)    
	   {   
	       P2=n;
	    } 

	  /*=========发射调制后的高电平函数==========*/ 
        void sendh(uchar n)
		{ 
		  uchar e;  													 
		  sendport=1; 		   
		  for(e=0;e<n;e++)	
		  {		
         #pragma ASM
		  NOP
		  NOP
		  NOP
		  NOP
		  #pragma ENDASM
		  sendport=!sendport;		
		  }	
	    }

	 /*=========发射函数==========*/ 
   void send(uchar qq)
  {
    bit c;
    uchar i;
	datayuan=qq;	
	datafan=~qq;
    sendh(0xef);	   //发送起始位 高电平
    delay(0x007a);	  //发送起始位	低电平
    address=0x55;     //地址码

    for(i=0;i<8;i++)        
   {
     c=ad7;   
     if(c==1) 
     sendh(0x9f);
	 else 
     sendh(0x4f); 
     delay(0x0082);
	 address<<=1;  
    }				//发送地址位 
    
     for(i=0;i<8;i++)              
     {
        c=datayuan7;
        if(c==1)
        sendh(0x9f);
       else
       sendh(0x4f);
        delay(0x0082);	 				 //发送数据位
	   datayuan=datayuan<<1;
      }	  	  

       for(i=0;i<8;i++)
      {
          c=datafan7;
          if(c==1)
          sendh(0x9f);
		  else
          sendh(0x4f);
          delay(0x0082);
		  datafan=datafan<<1;
         }			                  //发送数据反码
        sendh(0x4f);   
        sendport=0;		           //发送结束位
     }

	/*=========初始化==========*/ 

	  void 	original()
	  {
		undisplay();    //关显示
	 	  }

	/*==========键盘扫描函数==========*/

	   kbscan()
	  {
	     if(m==0)
	    {	   
           key=kbscan1();   //键盘取值函数1
		   if(key==0x01)
		  {  
		    m=1;
			key=0x00;
		    }
		  }
		 else
		 {
		    key=kbscan2();   //键盘取值函数2
		    if(key==0x02)
	       { 
		     m=0;
		     key=0x00;
  		        }
		  }
			return key;
		  }


     /*========取发送数据==========*/
	  uchar qudata()
	  {
           uchar  y;
		   switch(key)
	 	      {
	       case 0x06:y=0x01;break;
		   case 0x5b:y=0x02;break;
		   case 0x4f:y=0x03;break;
		   case 0x66:y=0x04;break;								
		   case 0x6d:y=0x05;break;	 
		   case 0x7d:y=0x06;break;
		   case 0x07:y=0x07;break;
		   case 0x7f:y=0x08;break;
		   case 0x6f:y=0x09;break;
		   case 0x77:y=0x0a;break;
		   case 0x7c:y=0x0b;break;
		   case 0x39:y=0x0c;break;										
		   case 0x5e:y=0x0d;break;		 
		   case 0x79:y=0x0e;break;	 
		   default: break; 	
		   }
            return y;
		   }

	 	/*=========主程序==========*/ 
     void main(void)
    {   
	  uchar senddata; 	  			
		original();	 //初始化  
	      
        while(1)
       {  
	   	 kbscan();	   //键盘取值函数

		 if(key!=0)
		 {
              display(key);	           //显示函数
              senddata=qudata();
		      send(senddata);		   //发射函数
              delay(0x30ce);            //延时100ms            
              send(senddata);         //发射函数
			  delay(0xf405);		  //延时0.5s
			  delay(0xf405);		  //延时0.5s
    	      undisplay();            //关显示
		      key=0x00;               //键值清零
		        }
        }
    }

⌨️ 快捷键说明

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