📄 remoter(双向通讯即遥控头).c
字号:
#include "reg51.h"
#include< intrins.h>
typedef unsigned char uchar;
typedef unsigned char uChar;
typedef unsigned int ushort;
typedef unsigned short uInt2;
typedef unsigned long uInt4;
typedef unsigned char BYTE;
typedef uChar BOOL;
#define FALSE 0
#define TRUE 1
sfr CHPENT = 0xf6;
sfr CHPCON = 0xbf;
#define Pro_Head 0
#define Pro_LenHigh 1
#define Pro_LenLow 2
#define Pro_Serial 3
#define Pro_Type 4
#define Pro_Data 5
#define Pro_Sum 6
void Init(void);
void delay(uchar);
void SendCharsToSerial(uchar *p,uchar);
void PrintNum(uChar i);
volatile uInt2 gSystemTick=0;
volatile uChar gReceiveState = Pro_Head;
volatile uChar xdata pReceiveBuffer[255] ;//288
//volatile uChar idata pReceiveBuffer[127] ;
//volatile uChar pReceiveBuffer[60] ;
volatile uChar gReceiveTimeout = 8;
volatile uChar gSerialReceiveFlag=0;
volatile uInt2 gSendTimeout = 0;
volatile uInt2 gSendArray=0;
volatile uChar gSendBit=0;
volatile uInt2 gSendLen = 0;
#define OpenInt0AndCloseSerial() ES=0; EX0=1
#define CloseInt0AndOpenSerial() EX0=0; ES=1
volatile uChar g776SendFlag=0;
volatile uChar g776SendArray[10];
volatile uChar g776SendBytePos=0;
volatile uChar g776SendBitPos=0;
volatile uChar g776SendFinishFlag = 0;
volatile uChar g776SendTimeout = 0;
#define Nec_Null 0
#define Nec_Head 1
#define Nec_FacDat 2
volatile uChar gNecState = Nec_Null;
volatile uInt2 gIrTick;//per tick 200us
volatile uChar gIrKeyValue = 0;
volatile uChar gKeyValue = 0;
sbit CLK = P3^2;
sbit DAT = P1^7;
sbit TEST12 = P1^2;
sbit TEST13 = P1^3;
const uChar code pByteMap[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void init_reg(void)
{
CHPENT=0x87;
CHPENT=0x59;
CHPCON|=0x10;
CHPENT=0;
}
void Init(void)
{
TMOD=0x21;
TH0=0xfa;
TL0=0x00;
ET0=1;
EX0=0;
EX1=1;
// TH1=0xfa;//0xf4 is 4800 for 22.1184 ,0xfa is 9600 for 22.1184
// TL1=0xfa;//0xfd for 19200
TH1=0xf4;
TL1=0xf4;
ET1=0;
PCON=0x80; //bandrate=19200 for 11.0592
// PCON=0x00; //bandrate=19200 for 22.1184
SCON=0x50;
RI=TI=0;
ES=1;
TR1=1;
TR0=1;
EA=1;
IT0=1;
IT1=1;
P1=0xff;
IP=0x05;
CloseInt0AndOpenSerial();
init_reg();
}
void SendCharsToSerial(uchar *p,uchar count)
{
uchar i;
EA=0;
for(i=0 ; i<count; i++)
{
SBUF = p[i];
while(!TI);
TI=RI=0;
}
EA=1;
}
void PrintNum(uChar i)
{
#define SBUF_SERIAL SBUF=tTemp + 0x30; \
while(!TI); \
TI=RI=0
uChar tTemp = i/100;
EA=0;
SBUF_SERIAL;
tTemp = (i%100)/10;
SBUF_SERIAL;
tTemp = i%10;
SBUF_SERIAL;
EA=1;
}
void Timer0()interrupt 1 //for all sort of timeout and system'tick
{
TR0 = 0 ;
// TH0=0xfb;
// TL0=0xf5; //560us for 22.1184M
TH0=0xfe;
TL0=0x8f; //200us for 22.1184M
TR0 = 1 ;
if(gReceiveTimeout)
gReceiveTimeout--;
if(gSendTimeout)
gSendTimeout--;
if(g776SendTimeout)
g776SendTimeout--;
gSystemTick++;
}
void Int1() interrupt 2 //for remoter
{
#define dIr_Margin 2
static uChar sTempCnt = 0;
static uChar sIrBuffer[4];
switch(gNecState)
{
case Nec_Null:
gIrTick=gSystemTick;
gNecState = Nec_Head;
sTempCnt=0;
break;
case Nec_Head:
{
if((gSystemTick>=(gIrTick+67-dIr_Margin)) && (gSystemTick<=(gIrTick+67+dIr_Margin)))
{
gIrTick=gSystemTick;
gNecState = Nec_FacDat;
}
else
{
gNecState = Nec_Null;
}
break;
}
case Nec_FacDat:
if((gSystemTick>=(gIrTick+6-dIr_Margin)) && (gSystemTick<=(gIrTick+6+dIr_Margin)))//0
sIrBuffer[sTempCnt/8] &= ~pByteMap[sTempCnt%8];
else if((gSystemTick>=(gIrTick+11-dIr_Margin)) && (gSystemTick<=(gIrTick+11+dIr_Margin)))//1
sIrBuffer[sTempCnt/8] |= pByteMap[sTempCnt%8];
else
gNecState = Nec_Null;
sTempCnt++;
gIrTick = gSystemTick ;
if(sTempCnt==32)
{
gNecState = Nec_Null;
if((sIrBuffer[0]==~sIrBuffer[1])&&(sIrBuffer[2]==~sIrBuffer[3]))
gIrKeyValue = sIrBuffer[2];
}
break;
default:
gNecState = Nec_Null;
break;
}
}
void Int0() interrupt 0 //for bi_communication
{
//for receive data from 776
if(g776SendFlag==1)
{
DAT = 1;
if(DAT==1)
g776SendArray[g776SendBytePos] |= pByteMap[g776SendBitPos];
else
g776SendArray[g776SendBytePos] &= ~pByteMap[g776SendBitPos];
g776SendTimeout = 200;
g776SendBitPos++;
if(g776SendBitPos==8)
{
g776SendBitPos=0;
if(++g776SendBytePos==10)
{
g776SendBytePos=0;
g776SendFlag = 0;
DAT = 1;
g776SendFinishFlag = 1;
}
}
return;
}
//send data to 776
if((gSendArray==0)&&(gSendBit==0))
return;
if(pReceiveBuffer[gSendLen-gSendArray]&pByteMap[8-gSendBit])
DAT =1;
else
DAT =0;
gSendTimeout = 200;
if(gSendBit)
gSendBit-=1;
if((gSendBit==0)&&(gSendArray))
{
gSendArray--;
if(gSendArray)
gSendBit=8;
else
DAT = 1;//finished send
}
}
void delay(uChar a)//delay(1) for 500us
{
uChar i,k;
for(k=0 ;k<a; k++)
for(i=0 ;i<200; i++)
_nop_();
}
void Serial_int(void) interrupt 4
{
static uChar sReceiveCheckSum = 0;
static uInt2 sTempPos=0 ;
uChar c;
if(_testbit_(RI))
{
RI=0;
TI=0;
c=SBUF;
switch(gReceiveState)
{
case Pro_Head:
if(c==0x24)
{
gReceiveState=Pro_LenHigh;
sReceiveCheckSum=c;
pReceiveBuffer[0]=c;
gReceiveTimeout=40; //20ms
}
break;
case Pro_LenHigh:
if((c==0x30)||(c==0x31))
{
gReceiveState=Pro_LenLow;
sReceiveCheckSum +=c;
pReceiveBuffer[1]=c;
if(gReceiveTimeout==0)
gReceiveState=Pro_Head;
else
gReceiveTimeout=40;
}
else
gReceiveState=Pro_Head;
break;
case Pro_LenLow:
{
gReceiveState=Pro_Serial;
pReceiveBuffer[2] = c;
sReceiveCheckSum +=c;
if(gReceiveTimeout==0)
gReceiveState=Pro_Head;
else
gReceiveTimeout=40;
}
break;
case Pro_Serial:
{
gReceiveState=Pro_Type;
sReceiveCheckSum +=c;
pReceiveBuffer[3]=c;
sTempPos=4;
if(gReceiveTimeout==0)
gReceiveState=Pro_Head;
else
gReceiveTimeout=40;
}
break;
case Pro_Type:
{
gReceiveState=Pro_Data;
sReceiveCheckSum +=c;
pReceiveBuffer[4]=c;
sTempPos=5;
if(gReceiveTimeout==0)
gReceiveState=Pro_Head;
else
gReceiveTimeout=40;
}
break;
case Pro_Data:
if(pReceiveBuffer[2]>sTempPos)
{
pReceiveBuffer[sTempPos++] = c;
sReceiveCheckSum+=c;
if((pReceiveBuffer[2]-1)==sTempPos)
gReceiveState = Pro_Sum;
if(gReceiveTimeout==0)
gReceiveState=Pro_Head;
else
gReceiveTimeout=40;
}else
gReceiveState=Pro_Head;
break;
case Pro_Sum:
if(c==sReceiveCheckSum)
{
pReceiveBuffer[sTempPos]=c;
gSerialReceiveFlag = 1;
gReceiveState = Pro_Head;
}
break;
default:
gReceiveState=Pro_Head;
break;
}
}
}
uChar KeyScan(void) //P1.0~P1.3
{
#define dPortNum 4 //10Key
uChar i=0;
uChar tTempKeyValue=0;
uChar tTemp = 0x0f;
for(i=0 ;i<dPortNum; i++)
{
P1=0x0f&tTemp;
if(P1&0x0f != 0x0f&tTemp)
{
tTempKeyValue=P1&0x0f + 4*i;
break;
}
tTemp<<=1;
}
return tTempKeyValue;
}
uChar GetKeyValue(void)
{
uChar tKeyValue = KeyScan();
uChar tKeyValue1=0;
if(tKeyValue)
delay(5);
else
return 0;
tKeyValue1=KeyScan();
if(tKeyValue == tKeyValue1)
return tKeyValue;
else
return 0;
}
void main(void)
{
Init();
while(1)
{
if(gSerialReceiveFlag == 1)
{
OpenInt0AndCloseSerial();
gSerialReceiveFlag = 0;
gSendArray = pReceiveBuffer[2];
gSendLen = gSendArray;
gSendBit=8;
gSendTimeout = 200;
DAT = 0;
}
if(g776SendFinishFlag == 1)
{
uChar i;
g776SendFinishFlag = 0;
CloseInt0AndOpenSerial();
if((g776SendArray[0]==0x55)&&(g776SendArray[1]==0x23)&&(g776SendArray[2]==0x34)
&&(g776SendArray[3]==0x45)&&(g776SendArray[4]==0x56))
SendCharsToSerial("Success:",7);
else
SendCharsToSerial("Fail:",5);
for(i=0;i<5;i++)
PrintNum(g776SendArray[i]);
SendCharsToSerial("Para:",4);
PrintNum(gNecState);
}
if((gSendArray==0)&&(gSendBit ==0)&&(g776SendFlag==0))
{
CloseInt0AndOpenSerial();
DAT=1;
CLK=1;
if(DAT == 0)
{
DAT = 0;
g776SendFlag = 1;
g776SendBitPos=0;
g776SendBytePos = 0;
g776SendTimeout=200;
OpenInt0AndCloseSerial();
}
}
if((gSendTimeout ==0)&&((gSendArray!=0)||(gSendBit!=0)))//fail send and restart .
{
OpenInt0AndCloseSerial();
gSendTimeout = 200;
gSendArray =gSendLen;
gSendBit=8;
DAT = 0;
}
if((g776SendTimeout==0)&&(g776SendFlag == 1))//fail and GiveUp
{
g776SendFlag = 0;
g776SendBytePos = 0;
g776SendBitPos = 0;
DAT = 1;
}
if(gIrKeyValue)
{
SendCharsToSerial("ir:",3);
PrintNum(gIrKeyValue);
if(gIrKeyValue==13)
{
PrintNum(gSendArray);
PrintNum(gSendBit);
PrintNum(g776SendFlag);
}
gIrKeyValue = 0;
}
/*
if( (gKeyValue=GetKeyValue())!=0)
{
SendCharsToSerial("key:",4);
PrintNum(gKeyValue);
gKeyValue = 0;
}
*/
if((gSystemTick-gIrTick)>500)
{
if(gNecState != Nec_Null)
{
gIrTick = gSystemTick;
gNecState = Nec_Null;
}
}
}//while(1)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -