#include "reg51.h"
sfr AUXR = 0x8E;
sbit RXB = P3^0;
sbit TXB = P3^1;
sbit LED = P3^2;
unsigned char TBUF, RBUF,TDAT, RDAT, TCNT, RCNT, TBIT, RBIT, t, r, Intensity;
unsigned char buf[16], dat[7];
bit TING, RING, TEND, REND, rf;
void Init_INT()
{
TMOD = 0x10;
AUXR = 0x80;
TL0 = 0x00;
TH0 = 0xfd;
TH1 = (65536 - 10) / 256;
TL1 = (65536 - 10) % 256;
TR0 = TR1 = ET0 = ET1 = EA = PT0 = 1;
}
void Init_UART()
{
TING = RING = REND = TCNT = RCNT = 0;
TEND = 1;
}
void RxTx()
{
if (RING)
{
if (--RCNT == 0)
{
RCNT = 3;
if (--RBIT == 0)
{
RBUF = RDAT;
RING = 0;
REND = 1;
}
else
{
RDAT >>= 1;
if (RXB) RDAT |= 0x80;
}
}
}
else if (!RXB)
{
RING = 1;
RCNT = 4;
RBIT = 9;
}
if (--TCNT == 0)
{
TCNT = 3;
if (TING)
{
if (TBIT == 0)
{
TXB = 0;
TDAT = TBUF;
TBIT = 9;
}
else
{
TDAT >>= 1;
if (--TBIT == 0)
{
TXB = 1;
TING = 0;
TEND = 1;
}
else
{
TXB = CY;
}
}
}
}
}
void Function()
{
unsigned char d3, d4, d5, d7;
bit xf, xs;
static unsigned int i;
d3 = dat[2];
d4 = dat[3];
d5 = dat[4];
d7 = dat[6];
if (rf)
{
rf = 0;
if (d3 == 0x05)
{
if (d4 == 0xf3) Intensity = d5;
xs = 0;
}
if (d3 == 0x04)
{
if (d7 == 0xb1)
{
xs = 1;
}
if (d7 == 0xb2)
{
xs = 0;
}
}
}
if(xs)
{
if (xf)
{
if (Intensity < 0xff)
{
if (i++ == 1000)
{
i = 0;
Intensity++;
}
}
else xf = 0;
}
else
{
if (Intensity > 0x00)
{
if (i++ == 1000)
{
i = 0;
Intensity--;
}
}
else xf = 1;
}
}
}
void Catch()
{
static unsigned char i;
if (REND)
{
REND = 0;
buf[r++ & 0x0f] = RBUF;
dat[i] = RBUF;
if (++i == 7)
{
i = 0;
rf = 1;
}
}
if (TEND)
{
if (t != r)
{
TEND = 0;
TBUF = buf[t++ & 0x0f];
TING = 1;
}
}
}
void main()
{
Init_UART();
Init_INT();
while (1)
{
Function();
}
}
void Timer0() interrupt 1 using 1
{
RxTx();
Catch();
}
void Timer1() interrupt 3 using 3
{
static unsigned char i;
TH1 = (65536 - 10) / 256;
TL1 = (65536 - 10) % 256;
if(Intensity > i) LED = 1;
else LED = 0;
if (i++ == 0xff) i = 0;
}