📄 遥控编码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 + -