📄 send.c
字号:
#include <reg52.h>
#include <intrins.h>
sbit P3_4=P3^2;
sbit P3_2=P3^4;
sbit P2_0=P2^0;
sbit P2_1=P2^4;
sbit P2_7=P2^7;
sbit P2_2=P2^2;
sbit P2_5=P2^5;
unsigned int endcount; //终止延时计数
static unsigned char Flag; //红外发送标志
unsigned char iraddr1; //十六位地址的第一个字节
unsigned char iraddr2; //十六位地址的第二个字节
unsigned char iraddr3;
unsigned char iraddr4;
void SendIRdata(char p_irdata1,char p_irdata2,char p_irdata3);
void delay_send();
void delay1_send();
char getkey()
{
if(!P2_0)
{
delay_send();
if(!P2_0)return 1;
} //last
if(!P2_1)
{
delay_send();
if(!P2_1)return 2;
} //next
if(!P2_2)
{
delay_send();
if(!P2_2)return 3;
} //sound+
if(!P2_5)
{
delay_send();
if(!P2_5)return 4;
} //sound-
return 0;
}
void main(void)
{
char key=0;
while(1){
key=getkey();
P3_4 = 1;
// key=1;
if(key==1)SendIRdata(0x01,0xfd,0xca);//last
if(key==2)SendIRdata(0x01,0xfd,0xd2);//next
if(key==3)SendIRdata(0x01,0xfd,0xc1);//sound+
if(key==4)SendIRdata(0x01,0xfd,0x99);//sound-
if(key!=0)delay1_send();
}
}
void SendIRdata(char p_irdata1,char p_irdata2,char p_irdata3)
{
int i;
iraddr1=p_irdata1;
iraddr2=p_irdata2;
iraddr3=p_irdata3;
iraddr4=~p_irdata3;
endcount=350;
P3_4=0;
while(endcount!=0)
{
_nop_();
endcount--;
P2_7=~P2_7;
}
//发送4.5ms的结果码
endcount=350;
P3_4=1;
while(endcount!=0)
{
_nop_();
endcount--;
P3_2=~P3_2;
}
//发送十六位地址的前八位
//irdata=iraddr1;
for(i=0;i<8;i++)
{
//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平) 字串6
P3_4=0;
endcount=47;
while(endcount!=0)
{
_nop_();
endcount--;
P2_7=~P2_7;
}
//停止发送红外信号(即编码中的高电平)
if(iraddr1&0x01==1) //判断二进制数个位为1还是0
{
endcount=127; //1为宽的高电平
}
else
{
endcount=47; //0为窄的高电平
}
P3_4=1;
while(endcount!=0)
{
_nop_();
endcount--;
P3_2=~P3_2;
}
iraddr1=iraddr1>>1;
}
for(i=0;i<8;i++)
{
P3_4=0;
//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平) 字串6
endcount=47;
while(endcount!=0)
{
_nop_();
endcount--;
P2_7=~P2_7;
}
//停止发送红外信号(即编码中的高电平)
if(iraddr2&0x01==1) //判断二进制数个位为1还是0
{
endcount=127; //1为宽的高电平
}
else
{
endcount=47; //0为窄的高电平
}
P3_4=1;
while(endcount!=0)
{
_nop_();
endcount--;
P3_2=~P3_2;
}
iraddr2=iraddr2>>1;
}
for(i=0;i<8;i++)
{
P3_4=0;
//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平) 字串6
endcount=47;
while(endcount!=0)
{
_nop_();
endcount--;
P2_7=~P2_7;
}
//停止发送红外信号(即编码中的高电平)
if(iraddr3&0x01==1) //判断二进制数个位为1还是0
{
endcount=127; //1为宽的高电平
}
else
{
endcount=47; //0为窄的高电平
}
P3_4=1;
while(endcount!=0)
{
_nop_();
endcount--;
P3_2=~P3_2;
}
iraddr3=iraddr3>>1;
}
for(i=0;i<8;i++)
{
P3_4=0;
//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平) 字串6
endcount=47;
while(endcount!=0)
{
_nop_();
endcount--;
P2_7=~P2_7;
}
//停止发送红外信号(即编码中的高电平)
if(iraddr4&0x01==1) //判断二进制数个位为1还是0
{
endcount=127; //1为宽的高电平
}
else
{
endcount=47; //0为窄的高电平
}
P3_4=1;
while(endcount!=0)
{
_nop_();
endcount--;
P3_2=~P3_2;
}
iraddr4=iraddr4>>1;
}
endcount=47;
P3_4=0;
while(endcount!=0)
{
_nop_();
endcount--;
P2_7=~P2_7;
}
P3_4=1;
}
void delay_send()
{
char i,j;
for(i=20;i>0;i--)
{
for(j=200;j>100;j--);
}
}
void delay1_send()
{
unsigned int j;
// for(i=0;i<3;i++) //3*177=531uS
for(j=0;j<32767;j++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -