?? netgapuart.c~
字號:
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#include "netgapuart.h"
#define uint unsigned int
#define uchar unsigned char
#define WAIT 160
bit bdata bUart0RFlag, bUart1RFlag, bUart2RFlag, bUartRFlag;
/** receiving memory of upper machine, read data while Uart0RFlag=1 */
uchar idata Uart0RBuf,Uart1RBuf,Uart2RBuf;
/** upper machine sends state flag, '1' means com port 'busy'
* (sending data to sub com port, just sending new data to sending buffer of
* sub comport. '0' means idle, user application should set 'TI=1' to launch
* data sending of sub comport
*/
bit bdata bUartBusy;
/* upper request flag of sending instruction. Before sending upper machine must
* put instruction to be transmitted into 'InstructBuf'. Then set this flag to
* '1', after this flag being changed to '0', this process could be done again
*/
bit bdata bInstructFlag;
uchar idata InstructBuf; //指令緩沖(用戶可將設置SP2328/SP2338的指令放入
//該寄存器,由驅動程序自動完成指令發送)
uchar idata UartPointer; //子串口發送數據指針,中斷服務程序通過該指針輪詢
//發送數據到各子串口,保證各子串口的數據不丟失
uchar idata Uart0Tbuf[8]; /* sub Uart 0 data sending buffer*/
uchar idata Uart1TBuf[8]; /* sub Uart 1 data sending buffer*/
uchar idata Uart2TBuf[8]; /* sub Uart 2 data sending buffer*/
uchar idata Uart0RBuf,Uart1RBuf,Uart2RBuf; //上位機接收子串口數據緩
//沖存儲器,上位機通過判斷"bUart0RFlag"等標志
//是否為"1",來決定是否讀取該寄存器的數據
uchar idata Uart0TNum,Uart1TNum,Uart2TNum; //等待發送到各
//子串口的字節數,"0"表示相應子串口發送緩沖區"空"
//主程序可以通過判斷該標志是否為"0"來決定是否向
//相應子串口發送后續數據
sbit AdrIn0 =P1^0;
sbit AdrIn1 =P1^1;
sbit AdrOut0=P1^2;
sbit AdrOut1=P1^3;
uint data localstate = UNINIT; //local single chip state
uint data buffer0=0; //定時器計數變量
uint data buffer1=0;
sbit green=P1^4;
sbit red=P1^5;
void delay(uint i)
{
buffer1=0;
while(buffer1<i);
}
/*串口服務子程序*/
serial () interrupt 4
{
if(RI)
{
RI=0; //準備解析剛接收到的數據來自于哪個子串口
bUartRFlag=1; //產生串口中斷標志位
if(AdrIn1){ //子串口2接收到一個字節(未用)
Uart2RBuf=SBUF; //緩存子串口2收到的數據,以便接收后續數據
bUart2RFlag=1; //置子串口2收到數據標志,便于主程序查詢
} else if(AdrIn0){ //子串口1接收到一個字節
Uart1RBuf=SBUF; //緩存子串口1收到的數據,以便接收后續數據
bUart1RFlag=1; //置子串口1收到數據標志,便于主程序查詢
} else { //子串口0接收到一個字節
Uart0RBuf=SBUF; //緩存子串口0收到的數據,以便接收后續數據
bUart0RFlag=1; //置子串口0收到數據標志,便于主程序查詢
}
}
if(TI)
{
// TI=0; //已經產生發送中斷,準備解析下一個需要發送的數據
/* switch(UartPointer){ //判斷即將向哪個子串口發送數據?
case 0:{ //準備向子串口0發送數據
AdrOut0=0; //有數據需要發送,則選通子串口0的地址
AdrOut1=0;
SBUF=Uart1RBuf; //將串口0發送緩存中的一個字節
break; //由子串口0發送到下位機
}
case 1:{ //準備向子串口1發送數據
AdrOut0=1; //有數據需要發送,則選通子串口1的地址
AdrOut1=0;
SBUF=Uart0RBuf; //將串口1發送緩存中的一個字節
break; //由子串口1發送到下位機
} //而只能夠發送一條空指令用于時序配合
case 2:{ //準備向子串口2發送數據
AdrOut0=0; //有數據需要發送,則選通子串口2的地址
AdrOut1=1;
SBUF=Uart0TBuf; //將串口2發送緩存中的一個字節
break; //由子串口2發送到下位機
} //而只能夠發送一條空指令用于時序配合
default:{
else {bUartBusy=0;break;}//若所有子串口數據都已經發送完畢,則立即
} //清除"串口忙"標志(主程序將根據該標志來決定是否執行"TI=1"這條指令)
bUartBusy=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沒有數據發送則準備發送空指令
} //而只能夠發送一條空指令用于時序配合
case 2:{ //準備向子串口2發送數據
UartPointer++; //下一次發送中斷準備發送空指令
if(Uart2TNum){ //串口2發送緩存區是否有數據需要發送?
AdrOut0=0; //有數據需要發送,則選通子串口2的地址
AdrOut1=1;
SBUF=Uart2TBuf[--Uart2TNum];//將串口2發送緩存中的一個字節
break; //由子串口2發送到下位機
}
else goto T_NopInstruction; //若子串口2沒有數據發送則準備發送空指令
} //而只能夠發送一條空指令用于時序配合
default:{
UartPointer=0; //下一次發送中斷準備向串口0發送數據
T_NopInstruction:
AdrOut0=1; //選通目串口準備發送空指令或者其他指令
AdrOut1=1;
if(bInstructFlag){ //判斷是否需要發送其他指令?
bInstructFlag=0; //清除指令發送標志
SBUF=InstructBuf; //將需要發送的指令發送到串口擴展IC
break;
}
else if(Uart0TNum|Uart1TNum|Uart2TNum){//判斷所有子串口的數據是否
SBUF=0; //都已經全部發送完畢
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -