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

📄 遥控编码c编写.c

📁 单片机红外遥控发送接收仿真
💻 C
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define uintlong  unsigned long 

sbit p3_0=P3^0;
sbit p2_1=P2^1;

//sbit out=PSW^7;              //位的等同方式
//sfr cy=PSW^7;
sbit p1_0=P1^0;
sbit p1_1=P1^1;
sbit p1_2=P1^2;
sbit p1_3=P1^3;
bit out;

uint keyvalue=0x00,flag_key=0,value1,value2,keycount=0,i,j,flag_set=0,flag_press=0;
uchar code keycode[4]={0x7f,0xbf,0xdf,0xef};
uchar code portvalue[16]={0x07,0x08,0x09,0x0a,0x04,0x05,0x06,0x0b,0x01,0x02,0x03,0x0c,0x0d,0x00,0x0e,0x0f};
uchar code wy[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

//红外数据部分;

uchar user1=0x00,user2=0x00;   //用户码标志位0和1
uint count=0,endcount=0;

uint irdata=0;

void deltime(void);
void key_scan(void);
void sendirdata(void);

main(void)
{  
  EA = 1; //允许CPU中断 
  TMOD = 0x11; //设定时器0和1为16位模式1 
  ET0 = 1; //定时器0中断允许 
  p3_0=1;
  P1=0xff;
  TH0 = 0xFF; 
  TL0 = 0xE4; //设定时值0为38K 也就是每隔28us中断一次  
  TR0 = 0;
   while(1)
    { key_scan();     
      if(flag_press==1)
	     {
		   flag_press=0;
           TR0=1;
	
           sendirdata();
         
		 }
	}
}
void key_scan(void)
{
 for(i=0;i<=3;i++)
	     {
		   P1=keycode[i];
           if(p1_3==0)
		     {keycount=i*4+0;flag_key=1; break;}
		   if(p1_2==0)
		     {keycount=i*4+1;flag_key=1;break;}
           if(p1_1==0)
		     {keycount=i*4+2;flag_key=1;break;}
		   if(p1_0==0)
		     {keycount=i*4+3;flag_key=1;break;}
		 }
	  if(flag_key==1)
	    { flag_key=0;
		  value1=P1;
		  deltime();
		  value2=P1;
		  if(value1==value2)
			{keyvalue=portvalue[keycount];flag_set=1;flag_press=1;}
		  while(flag_set)
		       {value2=P1;
			    if(value1!=value2)
				   flag_set=0;
			    }
		 }
}
void deltime(void)
{ uint k;
  for(k=0;k<=20;k++)
  {}
}

void time0int(void) interrupt 1 
{ 
  TH0=0xFF; 
  TL0=0xE4; //设定时值为38K 也就是每隔28us中断一次
  count++;

} 
void sendirdata()
{
  uchar s=0,datapd=0;
  //发送9ms起始码的低电平      320 通过接收端得测试得到的数据
   endcount=320;       
  p3_0=0;
  count=0;
  do{}while(count<endcount);

  //发送4.5ms的结果码高电平
  endcount=180;                 //160通过接收端得测试得到的数据
  count=0;
  p3_0=1;
  do{}while(count<endcount); 

 //发送用户码1    由于已经设置了用户码分别为0和0所以这里直接发送,这里连发16个位0。
//如果用户码不一样,这里就要进行修改了。
  for(s=0;s<=15;s++)
    {
      ///下面发送0.56ms低电平和0.56ms高电平   20和60为计算的数据
     endcount=20;
     count=0;
	 p3_0=0;
     do{}while(count<endcount);
    
	 endcount=20;
     count=0;
	 p3_0=1;
     do{}while(count<endcount);
	} 	 
 //发送数据
 irdata=keyvalue; 
  for(s=0;s<=7;s++)
    {       
     datapd=irdata & wy[s];
     if (datapd==0)
        {endcount=20;count=0;}       
	 else
	    {endcount=60;count=0;}        
     p3_0=0;
     do{}while(count<endcount);
   //发送公共的0.56ms高电平
     endcount=20;count=0;
     p3_0=1;
     do{}while(count<endcount);
    }
  //发送数据反向 
 irdata=keyvalue; 
  for(s=0;s<=7;s++)
    {       
     datapd=irdata & wy[s];
     if (datapd==0)
        {endcount=60;count=0;}       
	 else
	    {endcount=20;count=0;}        
     p3_0=0;
     do{}while(count<endcount);
   //发送公共的0.56ms高电平
     endcount=20;count=0;
     p3_0=1;
     do{}while(count<endcount);
    }
     TR0=0;   
}




⌨️ 快捷键说明

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