📄 uart.lst
字号:
C51 COMPILER V8.02 UART 04/18/2008 09:54:38 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN UART.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE UART.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #define UART_GLOBALS
2 #include "main.h"
3 #include "UART.h"
4 //#include "string.h"
5 #include "delay.h"
6
7 void UART_Init()
8 {
9 1 PCON = 0x80; // SMOD = 1;
10 1 SCON = 0x50; // Mode 1, 8-bit UART, enable receiption
11 1 TMOD = 0x21; // Timer 1, mode 2, 8-bit auto reload,
12 1
13 1 MyAddr = 0;
14 1 BaudNum = 7;
15 1
16 1 TH1=BaudRateTable[BaudNum];
17 1 TL1=BaudRateTable[BaudNum];
18 1 TR1 = 1;
19 1
20 1 RcvStatus = RCVSTX;
21 1 SerDTValid = FALSE;
22 1 SerTmOut = 0;
23 1
24 1 SendFlag = FALSE;
25 1 SendStatus = SENDIDLE;
26 1 RS485_TXen = 0;
27 1 REN = 1;
28 1 ES = 1;
29 1 }
30
31 void UART_Isr() interrupt 4 using 1
32 {
33 1 INT8U temp;
34 1 static INT8U SerLen,ExtData;
35 1 static INT8U LenSend; //已发送的有效数据长度
36 1
37 1 if(RI)
38 1 {
39 2 temp = SBUF;
40 2
41 2 if(temp == STX)
42 2 { //在任何时候收到STX,即可视为一帧的开始
43 3 RcvStatus = RCVDATA;
44 3 SerLen = 0;
45 3 RcvDTLen = 0;
46 3 SerTmOut = 2; //启动超时定时器
47 3 }
48 2 else if(temp == ETX)
49 2 {
50 3 if(RcvStatus == RCVDATA)
51 3 {
52 4 if(SerTmOut)
53 4 { //在未超时的情况下,接收数据后又收到一个ETX,则本帧数据有效
54 5 SerDTValid = TRUE;
55 5 }
C51 COMPILER V8.02 UART 04/18/2008 09:54:38 PAGE 2
56 4 RcvStatus = RCVSTX;
57 4 }
58 3 }
59 2 else if(RcvStatus == RCVDATA)
60 2 {
61 3 if((SerTmOut==0) || (temp&0x80))
62 3 RcvStatus = RCVSTX; //超时或数据中的bit7为1,则本帧数据作废
63 3 else
64 3 {
65 4 SerTmOut = 2;
66 4 if((SerLen&0x07) == 0)
67 4 { //扩展字节
68 5 ExtData = temp;
69 5 }
70 4 else
71 4 {
72 5 if(ExtData & 0x01)
73 5 {
74 6 temp |= 0x80;
75 6 }
76 5 SerBfr[RcvDTLen++] = temp;
77 5 ExtData >>= 1;
78 5 }
79 4 SerLen++;
80 4 }
81 3 }
82 2
83 2 if(SerDTValid)
84 2 {
85 3 SerDTValid = FALSE;
86 3 if(RcvDTLen == (SerBfr[LENGTH]+6))
87 3 {
88 4 temp = 0;
89 4 for(SerLen=0;SerLen<RcvDTLen;SerLen++)
90 4 temp ^= SerBfr[SerLen];
91 4 if(temp == 0xff)
92 4 {
93 5 if(SerBfr[RADDR] == MyAddr)
94 5 {
95 6 SerDTValid = TRUE;
96 6 }
97 5 }
98 4 }
99 3 }
100 2 RI = 0;
101 2 }
102 1 else
103 1 {
104 2 if(SendStatus == SENDSTX)
105 2 {
106 3 SBUF = STX;
107 3 SendStatus = SENDDATA; //下次中断发送数据
108 3 SerLen = 0;
109 3 LenSend = 0;
110 3 }
111 2 else if(SendStatus == SENDDATA)
112 2 {
113 3 if((SerLen&0x07) == 0)
114 3 {
115 4 ExtData = 0;
116 4 temp = LentoSend>=7?7:LentoSend; //计算扩展数据位长度
117 4 do
C51 COMPILER V8.02 UART 04/18/2008 09:54:38 PAGE 3
118 4 {
119 5 ExtData <<= 1;
120 5 if(SerBfr[LenSend+(temp-1)]&0x80)
121 5 ExtData |=0x01;
122 5 temp--;
123 5 }while(temp);
124 4 SBUF = ExtData; //发送扩展数据
125 4 }
126 3 else
127 3 {
128 4 SBUF = SerBfr[LenSend]&0x7f;
129 4 LenSend++;
130 4 LentoSend--;
131 4 if(LentoSend == 0)
132 4 { //有效数据已发送完毕
133 5 SendStatus = SENDETX; //下次中断发送ETX
134 5 }
135 4 }
136 3 SerLen++;
137 3 }
138 2 else if(SendStatus == SENDETX)
139 2 {
140 3 SBUF = ETX; //发送ETX
141 3 SendStatus = SENDSTOP; //下次中断结束本次发送
142 3 }
143 2 else if(SendStatus == SENDSTOP)
144 2 {
145 3 RS485_TXen = FALSE;
146 3 SendFlag = FALSE;
147 3 SendStatus = SENDIDLE; //发送器空闲
148 3 }
149 2 TI = 0;
150 2 }
151 1 }
152
153 INT8U Ser_Send(INT8U SlvAddr)
154 {
155 1 INT8U i;
156 1
157 1 if(SendStatus == SENDIDLE)
158 1 {
159 2 SerBfr[RADDR] = SlvAddr; //从机地址
160 2 SerBfr[SADDR] = MyAddr;
161 2
162 2 LentoSend = SerBfr[LENGTH]+5;
163 2 SerBfr[LentoSend] = 0;
164 2 for(i=0;i<LentoSend;i++)
165 2 {
166 3 SerBfr[LentoSend] ^= SerBfr[i];
167 3 }
168 2 SerBfr[LentoSend] = ~SerBfr[LentoSend];
169 2 LentoSend++;
170 2
171 2 RS485_TXen = 1;
172 2 SendStatus = SENDSTX;
173 2 TI = 1;
174 2 return TRUE;
175 2 }
176 1 else
177 1 return FALSE;
178 1 }
179
C51 COMPILER V8.02 UART 04/18/2008 09:54:38 PAGE 4
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 402 ----
CONSTANT SIZE = 9 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 41 ----
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -