📄 io_soft_uart_use_timer.lst
字号:
235 1 TCON_ENABLE_TIMER = 1; //启动定时器
236 1 }
237 extern unsigned char Receivesize; // 模拟串口接收多少字节
238 void soft_rs232_interrupt( void )
239 {
240 1 /************************ 接收 ****************************/
241 1 if (rs_f_RI_enable == 1)
C51 COMPILER V8.05a IO_SOFT_UART_USE_TIMER 10/20/2008 11:07:22 PAGE 5
242 1 {
243 2 if (rs_shift_count == 0) //移位计数器==0, 表示检测到起始位的起点
244 2 {
245 3 if ( rs_RXD == 1 )
246 3 {
247 4 soft_receive_enable (); //起始位错, 从新开始
248 4 }
249 3 else
250 3 {
251 4 //下次中断在数据位或停止位中的某时刻发生
252 4 rs_timerL += rs_FULL_BIT_L + 0x08;
253 4 rs_timerH = rs_FULL_BIT_H;
254 4 rs_shift_count++;
255 4 rs_BUF = 0; //清移位缓冲变量
256 4 }
257 3 }
258 2 else
259 2 {
260 3 rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生
261 3 rs_timerH = rs_FULL_BIT_H;
262 3
263 3 rs_shift_count++; //2--9:数据位 10:停止位
264 3
265 3 if ( rs_shift_count == 9)
266 3 {
267 4 rs_BUF = rs_BUF >> 1; //接收第8位
268 4 rs_BUF_bit7 = rs_RXD;
269 4 if( ReceivePoint < rs_RECEIVE_MAX)
270 4 { //保存收到的字节
271 5 rs232buffer[ReceivePoint] = rs_BUF;
272 5 if( ( rs232buffer[ReceivePoint] == 0x0a)&&( rs232buffer[ReceivePoint-1] == 0x0d) )
273 5 {
274 6 RED_LED = ~RED_LED;
275 6
276 6 phone_flag = 1; // 接收到一帧电话号码标志
277 6
278 6 Receivesize = ReceivePoint;
279 6 ReceivePoint =0;
280 6 }
281 5 else
282 5 {
283 6 ReceivePoint++;
284 6 }
285 5 }
286 4 else
287 4 {
288 5 rs_f_RI_enable = 0; //缓冲区满, 禁止接收
289 5 }
290 4 }
291 3 else
292 3 {
293 4 if (rs_shift_count < 9 ) //收到的是数据位 1 -- 7
294 4 {
295 5 rs_BUF = rs_BUF >> 1;
296 5 rs_BUF_bit7 = rs_RXD;
297 5 }
298 4 else
299 4 { //收到停止位,继续检测 PC 机发出的下一个起始位
300 5 soft_receive_init();
301 5 }
302 4 }
303 3 }
C51 COMPILER V8.05a IO_SOFT_UART_USE_TIMER 10/20/2008 11:07:22 PAGE 6
304 2 TCON_TFx = 0; //清定时器中断标志
305 2 }
306 1 else
307 1 {
308 2 /************************ 发送 ****************************/
309 2 if (rs_f_TI_enable == 1)
310 2 {
311 3 rs_timerL += rs_FULL_BIT_L;//下次中断在数据位的末尾时刻
312 3 rs_timerH = rs_FULL_BIT_H;
313 3
314 3 rs_shift_count--; //0:停止位末尾时刻到
315 3 //1:发送停止位
316 3 //2--9:发送数据位
317 3 if (rs_shift_count > 9) //错误状态
318 3 {
319 4 rs_shift_count = 9;
320 4 rs_BUF = 0xFF;
321 4 }
322 3
323 3 if (rs_shift_count > 1) //2--9:发送数据位
324 3 {
325 4 ACC = rs_BUF;
326 4 ACC = ACC >> 1;
327 4 rs_TXD = CY;
328 4 rs_BUF = ACC;
329 4 }
330 3 else
331 3 {
332 4 if (rs_shift_count == 0) //0:停止位末尾时刻到
333 4 {
334 5 rs_TXD = 1;
335 5 rs_f_TI = 1; //已发送完毕一个字节
336 5 }
337 4 else
338 4 {
339 5 rs_TXD = 1; //1:发送停止位
340 5 }
341 4 }
342 3 }
343 2 }
344 1 }
345
346 //由收转到发时,要先调用 soft_send_enable ()
347 void rs_send_byte(INT8U SendByte) //发送一个字节
348 {
349 1 while ( rs_f_TI == 0); //等待发送完毕前一个字节
350 1 rs_TXD = 1;
351 1 rs_timerL = rs_START_BIT_L; //下次中断在起始位的末尾时刻
352 1 rs_timerH = rs_START_BIT_H;
353 1 rs_BUF = SendByte;
354 1 rs_shift_count = 10;
355 1 rs_TXD = 0; //发送起始位
356 1 rs_f_TI = 0; //清已发送完毕一个字节的标志
357 1 }
358
359 void initiate_MCU (void) //系统初始化
360 {
361 1 soft_rs232_init(); //串口初始化
362 1 EA = 1; //开中断
363 1 }
364
365
C51 COMPILER V8.05a IO_SOFT_UART_USE_TIMER 10/20/2008 11:07:22 PAGE 7
366 extern void delay_n_ms( unsigned int n_milisecond) ; /* mS delay */
367
368 void phone_init(void);
369
370 void phone_init(void)
371 {
372 1 initiate_MCU(); //系统初始化
373 1 /*
374 1 P1 = 0xff; // 1.0,1.3,1.6,1.7设置为输入
375 1
376 1 P1M0 = 0x00; // 1.1,1.2,1.4,1.5设置为输出
377 1 P1M1 = 0x00;
378 1 */
379 1
380 1 delay_n_ms(200);
381 1
382 1 PHONE_RESET = 0;
383 1 delay_n_ms(200);
384 1 PHONE_RESET = 1;
385 1 delay_n_ms(200);
386 1 PHONE_RESET = 0;
387 1
388 1 WDT_CONTR = 0x3d; //使能看门狗
389 1
390 1 delay_n_ms(200);
391 1
392 1 soft_receive_enable (); //启动并开始接收,禁止发送
393 1
394 1 // 电话模块复位成功
395 1 do{
396 2
397 2
398 2 PHONE_RESET = 0;
399 2 delay_n_ms(200);
400 2 PHONE_RESET = 1;
401 2 delay_n_ms(300);
402 2 PHONE_RESET = 0;
403 2 WDT_CONTR = 0x3d; //使能看门狗
404 2 delay_n_ms(700); // 延时
405 2
406 2 WDT_CONTR = 0x3d; //使能看门狗
407 2
408 2 }while( !phone_flag);
409 1 /*
410 1 UartPrintOut(rs232buffer,ReceivePoint);
411 1 ES = 0; TI = 1;enable_485_tx;
412 1 printf("!\n");
413 1 TI=0;ES = 1;enable_485_rx;
414 1 */
415 1 phone_flag =0;
416 1 ReceivePoint =0;
417 1 }
418 /*
419
420 void main (void)
421 {
422 //首先发送 128 个字节 00H--7FH, 然后等待 PC 机发送的数据。当收到 128
423 //个字节后,立刻将收到的 128 个数据回发送给 PC 机,然后继续等待下一个
424 //数据块。
425
426 INT8U i;
427
C51 COMPILER V8.05a IO_SOFT_UART_USE_TIMER 10/20/2008 11:07:22 PAGE 8
428
429 soft_send_enable (); //允许发送,禁止接收
430 for (i=0; i < rs_RECEIVE_MAX; i++ )
431 {
432 rs_send_byte(i);
433 }
434 while ( rs_f_TI == 0) ; // 等待最后一个字节发送完毕
435
436
437 phone_init();
438
439 while(1)
440 {
441
442 /*
443
444 while (ReceivePoint < rs_RECEIVE_MAX); // 等待接收缓冲区满
445
446 soft_send_enable (); //允许发送,禁止接收
447
448 for (i=0; i < rs_RECEIVE_MAX; i++ )
449 {
450 rs_send_byte(rs232buffer[i]);
451 }
452
453 while ( rs_f_TI == 0) ; //等待最后一个字节发送完毕
454
455 ReceivePoint = 0;
456
457 }
458 }
459 */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 404 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 ----
IDATA SIZE = 64 ----
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 + -