📄 ckcom.c
字号:
#include "reg51.h"
#include "Mylib.h"
sbit En1=P1^5; //control KbData,CpuTxd to CkData
sbit En2=P1^6; //control CpuTxd to PcRxd
sbit En3=P1^7; //control CkData,PcTxd to CpuRxd
uchar PcState,KeyBuf;
uchar CkState=0;
bit ReceivePcFlag=0,CkRxdFlagOk,PcRxdFlagOk;
bit ReceiveCkFlag=1;
uchar CkBuf[8];
uchar PcKeyBuf[10];
sbit test=P1^0;
sbit test1=P1^1;
sbit test2=P1^2;
sbit test3=P1^3;
bit OkToPcFlag;
void SysInt()
{
SCON=0xd0;
TMOD=0x21;
//TH1=0xf4; //use 11.059M 振荡 波特率2.4k 9bit传送
//TH1=0Xf2; //use 24M 振荡 波特率4.464k 9bit传送
TH1=0Xe6; //use 24M 振荡 波特率2.4k 9bit传送
TR1=1;
TR0=1;
ET0=1;
ES=1;
EA=1;
En1=0;
En2=0;
En3=0;
}
void timer0() interrupt 1
{
static uchar time0low;
TR0=0;
TH0=0x3c; //进入中断需33个机器周期
TL0=0xd1; //时钟每次中断误差为正负1US
TR0=1;
time0low++;
if(time0low==40)
{
time0low=0;
OkToPcFlag=1;
}
}
void Delay600us()
{ uint i;
for( i=0;i<300;i++)
;
}
void Communicate() interrupt 4
{
uchar RBuf;
static uchar i=0;
static uchar KeyCounter=0;
ET0=0;
if(RI)
{
RI=0;
RBuf=SBUF;
if(ReceivePcFlag)
{
if(RBuf==0xbb)
test3=~test3;
switch(PcState)
{
case 0: if(RBuf==0xaa)
PcState=1;
else
PcState=0;
break;
case 1: KeyBuf=RBuf;
if(KeyBuf==0xbb)
{
PcKeyBuf[KeyCounter]=KeyBuf;
KeyCounter=0;
PcRxdFlagOk=1;
ReceivePcFlag=0;
PcState=0;
CkState=0;
i=0;
SCON=0Xd0;
En3=0;
}
else
{
PcKeyBuf[KeyCounter]=KeyBuf;
KeyCounter++;
}
break;
default:break;
}
}
else
{
switch (CkState)
{
case 0: if(RBuf==0xff)
CkState=1;
else
CkState=0;
break;
case 1: if(RBuf==0x09)
CkState=2;
else
if(RBuf==0xff)
break;
else
if(RBuf==02)
CkState=3;
else
CkState=0;
break;
case 2: {
CkBuf[i]=RBuf;
if(i==7)
{
test=~test;
i=0;
CkState=4;
}
else
i++;
}
break;
case 3: {
CkState=0;
}
break;
case 4: if(RBuf==0xfe)
{
CkRxdFlagOk=1;
CkState=0;
}
break;
default: break;
}
}
}
ET0=1;
}
void SentKeyToCk()
{
if(KeyBuf!=0xaa)
{
TB8=0;
SBUF=0x6;
while(!TI)
;
TI=0;
KeyBuf=KeyBuf&0xff;
TB8=P;
SBUF=KeyBuf;
while(!TI)
;
TI=0;
}
else
{
TB8=1;
SBUF=0xfe;
while(!TI)
;
TI=0;
TB8=1;
SBUF=04;//0x6;
while(!TI)
;
TI=0;
TB8=0;
SBUF=03;//KeyBuf;
while(!TI)
;
TI=0;
}
}
void SentCkToPc()
{
uchar i;
SCON=0X50;
SBUF=0xaa;
TB8=P;
while(!TI)
;
TI=0;
for(i=0;i<8;i++)
{
SBUF=CkBuf[i];
TB8=P;
while(!TI)
;
TI=0;
}
SCON=0Xd0;
}
uchar datastate=1;
void Run()
{
static uchar a=0;
if(CkRxdFlagOk)
{
if(PcRxdFlagOk)
{
ES=0;
if(PcKeyBuf[a]!=0xbb)
{
KeyBuf=PcKeyBuf[a];
En2=1;
Delay600us();
SentKeyToCk();
Delay600us();
En2=0;
a++;
}
else
{
PcRxdFlagOk=0;
a=0;
}
ES=1;
}
ES=1;
CkRxdFlagOk=0;
}
}
void main()
{
SysInt();
while(1)
Run();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -