接上一篇,不过这次加了两个按钮分别升温降温,空调端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(); //等待接收
}
}