📄 uart0.lst
字号:
C51 COMPILER V8.08 UART0 02/17/2009 12:58:31 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE UART0
OBJECT MODULE PLACED IN uart0.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE uart0.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #define UART0_GLOBALS
2
3
4
5 #include "includes.h"
6
7
8
9 /****************************本地变量定义*************************/
10 static idata INT8U UART0_ByteCnt;
11 static idata INT8U UART0_RcvByte;
12 Com UART0_Com;
13
14
15
16 /****************************本地变量定义*************************/
17 static void UART0_Tx (void);
18 static void UART0_Rx (void);
19
20
21
22 /****************************全局函数*****************************/
23 UART0_EXT void UART0_ParaInit (void)
24 /*===============================================
25 函数名: UART0_ParaInit
26 功能 : 串口0参数初始化
27 输入 : 无
28 输出 : 无
29 ===============================================*/
30 {
31 1 UART0_ByteCnt = 0;
32 1 UART0_RcvByte = 0;
33 1 UART0_MaxLen = 0;
34 1 UART0_SendFlag = 0;
35 1 }
36
37
38
39 UART0_EXT void UART0_Course (void)
40 /*===============================================
41 函数名 : UART0_Course
42 功能 : 串口发送数据
43 输入 : 无
44 输出 : 无
45 ===============================================*/
46 {
47 1 if (UART0_SendFlag){
48 2 UART0_SendFlag = 0;
49 2
50 2 UART0_ByteCnt = 0;
51 2
52 2 TI = 1; /*强制进入发送*/
53 2 }
54 1 }
55
C51 COMPILER V8.08 UART0 02/17/2009 12:58:31 PAGE 2
56
57
58 /****************************本地函数*****************************/
59 void UART0_Int (void) interrupt 4
60 /*===============================================
61 函数名 : UART0_Int
62 功能 : 串口中断
63 输入 : 无
64 输出 : 无
65 ===============================================*/
66 {
67 1 if (RI){ /*接收*/
68 2 RI = 0;
69 2
70 2 LED_485 = 0; /*开串口接收指示灯*/
71 2 UART0_RcvByte = SBUF0;
72 2
73 2 UART0_Rx();
74 2 }else if (TI){ /*发送*/
75 2 TI = 0;
76 2
77 2 LED_485 = 0; /*开串口发送指示灯*/
78 2
79 2 UART0_Tx();
80 2 }
81 1 }
82
83
84
85 static void UART0_Tx (void)
86 /*==============================================
87 函数名: UART0_Tx
88 功能 : 串口发送
89 输入 : 无
90 输出 : 无
91 ===============================================*/
92 {
93 1 INT8U i;
94 1 bit vfybit;
95 1
96 1 if (UART0_ByteCnt < UART0_MaxLen){
97 2
98 2 for (i=0x80; i!=0; i>>=1){
99 3 if ((COM_DatBuf[UART0_ByteCnt] & i) != 0){
100 4 vfybit ^= 1;
101 4 }
102 3 }
103 2 TB8 = vfybit;
104 2 vfybit = 0;
105 2
106 2 SBUF0 = COM_DatBuf[UART0_ByteCnt ++];
107 2
108 2 }else{ /*发送完毕*/
109 2
110 2 LED_485 = 1; /*关串口发送指示灯*/
111 2
112 2 UART0_ByteCnt = 0;
113 2 UART0_MaxLen = 0;
114 2 }
115 1 }
116
117
C51 COMPILER V8.08 UART0 02/17/2009 12:58:31 PAGE 3
118
119 static void UART0_Rx (void)
120 /*===============================================
121 函数名: UART0_Rx
122 功能 : 串口接收
123 输入 : 无
124 输出 : 无
125 ===============================================*/
126 {
127 1 switch (UART0_Com.RxPhase){
128 2
129 2 case 0:/*第一起始符*/
130 2 if (0xfe == UART0_RcvByte){
131 3 UART0_Com.RxPhase = 0;
132 3 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
133 3 }else if (0x68 == UART0_RcvByte){
134 3 UART0_Com.RxPhase = 2;
135 3 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
136 3 }else if ((0x14 == UART0_RcvByte)||(0x24 == UART0_RcvByte)||(0x16 == UART0_RcvByte)||(0x10 ==
-UART0_RcvByte)){
137 3 UART0_Com.RxPhase = 1;
138 3 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
139 3 }else{
140 3 UART0_Com.RxErr = 1;
141 3 }
142 2 break;
143 2
144 2 case 1:/*浩迪规约第二起始符*/
145 2 if ((0x11 == UART0_RcvByte)||(0xee == UART0_RcvByte)){
146 3 UART0_Com.RxPhase = 2;
147 3 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
148 3 }else{
149 3 UART0_Com.RxErr = 1;
150 3 }
151 2 break;
152 2
153 2 case 2:/*地址域*/
154 2 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
155 2 UART0_Com.AdrLenCnt ++;
156 2 if (6 == UART0_Com.AdrLenCnt){
157 3 UART0_Com.AdrLenCnt = 0;
158 3 UART0_Com.RxPhase = 3;
159 3 }else if (UART0_Com.AdrLenCnt > 6){/*为了防止不可预知的错误*/
160 3 UART0_Com.RxErr = 1;
161 3 }
162 2 break;
163 2
164 2 case 3:/*数据起始符*/
165 2 if (0x68 == UART0_RcvByte){
166 3 UART0_Com.RxPhase = 4;
167 3 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
168 3 }else if (0xaa == UART0_RcvByte){
169 3 UART0_Com.RxPhase = 4;
170 3 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
171 3 }else{
172 3 UART0_Com.RxErr = 1;
173 3 }
174 2 break;
175 2
176 2 case 4:/*控制码*/
177 2 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
178 2 UART0_Com.RxPhase = 5;
C51 COMPILER V8.08 UART0 02/17/2009 12:58:31 PAGE 4
179 2 break;
180 2
181 2 case 5:/*数据长度*/
182 2 if (30 > UART0_RcvByte){/*最长数据为20个字节*/
183 3 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
184 3 UART0_Com.RxDatLen = UART0_RcvByte;
185 3 UART0_Com.RxPhase = 6;
186 3 }else{
187 3 UART0_Com.RxErr = 1;
188 3 }
189 2 break;
190 2
191 2 case 6:/*数据域*/
192 2 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
193 2 UART0_Com.DatLenCnt ++;
194 2 if (UART0_Com.DatLenCnt == UART0_Com.RxDatLen){
195 3 UART0_Com.RxPhase = 7;
196 3 UART0_Com.DatLenCnt = 0;
197 3 UART0_Com.RxDatLen = 0;
198 3 }else if (UART0_Com.DatLenCnt > UART0_Com.RxDatLen){/*为了防止不可预知的错误*/
199 3 UART0_Com.RxErr = 1;
200 3 }
201 2 break;
202 2
203 2 case 7:/*校验码*/
204 2 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
205 2 UART0_Com.RxPhase = 8;
206 2 break;
207 2
208 2 case 8:/*结束符*/
209 2 if (0x16 == UART0_RcvByte){
210 3 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
211 3 UART0_Com.RxPhase = 0;
212 3
213 3 ZB_SendFlag = 1;
214 3 ZB_MaxLen = UART0_MaxLen;
215 3 UART0_MaxLen = 0;
216 3
217 3 LED_485 = 1;
218 3
219 3 RS485_Tx = 1;
220 3 }else if (0xff == UART0_RcvByte){
221 3 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
222 3 UART0_Com.RxPhase = 9;
223 3 }else{
224 3 UART0_Com.RxErr = 1;
225 3 }
226 2 break;
227 2
228 2 case 9:/*浩迪CRC校验*/
229 2 COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
230 2 UART0_Com.CrcLenCnt ++;
231 2 if (UART0_Com.CrcLenCnt == 2){
232 3 UART0_Com.RxPhase = 0;
233 3 UART0_Com.CrcLenCnt = 0;
234 3
235 3 ZB_SendFlag = 1;
236 3 ZB_MaxLen = UART0_MaxLen;
237 3 UART0_MaxLen = 0;
238 3
239 3 LED_485 = 1;/*关指示灯*/
240 3
C51 COMPILER V8.08 UART0 02/17/2009 12:58:31 PAGE 5
241 3 RS485_Tx = 1;/*转为接收*/
242 3 }else if (UART0_Com.CrcLenCnt > 2){/*为了防止不可预知的错误*/
243 3 UART0_Com.RxErr = 1;
244 3 }
245 2 break;
246 2
247 2 default:
248 2 break;
249 2 }
250 1
251 1 if (UART0_Com.RxErr){/*如果帧接收有错误*/
252 2 UART0_Com.RxErr = 0;
253 2 UART0_Com.RxPhase = 0;
254 2 UART0_Com.RxDatLen = 0;
255 2 UART0_Com.DatLenCnt = 0;
256 2 UART0_Com.CrcLenCnt = 0;
257 2 UART0_Com.AdrLenCnt = 0;
258 2
259 2 UART0_MaxLen = 0;
260 2
261 2 LED_485 = 1;/*关指示灯*/
262 2
263 2 RS485_Tx = 1;/*转为接收*/
264 2 }
265 1 }
266
267
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 586 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 ----
IDATA SIZE = 2 ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -