📄 ir_send.c
字号:
//红外发送程序
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define send0 send_pulse_565 (); send_space_1685 ();
#define send1 send_pulse_565 (); send_space_560 ();
uchar SYS_DATA=0x49; //系统码
sbit OUT=P3^7;
void send_bit (uchar one_bit); //发送一位字节
void send_data (uchar one_data); //发送一个数据
//包括一个起始标志 一个系统码及其反码 一个数据码(one_data)及其反码
char code disp[]={0x28,0x7E,0xA2,0x62,0x74,0x61,0x21,0x7A,0x20,0x60,0x30,0x25,0xA7,0x26,0xA1,0xB1};
char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0; //显示缓冲
void delay(uchar t)
{ char a;
while(t--)
for(a=255;a>0;a--); }
void display(uchar t)
{while(t--)
{P0=disp[i1];
P2=0x7f;
delay(1);
P2=0xff;
P0=disp[i2];
P2=0xbf;
delay(1);
P2=0xff;
P0=disp[i3];
P2=0xdf;
delay(1);
P2=0xff;
P0=disp[i4];
P2=0xef;
delay(1);
P2=0xff;
P0=disp[i5];
P2=0xf7;
delay(1);
P2=0xff;
P0=disp[i6];
P2=0xfb;
delay(1);
P2=0xff;
P0=disp[i7];
P2=0xfd;
delay(1);
P2=0xff;
P0=disp[i8];
P2=0xfe;
delay(1);
P2=0xff;} }
void send_pulse_9000 (void) //9ms脉宽
{
TH0=0xdc;
TL0=0xff;
TR0=1;
TR1=1;
while(TR0);
TR1=0;
OUT=1;
}
void send_space_4500 (void) //4.5ms间隔
{
OUT=1;
TH0=0xee;
TL0=0x7f;
TR0=1;
while(TR0);
OUT=1;
}
void send_pulse_565 (void) //0.565ms脉宽
{
TH0=0xfd;
TL0=0xee;
TR0=1;
TR1=1;
while(TR0);
TR1=0;
OUT=1;
}
void send_space_1685 (void) //1.685ms间隔
{
OUT=1;
TH0=0xf9;
TL0=0x7f;
TR0=1;
while(TR0);
OUT=1;
}
void send_space_560 (void) //0.56ms间隔
{
OUT=1;
TH0=0xfd;
TL0=0xea;
TR0=1;
while(TR0);
OUT=1;
}
void send_bit (uchar one_bit)
{
uchar i;
uchar key_num=0x01;
for(i=0;i<8;i++)
{
send_pulse_565 (); //先发0.565毫秒脉宽
if( (one_bit&key_num)==1 )
send_space_1685 (); //先发低位 某位是1则延时1.685ms
else
send_space_560(); //如果是0则延时0.56ms
one_bit=one_bit>>1; //one_bit右移一位
}
}
void send_data (uchar one_data)
{
uint t=1000;
send_pulse_9000(); //起始码 9ms的脉宽 考虑到误差
send_space_4500(); //4.5ms的间隔
send_bit (SYS_DATA); //发系统码
send_bit (~SYS_DATA); //发系统码的反码
send_bit (one_data); //发数据码
send_bit (~one_data); //发数据码的反码
TR1=1;
while(t--);
TR1=0;
OUT=1;
}
void main(void)
{
uchar c=0x77;
uint t=65535;
TMOD=0x21; //T0产生精确时间的延时或脉宽 16位
//T1产生38kHz方波 8位自动重装
TH1=0xf3;
TL1=0xf3;
IE=0x8a;
delay(255);
display(100);
delay(255);
display(100);
while(1)
{
send_data(c);
}
}
void time0 (void) interrupt 1
{
TR0=0;
TR1=0;
}
void time1 (void) interrupt 3 //T1用来产生38kHz方波
{
OUT=~OUT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -