📄 softserio.lst
字号:
C51 COMPILER V7.50 SOFTSERIO 06/28/2007 08:44:48 PAGE 4
180 {
181 1 TCON_ENABLE_TIMER = 0; //停止定时器
182 1 rs_timerH = rs_TEST_H;
183 1 rs_timerL = rs_TEST_L;
184 1 rs_shift_count = 0;
185 1 TCON_ENABLE_TIMER = 1; //启动定时器
186 1 }
187
188
189 void soft_receive_enable() //允许接收
190 {
191 1 rs_f_RI_enable = 1; //允许接收
192 1 rs_f_TI_enable = 0; //禁止发送
193 1 soft_receive_init(); //监测起始位, RXD 下降沿触发接收字节过程.
194 1 }
195
196 void soft_send_enable (void) //允许发送
197 {
198 1 TCON_ENABLE_TIMER = 0; //停止定时器
199 1 rs_f_TI_enable = 1; //允许发送
200 1 rs_f_RI_enable = 0; //禁止接收
201 1
202 1 rs_shift_count = 0; //清移位计数器
203 1 rs_f_TI = 1; //发送一个字符完毕标志
204 1 TCON_ENABLE_TIMER = 1; //启动定时器
205 1 }
206
207 void soft_rs232_interrupt( void )
208 {
209 1 /************************ 接收 ****************************/
210 1 if (rs_f_RI_enable == 1)
211 1 {
212 2 if (rs_shift_count == 0) //移位计数器==0, 表示检测到起始位的起点
213 2 {
214 3 if ( rs_RXD == 1 )
215 3 {
216 4 soft_receive_enable (); //起始位错, 从新开始
217 4 }
218 3 else
219 3 {
220 4 //下次中断在数据位或停止位中的某时刻发生
221 4 rs_timerL += rs_FULL_BIT_L + 0x10;
222 4 rs_timerH = rs_FULL_BIT_H;
223 4 rs_shift_count++;
224 4 rs_BUF = 0; //清移位缓冲变量
225 4 }
226 3 }
227 2 else
228 2 {
229 3 rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生
230 3 rs_timerH = rs_FULL_BIT_H;
231 3
232 3 rs_shift_count++; //2--9:数据位 10:停止位
233 3
234 3 if ( rs_shift_count == 9)
235 3 {
236 4 rs_BUF = rs_BUF >> 1; //接收第8位
237 4 rs_BUF_bit7 = rs_RXD;
238 4 if( ReceivePoint < rs_RECEIVE_MAX)
239 4 { //保存收到的字节
240 5 rs232buffer[ReceivePoint++] = rs_BUF;
241 5 }
C51 COMPILER V7.50 SOFTSERIO 06/28/2007 08:44:48 PAGE 5
242 4 else
243 4 {
244 5 rs_f_RI_enable = 0; //缓冲区满, 禁止接收
245 5 }
246 4 }
247 3 else
248 3 {
249 4 if (rs_shift_count < 9 ) //收到的是数据位 1 -- 7
250 4 {
251 5 rs_BUF = rs_BUF >> 1;
252 5 rs_BUF_bit7 = rs_RXD;
253 5 }
254 4 else
255 4 { //收到停止位,继续检测 PC 机发出的下一个起始位
256 5 soft_receive_init();
257 5 }
258 4 }
259 3 }
260 2 TCON_TFx = 0; //清定时器中断标志
261 2 }
262 1 else
263 1 {
264 2 /************************ 发送 ****************************/
265 2 if (rs_f_TI_enable == 1)
266 2 {
267 3 rs_timerL += rs_FULL_BIT_L;//下次中断在数据位的末尾时刻
268 3 rs_timerH = rs_FULL_BIT_H;
269 3
270 3 rs_shift_count--; //0:停止位末尾时刻到
271 3 //1:发送停止位
272 3 //2--9:发送数据位
273 3 if (rs_shift_count > 9) //错误状态
274 3 {
275 4 rs_shift_count = 9;
276 4 rs_BUF = 0xFF;
277 4 }
278 3
279 3 if (rs_shift_count > 1) //2--9:发送数据位
280 3 {
281 4 ACC = rs_BUF;
282 4 ACC = ACC >> 1;
283 4 rs_TXD = CY;
284 4 rs_BUF = ACC;
285 4 }
286 3 else
287 3 {
288 4 if (rs_shift_count == 0) //0:停止位末尾时刻到
289 4 {
290 5 rs_TXD = 1;
291 5 rs_f_TI = 1; //已发送完毕一个字节
292 5 }
293 4 else
294 4 {
295 5 rs_TXD = 1; //1:发送停止位
296 5 }
297 4 }
298 3 }
299 2 }
300 1 }
301
302 //由收转到发时,要先调用 soft_send_enable ()
303 void rs_send_byte(INT8U SendByte) //发送一个字节
C51 COMPILER V7.50 SOFTSERIO 06/28/2007 08:44:48 PAGE 6
304 {
305 1 while ( rs_f_TI == 0); //等待发送完毕前一个字节
306 1 rs_TXD = 1;
307 1 rs_timerL = rs_START_BIT_L; //下次中断在起始位的末尾时刻
308 1 rs_timerH = rs_START_BIT_H;
309 1 rs_BUF = SendByte;
310 1 rs_shift_count = 10;
311 1 rs_TXD = 0; //发送起始位
312 1 rs_f_TI = 0; //清已发送完毕一个字节的标志
313 1 }
314
315 void initiate_MCU (void) //系统初始化
316 {
317 1 soft_rs232_init(); //串口初始化
318 1 EA = 1; //开中断
319 1 }
320
321 /*void main (void)
322 {
323 //首先发送 128 个字节 00H--7FH, 然后等待 PC 机发送的数据。当收到 128
324 //个字节后,立刻将收到的 128 个数据回发送给 PC 机,然后继续等待下一个
325 //数据块。
326
327 INT8U i;
328 initiate_MCU(); //系统初始化
329
330 soft_send_enable (); //允许发送,禁止接收
331 for (i=0; i < rs_RECEIVE_MAX; i++ )
332 {
333 rs_send_byte(i);
334 }
335 while ( rs_f_TI == 0) ; // 等待最后一个字节发送完毕
336
337 while(1)
338 {
339 soft_receive_enable (); //启动并开始接收,禁止发送
340 while (ReceivePoint < rs_RECEIVE_MAX); // 等待接收缓冲区满
341
342 soft_send_enable (); //允许发送,禁止接收
343 for (i=0; i < rs_RECEIVE_MAX; i++ )
344 {
345 rs_send_byte(rs232buffer[i]);
346 }
347 while ( rs_f_TI == 0) ; //等待最后一个字节发送完毕
348 ReceivePoint = 0;
349 }
350 } */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 345 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 131 ----
PDATA SIZE = ---- ----
DATA SIZE = 2 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -