#define uchar unsigned char
sbit key0=P3^4;
sbit key1=P3^5;
sbit key2=P3^6;
sbit key3=P3^7;
sbit TX=P2^0;
uchar m;
void v0();
void v1();
void v2();
void v3();
void delay_315();
void main()
{
uchar i;
bit dong=0; //开定时器0中断
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
TX=0;
while(1) {
if(key0==0)
//发送指令0
{
delay_315();
while(key0==0){v3();v2();v0();v0();v0();m=0;while(m<40);}
dong=1;
}
if(key1==0) //发送指令1
{
delay_315();
while(key1==0){v3();v2();v0();v0();v1();m=0;while(m<40);}
dong=1;
}
if(key2==0)
{
delay_315();
while(key2==0){v3();v2();v0();v1();v0();m=0;while(m<40);}
dong=1;
}
if(key3==0)
{
delay_315();
while(key3==0){v3();v2();v0();v1();v1();m=0;while(m<40);}
dong=1;
}
if(dong==1)
{
dong=0;
for(i=0;i<5;i++){v3();v2();v1();v0();v0();m=0;while(m<40);}
}
}
}
void timer0() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
m++;
TF0=0;
}
void v0() // 1MS高电平 500us低电平
{
m=0;
while(m<10)
TX=1;
m=0;
while(m<5)
TX=0;
}
void v1() {
m=0;
while(m<20)
TX=1;
// 2MS高电平 500us低电平
m=0;
while(m<5)
TX=0;
}
void v2() {
m=0;
while(m<40)
TX=1;
m=0;
while(m<40)
TX=0;
}
// 4MS高电平 4ms低电平
void v3() // 1MS高电平 500us低电平
{
m=0;
while(m<10)
TX=1;
m=0;
while(m<5)
TX=0;
}
void delay_315()
{
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<110;j++);
}
//接收程序
#include\"reg52.h\"
#define uchar unsigned char
sbit RX=P3^3;
sbit red0=P0^0;
sbit red1=P0^1;
sbit red2=P0^2;
sbit red3=P0^3;
sbit red4=P0^4;
uchar m;
bit n;
void main()
{
uchar a,b,c,p,x,y; //定义存取的数据
TMOD=0X01;
TH0=(65536-100)/256; TL0=(65536-100)%256; EA=1;
ET0=1;
TR0=1;
EX1=1;
IT1=1;
P0=0XFF;
p=5;
//开定时器0
x=0;
while(1)
{
if(n==1)
{
while(RX==0); //读取协议下降沿
m=0;
EX1=0;
while(RX==1);
if(m>35&&m<45) //读取协议起始位高电平
{
m=0;
while(RX==0);
if(m>35&&m<45) //读取协议起始位低电平
{
m=0;
while(RX==1); //读取数据1
if(m>5&&m<15)a=0;
if(m>15&&m<25)a=4;
while(RX==0);
m=0;
while(RX==1); //读取数据2
if(m>5&&m<15)b=0;
if(m>15&&m<25)b=2;
while(RX==0);
m=0;
while(RX==1); //读取数据3
if(m>5&&m<15)c=0;
if(m>15&&m<25)c=1;
while(RX==0); m=0;
p=a+b+c; x++;
if(x==1)y=p; if(x==2) {
x=0;
if(y==p)
{
//连续收到两次数据才进入匹配
switch(p)
{
case 0:red0=0;red1=1;red2=1;red3=1;red4=1;
break;
case 1:red0=1;red1=0;red2=1;red3=1;red4=1;
break;
case 2:red0=1;red1=1;red2=0;red3=1;red4=1;
break;
case 3:red0=1;red1=1;red2=1;red3=0;red4=1;
break;
case 4:red0=1;red1=1;red2=1;red3=1;red4=0;
break;
}
}
}
}
}
}
}
}
void INT_1() interrupt 2
{
n=1;
}
void timer0() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
m++;
TF0=0;
}