📄 demo232.c
字号:
/*
#define LOOPBACK 如果想本地回放,不能注释掉此定义
#define PARALLEL 0
南京梧桐 11:27:06
这个定义,放开是并行工作方式
南京梧桐 11:27:17
注释掉是串行工作方式
*/
#include "Demo232.h"
#define PARALLEL
#define LOOPBACK //如果想本地回放,不能注释掉此定义
HIBYTE pFrameData[34];
BYTE nRXD_STATE = STATE_RXD_IDLE;
BYTE pRXBUF[8];
BYTE nRxByteCnt;
BOOL bReceived = 0;
main()
{
BYTE nI;
DISABLE;
#ifdef PARALLEL
PS1_SDO = 0;
PS2_SOCK = 0;
#else
PS2_SOCK = 0;
PS1_SDO = 1;
PRD_SOSTRB = 1;
P0 = 0;
#endif
//Reset AMBE1000
_AMBERST = 0;
for(nI = 0; nI < 100; nI++) Delay15uS();
_AMBERST = 1;
pFrameData[0] = 0x13;
pFrameData[1] = 0xec;
for(nI = 2; nI < 34; nI++)
{
pFrameData[nI] = 0;
}
Uart_Initial();
ES = 1;
ENABLE;
#ifdef PARALLEL
while(1)
{
while(!EPR);
AMBEReadParallel();
TXData();
while(!DPE);
AMBEWriteParallel();
}
#else
while(1)
{
while(!EPR);
//if(EPR)
AMBEReadSerial();
while(!DPE);
//if(DPE)
AMBEWriteSerial();
}
#endif
}
void AMBEReadParallel(void)
{
BYTE nI;
P0 = 0xFF;
for(nI = 0; nI < 34; nI++)
{
PRD_SOSTRB = 0;
pFrameData[nI]= P0;
PRD_SOSTRB = 1;
Delay15uS();//大于350个AMBE1000的时钟周期
}
}
void AMBEWriteParallel(void)
{
BYTE nI;
P0 = 0x00;
#ifdef LOOPBACK
for(nI = 0; nI < 34; nI++)
{
P0 = pFrameData[nI];
PWR_SISTRB = 0;
PWR_SISTRB = 1;
Delay15uS();//大于350个AMBE1000的时钟周期
}
#else
if(bReceived)
{
DISABLE;
for(nI = 0; nI < 6; nI++)
pFrameData[nI+10] = pRXBUF[nI];
bReceived =0;
ENABLE;
for(nI = 0; nI < 34; nI++)
{
P0 = pFrameData[nI];
PWR_SISTRB = 0;
PWR_SISTRB = 1;
Delay15uS();//大于350个AMBE1000的时钟周期
}
}
#endif
}
void AMBEReadSerial(void)
{
BYTE nI, nK ,nTemp;
for(nI = 0; nI < 17; nI ++)
{
PRD_SOSTRB = 0;
nTemp = 0;//xFF;
for(nK = 0; nK < 8; nK ++)
{
PS2_SOCK = 1;
if(PS1_SDO == 1) Sfr_Bit_Set(nTemp,7-nK);
PS2_SOCK = 0;
}
pFrameData[2*nI] = nTemp;
PRD_SOSTRB = 1;
nTemp = 0;
for(nK = 0; nK < 8; nK ++)
{
PS2_SOCK = 1;
if(PS1_SDO == 1) Sfr_Bit_Set(nTemp,7-nK);
PS2_SOCK = 0;
}
pFrameData[2*nI+1] = nTemp;
Delay15uS();//大于350个AMBE1000的时钟周期
}
}
void AMBEWriteSerial(void)
{
BYTE nI, nK ,nTemp;
for(nI = 0; nI < 17; nI++)
{
PWR_SISTRB = 0;
//Delay();
SICK = 0;
SICK = 1;
nTemp = pFrameData[2*nI];
for(nK = 0; nK <=7; nK++)
{
SICK = 0;
SDI = Sfr_Bit_Test_True(nTemp ,7-nK);
SICK = 1;
}
PWR_SISTRB = 1;
nTemp = pFrameData[2*nI+1];
for(nK = 0; nK <=7; nK++)
{
SICK = 0;
SDI = Sfr_Bit_Test_True(nTemp ,7-nK);
SICK = 1;
}
Delay15uS();//大于350个AMBE1000的时钟周期
}
}
//P89C51 24Mhz
void Delay15uS(void)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
void Uart_Initial(void)
{
//Mode 1 ,Receive Enable
SCON = 0x50;
//Mode 3 ,Receive Enable
// SCON = 0xD0;
//SMOD = 1
PCON = 0x80;
//T0 T1 Mode 2(8bit auto reload Timer)
TMOD = 0x22;
// PCON = 0x00;//9600BPS
// SM2 = 1;
// TB8 = 1;
//19200BPS 22.1184MHz Crystal
TL1 = 0xFA;
TH1 = 0xFA;
// TL1 = 0xFB;
// TH1 = 0xFB;
bReceived = 0;
TR1 = 1;
}
void TXData(void)
{
BYTE nI;
SBUF = 0x13;
while(!TI);
TI = 0;
SBUF = 0xEC;
while(!TI);
TI = 0;
for(nI = 0; nI < 6; nI++)
{
SBUF = pFrameData[nI+10];
while(!TI);
TI = 0;
}
}
//AMBE1000:2.4kbps
//Head:0x13ec
//Packet:Head + 6 Bytes Voice Data
void Uart_INTService(void) interrupt INTERRUPT_UART
{
BYTE nRxData;
//if(TI == 1) return;
if(RI == 1)
{
RI = 0;
if(bReceived) return;
nRxData = SBUF;
switch(nRXD_STATE)
{
case STATE_RXD_IDLE:
{
if (nRxData == 0x13) //Head
{
nRXD_STATE = STATE_RXD_HEAD;
nRxByteCnt = 0;
}
break;
}
case STATE_RXD_HEAD:
{
if (nRxData == 0xEC) //Head
{
nRXD_STATE = STATE_RXD_DATA;
nRxByteCnt = 0;
}
else
{
nRXD_STATE = STATE_RXD_IDLE;
nRxByteCnt = 0;
}
break;
}
case STATE_RXD_DATA: //Voice Data
{
pRXBUF[nRxByteCnt] = nRxData;
nRxByteCnt ++;
if(nRxByteCnt == 6)
{
nRxByteCnt = 0;
bReceived = 1;
nRXD_STATE = STATE_RXD_IDLE;
}
break;
}
default: break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -