📄 sp23x8.txt
字号:
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!申 明!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
//本驱动程序属于成都视普科技公司所有,仅允许免费用于本公司销售的产品中,未 //
//经书面许可任何单位或个人不可将本程序用于其它用途,否则将追究其法律责任 //
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/***************************************************************************
SP23x8 demo.c source file SP2328/SP2338 serial communication
example for MCS-51 MCU (oscillating crystal: 11.0592MHz)
Author: Wen hua, 2005-07-18
***************************************************************************/
/********************************上位机资源占用*****************************
****** RAM:8(BYTE,不含子串口发送缓冲)+5(BIT),ROM:200BYTE(内核部分) ******
****** 接收一个字节耗用15条指令(MAX),发送一个字节耗用45条指令(MAX)******
***************************************************************************/
//#include <REG52.H>
#include "REG51RX.H"
#define uchar unsigned char
#define uint unsigned int
bit bdata bUartBusy; //上位机串口发送状态标志,"1"表示上位机串口"忙"(正发送数据
//到子串口,新数据只需送入子串口发送缓冲区即可,"0"表示上位
//机串口"空闲",需用户程序将"TI=1"来启动子串口数据发送
bit bdata bInstructFlag; //上位机发送指令请求标志,上位机需要发送指令时必须
//先将待发发送指令放到"InstructBuf",之后将该
//标志设置为"1"即可.标志变为"0"后可继续发送指令
bit bdata bUart0RFlag,bUart1RFlag,bUart2RFlag; //上位机接收到子串口数据
//标志,"1"表示上位机接收到相应子串口数据,主程序可通过查询
//该标志的方式判断相应子串口是否接收到新数据(主程序取走刚
//收到的新数据后,必须将该标志清"0",以便识别下一个新数据)
uchar idata Uart0Tbuf[8]; //子串口0数据发送缓冲区(大小可由用户随意配置)
uchar idata Uart1TBuf[8]; //子串口1数据发送缓冲区(大小可由用户随意配置)
uchar idata Uart2TBuf[8]; //子串口2数据发送缓冲区(大小可由用户随意配置)
uchar idata UartPointer; //子串口发送数据指针,中断服务程序通过该指针轮询
//发送数据到各子串口,保证各子串口的数据不丢失
uchar idata InstructBuf; //指令缓冲(用户可将设置SP2328/SP2338的指令放入
//该寄存器,由驱动程序自动完成指令发送)
uchar idata Uart0TNum,Uart1TNum,Uart2TNum; //等待发送到各
//子串口的字节数,"0"表示相应子串口发送缓冲区"空"
//主程序可以通过判断该标志是否为"0"来决定是否向
//相应子串口发送后续数据
/*****************************************************************************
功能:设定SP2328/SP2338输入、输出地址,可根据实际电路修改
*****************************************************************************/
sbit AdrIn0 =P1^0; /* 连接到SP2328/SP2338的PIN0 (ADRO0)*/
sbit AdrIn1 =P1^1; /* 连接到SP2328/SP2338的PIN1 (ADRO1)*/
sbit AdrOut0=P1^2; /* 连接到SP2328/SP2338的PIN18(ADRI0)*/
sbit AdrOut1=P1^3; /* 连接到SP2328/SP2338的PIN17(ADRI1)*/
#define _DEBUG_SUB_MODULE
/****************************************************************************
功能:上位机串口中断服务函数,自动完成子串口数据发送(自动发送数据包)和数据接收
(单字节接收并缓存)以及自动发送上位机配置指令等
输入:Uart0TNum,Uart1TNum,Uart2TNum,bInstructFlag,InstructBuf,bUartBusy
Uart0Tbuf[???],Uart1TBuf[???],Uart2TBuf[???]
输出:bUart0RFlag,bUart1RFlag,bUart2RFlag,Uart0RBuf,Uart1RBuf,Uart2RBuf,bUartBusy
*****************************************************************************/
uchar RxBuff0[20], RxBuff1[20],RxBuff2[20],Kbuf[20],rxi0,rxi1,rxi2,kk;
uchar idata Uart0RBuf,Uart1RBuf,Uart2RBuf; //上位机接收子串口数据缓
//冲存储器,上位机通过判断"bUart0RFlag"等标志
//是否为"1",来决定是否读取该寄存器的数据
serial () interrupt 4 {
if(RI){
RI=0; //准备解析刚接收到的数据来自于哪个子串口
if(AdrIn1){ //子串口2接收到一个字节
Uart2RBuf=SBUF; //缓存子串口2收到的数据,以便接收后续数据
if(++rxi2>19)
rxi2=0;
RxBuff2[rxi2]= Uart2RBuf;
bUart2RFlag=1; //置子串口2收到数据标志,便于主程序查询
}
else if(AdrIn0){ //子串口1接收到一个字节
Uart1RBuf=SBUF; //缓存子串口1收到的数据,以便接收后续数据
RxBuff1[rxi1++]= Uart1RBuf;
if(rxi1>19) {
rxi1=0;
// bUart1RFlag=1; //置子串口1收到数据标志,便于主程序查询
}
if(RxBuff1[rxi1-1]==0xab) {
Kbuf[kk++]= RxBuff1[rxi1-3];
for(rxi1=0;rxi1<10;rxi1++)
RxBuff1[rxi1]=0;
rxi1=0;
if(kk>8) {
kk=0;
bUart1RFlag=1;
}
}
}
else { //子串口0接收到一个字节
Uart0RBuf=SBUF; //缓存子串口0收到的数据,以便接收后续数据
RxBuff0[rxi0]= Uart0RBuf;
if(++rxi0>19)
rxi0=0;
bUart0RFlag=1; //置子串口0收到数据标志,便于主程序查询
}
}
else{
TI=0; //已经产生发送中断,准备解析下一个需要发送的数据
switch(UartPointer){ //判断即将向哪个子串口发送数据?
case 0:{ //准备向子串口0发送数据
UartPointer++; //下一次发送中断准备向子串口1发送数据
if(Uart0TNum){ //串口0发送缓存区是否有数据需要发送?
AdrOut0=0; //有数据需要发送,则选通子串口0的地址
AdrOut1=0;
SBUF=Uart0Tbuf[--Uart0TNum];//将串口0发送缓存中的一个字节
break; //由子串口0发送到下位机
}
else goto T_NopInstruction; //若子串口0没有数据发送则准备发送空指令
}
case 1:{ //准备向子串口1发送数据
UartPointer++; //下一次发送中断准备向串口2发送数据
if(Uart1TNum){ //串口1发送缓存区是否有数据需要发送?
AdrOut0=1; //有数据需要发送,则选通子串口1的地址
AdrOut1=0;
SBUF=Uart1TBuf[--Uart1TNum];//将串口1发送缓存中的一个字节
break; //由子串口1发送到下位机
}
else goto T_NopInstruction; //若子串口1没有数据发送则准备发送空指令
} //而只能够发送一条空指令用于时序配合
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -