mcu单片机红外遥控发送接收代码(proteus+c)空调温度

接上一篇,不过这次加了两个按钮分别升温降温,空调端LED会显示

 

//发送端遥控器

/* Main.c file generated by New Project wizard
 *
 * Created:   周三 八月 24 2022
 * Processor: 80C51
 * Compiler:  Keil for 8051
 */

#include <reg51.h>
#include <stdio.h>
#include <intrins.h> 

sbit button1=P1^3;
sbit button0=P1^7;

sbit  send=P3^4; //数据发送端
char user;    //用户反码1+254=255
void SendIRdata(char op);//发送子程序预定义

void delay(unsigned int i)  //延时程序
{while(i--);   
  _nop_();}

void main(void)
{
  unsigned value=23; //初始温度23
  send = 0;       //初始化idle空闲态 
  user=1;//用户码
   while(1)
    {
               if(button1==0)
        {           
                while(button1==0);
         value=value+1;
        SendIRdata(value);
        }
        
         if(button0==0)
        {           
                while(button0==0);
         value=value-1;
        SendIRdata(value);
        }
        
    }
}    
    
   /*
  do{
      delay(2000);
      P1=0x11;               //待发送操作码用LED显示
      SendIRdata(0x11);//发送操作码0x11
  }while(1);
}*/

void SendIRdata(unsigned int op)     //发送红外数据子程序
{
  int i;
  char irdata;
   send=1;             //发送引导码高电平
   delay(898);     //延时9ms
   send=0;            //发送引导码低电平
   delay(448);     //延时4.5ms

  irdata=user;   //发送用户码
  for(i=0;i<8;i++)
  {
      send=0;          
    delay(54);         //发送低电平延时0.565ms
     send=1;
   if((bit)(irdata&0x01))  //发送高电平根据最低位0/1选择延时,bit为强制类型转换
     delay(166);                // 如为1延时1.685ms
   else
  delay(54);                   // 如为0延时0.565ms
    irdata=irdata>>1;     // 循环移位,先发最低位
  }

  irdata=~user;    //发送用户反码,同上
  for(i=0;i<8;i++)  
  {
    send=0;
    delay(54);
     send=1;
   if((bit)(irdata&0x01)) 
     delay(166);
   else
  delay(54);
    irdata=irdata>>1;
  } 

   irdata=op;   //发送操作码,同上
  for(i=0;i<8;i++)
  {
    send=0;
    delay(54);
     send=1;
   if((bit)(irdata&0x01))  
     delay(166);
   else
  delay(54);
    irdata=irdata>>1;
  }

  irdata=~op;       //发送操作反码,同上
  for(i=0;i<8;i++)
  {
    send=0;
    delay(54);
     send=1;
   if((bit)(irdata&0x01))  
     delay(166);
   else
  delay(54);
    irdata=irdata>>1;
  }

  send=0;                        //发送完毕,归0
}

//接收端空调

/* Main.c file generated by New Project wizard
 *
 * Created:   周三 八月 24 2022
 * Processor: 80C51
 * Compiler:  Keil for 8051
 */

#include <reg51.h>
#include <stdio.h>
#include <intrins.h> 

#define uchar unsigned char    
#define uint  unsigned int

unsigned char flag=0;       //全局变量用来接收操作码
sbit  rev=P3^2;                 //定义接收端


void delay(unsigned int i)   //延时程序
{while(i--);   
  _nop_();}

unsigned char recv()    //接收程序
{  uchar i;
   uchar user, nuser;   //用户码+用户反码1+254=255
   uchar op,nop;      //操作码+操作反码
   uchar flag=0;
   
   while(rev==0);     //idle闲置状态为0等待直到接收到1
   while(rev==1);     //接收到1并等待0  9ms
   while(rev==0);     //接收到0并等待1  4.5ms
   
      for(i=0;i<8;i++)   //接收用户码
   {
      while(rev==0);  //电平延时0.565ms
      delay(82);         //变为高电平后等待0.84ms
      if(rev)    
     { 
      user=(user>>1) | 0x80;  //如rev为1,接收发送端的1至user最高位并逐渐右移
      while(rev==1);  
     } 
      else             
      user=user>>1;      //如rev为0,接收发送端的0至user最高位并逐渐右移
     } 
 
  
       for(i=0;i<8;i++)   //接收用户反码
   {
      while(rev==0);
      delay(82);
      if(rev)   
     { 
      nuser=(nuser>>1) | 0x80;
      while(rev==1);  
     } 
      else            
      nuser=nuser>>1;
    } 
  
   for(i=0;i<8;i++)      //接收操作码
   {
      while(rev==0);
      delay(82);
      if(rev)   
     { 
      op=(op>>1) | 0x80;
      while(rev==1);  
     } 
      else             
      op=op>>1;
     } 
     
     for(i=0;i<8;i++)      //接收操作反码
   {
      while(rev==0);
      delay(82);
      if(rev)   
     { 
      nop=(nop>>1) | 0x80;
      while(rev==1);  
     } 
      else             
      nop=nop>>1;
     } 
    
     //if(op==~op)  //判断操作码操作反码取反后是否相等
     flag=op;       //操作码赋给flag
    return flag;    //返回flag
  } 
   
void main()

   unsigned  char value=0x23;
   unsigned  i,j;
   P1=value;
  while(1)
   {
     value= recv();    //等待接收
     j=value/10%10;
     i=value%10;
     P1=j*16+i;
    //P1= recv();    //等待接收
    }
 }

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值