📄 netgapuart.lst
字号:
C51 COMPILER V8.08 NETGAPUART 12/12/2008 11:27:51 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE NETGAPUART
OBJECT MODULE PLACED IN netgapuart.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE netgapuart.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg51.h>
2 #include<intrins.h>
3 #include<absacc.h>
4 #include "netgapuart.h"
5
6 #define uint unsigned int
7 #define uchar unsigned char
8 #define WAIT 160
9 #define WAITFLICK 40
10 bit bdata bUart0RFlag, bUart1RFlag, bUart2RFlag, bUartRFlag;
11 /** receiving memory of upper machine, read data while Uart0RFlag=1 */
12 uchar idata Uart0RBuf,Uart1RBuf,Uart2RBuf;
13 uchar idata OldUart0RBuf,OldUart1RBuf,OldUart2RBuf;
14 /** upper machine sends state flag, '1' means com port 'busy'
15 * (sending data to sub com port, just sending new data to sending buffer of
16 * sub comport. '0' means idle, user application should set 'TI=1' to launch
17 * data sending of sub comport
18 */
19 bit bdata bUartBusy;
20 /* upper request flag of sending instruction. Before sending upper machine must
21 * put instruction to be transmitted into 'InstructBuf'. Then set this flag to
22 * '1', after this flag being changed to '0', this process could be done again
23 */
24 bit bdata bInstructFlag;
25
26 uchar idata InstructBuf; //指令缓冲(用户可将设置SP2328/SP2338的指令放入
27 //该寄存器,由驱动程序自动完成指令发送)
28 uchar idata UartPointer; //子串口发送数据指针,中断服务程序通过该指针轮询
29 //发送数据到各子串口,保证各子串口的数据不丢失
30
31 uchar idata Uart0Tbuf[8]; /* sub Uart 0 data sending buffer*/
32 uchar idata Uart1TBuf[8]; /* sub Uart 1 data sending buffer*/
33 uchar idata Uart2TBuf[8]; /* sub Uart 2 data sending buffer*/
34 //uchar idata Uart0RBuf,Uart1RBuf,Uart2RBuf; //上位机接收子串口数据缓
35 //冲存储器,上位机通过判断"bUart0RFlag"等标志
36 //是否为"1",来决定是否读取该寄存器的数据
37 uchar idata Uart0TNum,Uart1TNum,Uart2TNum; //等待发送到各
38 //子串口的字节数,"0"表示相应子串口发送缓冲区"空"
39 //主程序可以通过判断该标志是否为"0"来决定是否向
40 //相应子串口发送后续数据
41 sbit AdrOut0=P1^2;
42 sbit AdrOut1=P1^3;
43 sbit AdrIn0 =P1^0;
44 sbit AdrIn1 =P1^1;
45
46 uint data pcstate0 = 0;
47 uint data pcstate1 = 0;
48 uint data localstate0 = UNINIT; //local single chip state
49 uint data localstate1 = UNINIT;
50
51 uint data buffer0=0; //定时器计数变量
52 uint data buffer1=0;
53 uint data bufferdelay=0 ;
54
55 sbit green0=P1^4;
C51 COMPILER V8.08 NETGAPUART 12/12/2008 11:27:51 PAGE 2
56 sbit red0=P1^5;
57 sbit green1=P1^6;
58 sbit red1=P1^7;
59
60 void delay(uint i)
61 {
62 1 bufferdelay=0;
63 1 while(bufferdelay<i);
64 1 }
65
66
67 /*串口服务子程序*/
68 serial () interrupt 4
69 {
70 1 if(RI)
71 1 {
72 2 RI=0; //准备解析刚接收到的数据来自于哪个子串口
73 2 bUartRFlag=1; //产生串口中断标志位
74 2 if(AdrIn1){ //子串口2接收到一个字节(未用)
75 3 Uart2RBuf=SBUF; //缓存子串口2收到的数据,以便接收后续数据
76 3 bUart2RFlag=1; //置子串口2收到数据标志,便于主程序查询
77 3 } else if(AdrIn0){ //子串口1接收到一个字节
78 3 Uart1RBuf=SBUF; //缓存子串口1收到的数据,以便接收后续数据
79 3 pcstate1 = (Uart1RBuf & 0xc0)>>6;
80 3 bUart1RFlag=1; //置子串口1收到数据标志,便于主程序查询
81 3 buffer1 = 1;
82 3 } else { //子串口0接收到一个字节
83 3 Uart0RBuf=SBUF; //缓存子串口0收到的数据,以便接收后续数据
84 3 pcstate0 = (Uart0RBuf & 0xc0)>>6;
85 3 bUart0RFlag=1; //置子串口0收到数据标志,便于主程序查询
86 3 buffer0 = 0;
87 3 }
88 2 }
89 1 if(TI)
90 1 {
91 2 // TI=0; //已经产生发送中断,准备解析下一个需要发送的数据
92 2 // AdrOut0 = 0;
93 2 // AdrOut1 = 0;
94 2 // SBUF = 'x';
95 2 /* switch(UartPointer){ //判断即将向哪个子串口发送数据?
96 2 case 0:{ //准备向子串口0发送数据
97 2 AdrOut0=0; //有数据需要发送,则选通子串口0的地址
98 2 AdrOut1=0;
99 2 SBUF=Uart1RBuf; //将串口0发送缓存中的一个字节
100 2 break; //由子串口0发送到下位机
101 2 }
102 2 case 1:{ //准备向子串口1发送数据
103 2 AdrOut0=1; //有数据需要发送,则选通子串口1的地址
104 2 AdrOut1=0;
105 2 SBUF=Uart0RBuf; //将串口1发送缓存中的一个字节
106 2 break; //由子串口1发送到下位机
107 2 } //而只能够发送一条空指令用于时序配合
108 2 case 2:{ //准备向子串口2发送数据
109 2 AdrOut0=0; //有数据需要发送,则选通子串口2的地址
110 2 AdrOut1=1;
111 2 SBUF=Uart0TBuf; //将串口2发送缓存中的一个字节
112 2 break; //由子串口2发送到下位机
113 2 } //而只能够发送一条空指令用于时序配合
114 2
115 2 default:{
116 2 else {bUartBusy=0;break;}//若所有子串口数据都已经发送完毕,则立即
117 2 } //清除"串口忙"标志(主程序将根据该标志来决定是否执行"TI=1"这条指令)
C51 COMPILER V8.08 NETGAPUART 12/12/2008 11:27:51 PAGE 3
118 2 bUartBusy=0;
119 2 }*/
120 2
121 2 /* switch(UartPointer){ //判断即将向哪个子串口发送数据?
122 2 case 0:{ //准备向子串口0发送数据
123 2 UartPointer++; //下一次发送中断准备向子串口1发送数据
124 2 if(Uart0TNum){ //串口0发送缓存区是否有数据需要发送?
125 2 AdrOut0=0; //有数据需要发送,则选通子串口0的地址
126 2 AdrOut1=0;
127 2 SBUF=Uart0Tbuf[--Uart0TNum];//将串口0发送缓存中的一个字节
128 2 break; //由子串口0发送到下位机
129 2 }
130 2 else goto T_NopInstruction; //若子串口0没有数据发送则准备发送空指令
131 2 }
132 2
133 2 case 1:{ //准备向子串口1发送数据
134 2 UartPointer++; //下一次发送中断准备向串口2发送数据
135 2 if(Uart1TNum){ //串口1发送缓存区是否有数据需要发送?
136 2 AdrOut0=1; //有数据需要发送,则选通子串口1的地址
137 2 AdrOut1=0;
138 2 SBUF=Uart1TBuf[--Uart1TNum];//将串口1发送缓存中的一个字节
139 2 break; //由子串口1发送到下位机
140 2 }
141 2 else goto T_NopInstruction; //若子串口1没有数据发送则准备发送空指令
142 2 } //而只能够发送一条空指令用于时序配合
143 2
144 2 case 2:{ //准备向子串口2发送数据
145 2 UartPointer++; //下一次发送中断准备发送空指令
146 2 if(Uart2TNum){ //串口2发送缓存区是否有数据需要发送?
147 2 AdrOut0=0; //有数据需要发送,则选通子串口2的地址
148 2 AdrOut1=1;
149 2 SBUF=Uart2TBuf[--Uart2TNum];//将串口2发送缓存中的一个字节
150 2 break; //由子串口2发送到下位机
151 2 }
152 2 else goto T_NopInstruction; //若子串口2没有数据发送则准备发送空指令
153 2 } //而只能够发送一条空指令用于时序配合
154 2
155 2 default:{
156 2 UartPointer=0; //下一次发送中断准备向串口0发送数据
157 2 T_NopInstruction:
158 2 AdrOut0=1; //选通目串口准备发送空指令或者其他指令
159 2 AdrOut1=1;
160 2 if(bInstructFlag){ //判断是否需要发送其他指令?
161 2 bInstructFlag=0; //清除指令发送标志
162 2 SBUF=InstructBuf; //将需要发送的指令发送到串口扩展IC
163 2 break;
164 2 }
165 2 else if(Uart0TNum|Uart1TNum|Uart2TNum){//判断所有子串口的数据是否
166 2 SBUF=0; //都已经全部发送完毕
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -