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

📄 红外.c

📁 我自己编码的一个空调红外编码程序,使用的是C语言的精确定时
💻 C
字号:
#include<at89x51.h>
#include<absacc.h>
#include<INTRINS.H>
#define SEGMENT P0
#define BIT_LED P2
#define fosc 12
#define time0 2600	   //26us

unsigned char data display_bit,display_buffer[8];
unsigned char data time0_h,time0_l;
unsigned int idata time0_times;
unsigned char data send_data[6]={0xc1,0x60,0x11,0x22,0x33,0x55};

unsigned int showdata;
unsigned char data TEMP;
int *point;
unsigned int shdata;
unsigned int keyin;
unsigned int kbempty;
 
sbit C =0xA0;
sbit ACC_0=0xE0;
sbit ACC_1=0XE1;
sbit ACC_2=0XE2;
sbit ACC_3=0XE3;
sbit ACC_4=0XE4;
sbit ACC_5=0XE5;
sbit ACC_6=0XE6;
sbit ACC_7=0XE7;
sbit dataout=0xB7;//P3.7

unsigned char get_code(unsigned char i); 
void display(void);
void  breakdata(void);
void unitial(void);
void delay13us(void);
void send(void);
void  getkeyin(void);

/**************************主程序*****************************/
main()
   {
     
	unitial();
	_nop_();
	delay13us();
	ACC_0=1;
	ACC_1=0;
	ACC_2=1;
	keyin=ACC;
	send();
	while(1) 
	{
	getkeyin();
	display();
	
	}
	
	}
/**************初始化******************************/
void unitial(void)
     {
	  //point=&display_buffer[0];
	  display_bit=0x01;
	  BIT_LED=0;
	  TMOD=0X02;
	 // time0_times=65536-time0*fosc/12;
	 // time0_h=(time0_times/256);
	 // time0_l=(time0_times%256);
      //TH0=time0_h;
	  //TL0=time0_l;
	  TH0=0X00;
	  TL0=0XC0;
	  TR0=1; 
	  EA=1;
	  //ET0=1;  
	  dataout=1;
	  P3_2=1;
	  P3_7=1;
	  shdata=keyin;
	}
/*********************************************/
void time0_int(void) interrupt 1
    {
	 //TH0=time0_h;
	 //TL0=time0_l;
	 P1=~P1;
	 }
/***********************************************/
unsigned char get_code (unsigned char i)
     {
	  unsigned char p;
	  switch(i)
	    { 
		case  0:	p=0x3F;	break;	/*0*/
        case  1:    p=0x06;	break;	/*1*/
        case  2:    p=0x5B;	break;	/*2*/ 
        case  3:    p=0x4F;	break;	/*3*/
        case  4:    p=0x66;	break;	/*4*/
        case  5:    p=0x6D;	break;	/*5*/
        case  6:    p=0x7D;	break;	/*6*/
        case  7:    p=0x07;	break;	/*7*/
        case  8:    p=0x7F;	break;	/*8*/
        case  9:    p=0x67;	break;	/*9*/
        case 10:    p=0x77;	break;	/*A*/
        case 11:    p=0x7C;	break;	/*B*/
        case 12:    p=0x39;	break;	/*C*/
        case 13:    p=0x5E;	break;	/*D*/
        case 14:    p=0x79;	break;	/*E*/
        case 15:    p=0x71;	break;	/*F*/
        case 16:    p=0x00;	break;	/*灭灯*/
        default:            break;
	    }	
	  return ((~p) & 0x7F);
	  }
	    
/**************************************************/	 
void display(void)
     {
	  int f;
	  showdata=keyin;
	  breakdata();
	  for(f=0;f<6;f++) 
	      {unsigned char i;
		    switch(display_bit)
              {
			  case 1:i=0;break;
			  case 2:i=1;break;
			  case 4:i=2;break;
			  case 8:i=3;break;
			  case 16:i=4;break;
			 // case 32:i=5;break;
			 // case 64:i=6;break;
			 // case 128:i=7;break;
			  default:break;
			  }
	     BIT_LED=0;
		 SEGMENT=get_code(display_buffer[i]);
		 TEMP=SEGMENT;
		 BIT_LED=display_bit;
		 if(display_bit<0x32)
		     {display_bit=display_bit*2;}
	     else display_bit=0x01;
		 }
	  } 		 
			 
/******************数据拆分**********************/
void  breakdata(void)
     { int j;
	   for(j=0;j<6;j++)
	    {
	     display_buffer[j]=showdata%10;
	     showdata=showdata/10;
		 //*(point+1);
	     }
	  
     }
/*******************************延时13us*********************************/
void delay13us(void)
     { _nop_();
	   _nop_();
	   _nop_();
	   _nop_();
	   _nop_();
	   _nop_();
	   _nop_();
	  }
/**************************数据发送程序********************************/	
void send (void)
   	{ int n;
	  unsigned p;
	  int q;
	  P3_2=0;
	  
//发送9ms发始码   
	 for(p=0;p<680;p++)//3us 700*13=9100
		  {
		   dataout=!dataout;//1us
		   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();//12us
		  }  
		  
//发送4.5ms结果	
	 for(p=0;p<333;p++)//300*13=3900
		   {dataout=1;
			_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();//12us
			} 
				  
   
 for(q=0;q<6;q++)	  
	 { showdata=send_data[q];
	  
	  for(n=0;n<=7;n++) //3us
	    { ACC=showdata;	//1us
		  if(ACC_7==1) //3us  发送1
	         {   int l;	//1us  
			     for(l=0;l<42;l++)       	   
		            {dataout=!dataout;//1
				     _nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12us
				     }				  				   				  
                 for(l=0;l<128;l++)//3us 
			        {dataout=1;	 //1us
				     _nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12us
				    } 
		      }
	     else					  //调制38K信号,发送0;
	        {     int m;
			   for(m=0;m<43;m++)//3us
			      {
			      dataout=!dataout;//1us
				   _nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12us
				  }  

			 for(m=0;m<42;m++)
			      {dataout=1;
				  _nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12us
				  } 
			}
		 showdata=showdata<<1;//7us
		 }//10us
				  
		 for(n=0;n<45;n++)//3us
			      {
			      dataout=!dataout;//1us
				   _nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12us
				  }  
		 P3_2=1;
		 P3_7=1;		  

	   }
	}
/************************************************************
键盘扫描及取键值程序
unsigned char getkeyin(void)
功能:键值放入keyin。
************************************************************/
void  getkeyin(void)
 {
   unsigned char temp;
   P1=0x0f; 
   temp=P1;
   if(temp==0x0f)
     {
      kbempty=0;
 //     keyin=0xff;
      }
   
 
  // if(kbempty==0&&temp!=0x0f)//按键有松开过 
  //   {          
  //     for(i=10;i>0;i--);     //键盘去抖延迟


   P1=0xef;         //P1^4=0
   temp=P1;
   temp=temp&0x0f;
   if (temp!=0x0f)
       {             
        switch(temp)
           {
            case 0x0e:keyin=3;send();break;   //keyin='3'
            case 0x0d:keyin=7;send();break;   //keyin='7'
            case 0x0b:keyin=11;send();break;   //keyin='11'
            case 0x07:keyin=15;send();break;   //keyin='15'
           // default:keyin=0xff;
           }
        kbempty=1;
        //return(keyin) ;
       }

   P1=0xdf;         //P1^5=0
   temp=P1;
   temp=temp & 0x0f;
   if (temp!=0x0f)
      {
       switch(temp)
	      {
           case 0x0e:keyin=2;break;    //keyin='2'
           case 0x0d:keyin=6;break;    //keyin='6'
           case 0x0b:keyin=10;break;    //keyin='10'
           case 0x07:keyin=14;break;   //keyin='14'
         // default:keyin=0xff;
          }
      kbempty=1;
  
      //return(keyin) ;             
      }

   P1=0xbf;         //P1^6=0
   temp=P1;
   temp=temp & 0x0f;              
   if (temp!=0x0f)
      {
      switch(temp)
	      {
           case 0x0e:keyin=1;break;    //keyin='1'
           case 0x0d:keyin=5;break;    //keyin='5'
           case 0x0b:keyin=9;break;    //keyin='9'
           case 0x07:keyin=13;break;       //keyin='13'
          // default:keyin=0xff;
          }
     kbempty=1;
  
     //return(keyin) ;              
    }

   P1=0x7f;         //P1^7=0
   temp=P1;
   temp=temp & 0x0f;
   if (temp!=0x0f)
       {
       switch(temp)
	       {
            case 0x0e:keyin=0;break;    //keyin='0'
            case 0x0d:keyin=4;break;    //keyin='4'      
            case 0x0b:keyin=8;break;    //keyin='8'
            case 0x07:keyin=12;break;   //keyin='12'
          //  default:keyin=0xff;
           }             
      kbempty=1;
      }
   //return(keyin) ;
    }
//  keyin=0xff;  
  //return(keyin);  
 //  }



⌨️ 快捷键说明

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