📄 sio.lst
字号:
C51 COMPILER V7.50 SIO 12/27/2008 11:50:00 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE SIO
OBJECT MODULE PLACED IN sio.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE sio.c BROWSE DEFINE(XTAL=19660800) DEBUG OBJECTEXTEND
line level source
1 /*------------------------------------------------------------------------------
2 SIO.C: Serial Communication Routines.
3
4 Copyright 1995-2002 KEIL Software, Inc.
5 ------------------------------------------------------------------------------*/
6
7 #include <reg51.h>
8 #include <string.h>
9 #include "sio.h"
10
11 /*------------------------------------------------------------------------------
12 Notes:
13
14 The length of the receive and transmit buffers must be a power of 2.
15
16 Each buffer has a next_in and a next_out index.
17
18 If next_in = next_out, the buffer is empty.
19
20 (next_in - next_out) % buffer_size = the number of characters in the buffer.
21 ------------------------------------------------------------------------------*/
22 #define TBUF_SIZE 64 /*** Must be one of these powers of 2 (2,4,8,16,32,64,128) ***/
23 #define RBUF_SIZE 8 /*** Must be one of these powers of 2 (2,4,8,16,32,64,128) ***/
24
25 #define TBUF_SPACE idata /*** Memory space where the transmit buffer resides ***/
26 #define RBUF_SPACE idata /*** Memory space where the receive buffer resides ***/
27
28 #define CTRL_SPACE data /*** Memory space for the buffer indexes ***/
29
30 /*------------------------------------------------------------------------------
31 ------------------------------------------------------------------------------*/
32 #if TBUF_SIZE < 2
#error TBUF_SIZE is too small. It must be larger than 1.
#elif TBUF_SIZE > 128
#error TBUF_SIZE is too large. It must be smaller than 129.
#elif ((TBUF_SIZE & (TBUF_SIZE-1)) != 0)
#error TBUF_SIZE must be a power of 2.
#endif
39
40 #if RBUF_SIZE < 2
#error RBUF_SIZE is too small. It must be larger than 1.
#elif RBUF_SIZE > 128
#error RBUF_SIZE is too large. It must be smaller than 129.
#elif ((RBUF_SIZE & (RBUF_SIZE-1)) != 0)
#error RBUF_SIZE must be a power of 2.
#endif
47
48 /*------------------------------------------------------------------------------
49 ------------------------------------------------------------------------------*/
50 static TBUF_SPACE unsigned char tbuf [TBUF_SIZE];
51 static RBUF_SPACE unsigned char rbuf [RBUF_SIZE];
52
53 static CTRL_SPACE unsigned char t_in = 0;
54 static CTRL_SPACE unsigned char t_out = 0;
55
C51 COMPILER V7.50 SIO 12/27/2008 11:50:00 PAGE 2
56 static CTRL_SPACE unsigned char r_in = 0;
57 static CTRL_SPACE unsigned char r_out = 0;
58
59 static bit ti_restart = 0; /* NZ if TI=1 is required */
60
61
62 /*------------------------------------------------------------------------------
63 ------------------------------------------------------------------------------*/
64 static void com_isr (void) interrupt 4
65 {
66 1 /*------------------------------------------------
67 1 Received data interrupt.
68 1 ------------------------------------------------*/
69 1 if (RI != 0)
70 1 {
71 2 RI = 0;
72 2
73 2 if (((r_in - r_out) & ~(RBUF_SIZE-1)) == 0)
74 2 {
75 3 rbuf [r_in & (RBUF_SIZE-1)] = SBUF;
76 3 r_in++;
77 3 }
78 2 }
79 1
80 1 /*------------------------------------------------
81 1 Transmitted data interrupt.
82 1 ------------------------------------------------*/
83 1 if (TI != 0)
84 1 {
85 2 TI = 0;
86 2
87 2 if (t_in != t_out)
88 2 {
89 3 SBUF = tbuf [t_out & (TBUF_SIZE-1)];
90 3 t_out++;
91 3 ti_restart = 0;
92 3 }
93 2 else
94 2 {
95 3 ti_restart = 1;
96 3 }
97 2 }
98 1
99 1 }
100
101 /*------------------------------------------------------------------------------
102 ------------------------------------------------------------------------------*/
103 #pragma disable
104
105 void com_initialize (void)
106 {
107 1 /*------------------------------------------------
108 1 Setup TIMER1 to generate the proper baud rate.
109 1 ------------------------------------------------*/
110 1 com_baudrate (1200);
111 1
112 1 /*------------------------------------------------
113 1 Clear com buffer indexes.
114 1 ------------------------------------------------*/
115 1 t_in = 0;
116 1 t_out = 0;
117 1
C51 COMPILER V7.50 SIO 12/27/2008 11:50:00 PAGE 3
118 1 r_in = 0;
119 1 r_out = 0;
120 1
121 1 /*------------------------------------------------
122 1 Setup serial port registers.
123 1 ------------------------------------------------*/
124 1 SM0 = 0; SM1 = 1; /* serial port MODE 1 */
125 1 SM2 = 0;
126 1 REN = 1; /* enable serial receiver */
127 1
128 1 RI = 0; /* clear receiver interrupt */
129 1 TI = 0; /* clear transmit interrupt */
130 1 ti_restart = 1;
131 1
132 1 ES = 1; /* enable serial interrupts */
133 1 PS = 0; /* set serial interrupts to low priority */
134 1 }
135
136 /*------------------------------------------------------------------------------
137 ------------------------------------------------------------------------------*/
138 #pragma disable
139
140 void com_baudrate (
141 unsigned baudrate)
142 {
143 1 /*------------------------------------------------
144 1 Clear transmit interrupt and buffer.
145 1 ------------------------------------------------*/
146 1 TI = 0; /* clear transmit interrupt */
147 1 t_in = 0; /* empty transmit buffer */
148 1 t_out = 0;
149 1
150 1 /*------------------------------------------------
151 1 Set timer 1 up as a baud rate generator.
152 1 ------------------------------------------------*/
153 1 TR1 = 0; /* stop timer 1 */
154 1 ET1 = 0; /* disable timer 1 interrupt */
155 1
156 1 PCON |= 0x80; /* 0x80=SMOD: set serial baudrate doubler */
157 1
158 1 TMOD &= ~0xF0; /* clear timer 1 mode bits */
159 1 TMOD |= 0x20; /* put timer 1 into MODE 2 */
160 1
161 1 TH1 = (unsigned char) (256 - (XTAL / (16L * 12L * baudrate)));
162 1
163 1 TR1 = 1; /* start timer 1 */
164 1 }
165
166 /*------------------------------------------------------------------------------
167 ------------------------------------------------------------------------------*/
168 #pragma disable
169
170 char com_putchar (
171 unsigned char c)
172 {
173 1 /*------------------------------------------------
174 1 If the buffer is full, return an error value.
175 1 ------------------------------------------------*/
176 1 if (com_tbuflen () >= TBUF_SIZE)
177 1 return (-1);
178 1
179 1 /*------------------------------------------------
C51 COMPILER V7.50 SIO 12/27/2008 11:50:00 PAGE 4
180 1 Add the data to the transmit buffer. If the
181 1 transmit interrupt is disabled, then enable it.
182 1 ------------------------------------------------*/
183 1 tbuf [t_in & (TBUF_SIZE - 1)] = c;
184 1 t_in++;
185 1
186 1 if (ti_restart)
187 1 {
188 2 ti_restart = 0;
189 2 TI = 1; /* generate transmit interrupt */
190 2 }
191 1
192 1 return (0);
193 1 }
194
195 /*------------------------------------------------------------------------------
196 ------------------------------------------------------------------------------*/
197 #pragma disable
198
199 int com_getchar (void)
200 {
201 1 if (com_rbuflen () == 0)
202 1 return (-1);
203 1
204 1 return (rbuf [(r_out++) & (RBUF_SIZE - 1)]);
205 1 }
206
207 /*------------------------------------------------------------------------------
208 ------------------------------------------------------------------------------*/
209 #pragma disable
210
211 unsigned char com_rbuflen (void)
212 {
213 1 return (r_in - r_out);
214 1 }
215
216 /*------------------------------------------------------------------------------
217 ------------------------------------------------------------------------------*/
218 #pragma disable
219
220 unsigned char com_tbuflen (void)
221 {
222 1 return (t_in - t_out);
223 1 }
224
225 /*------------------------------------------------------------------------------
226 ------------------------------------------------------------------------------*/
227
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 304 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 1
IDATA SIZE = 72 ----
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 + -