📄 pca_uart_host.lst
字号:
245 1 {
246 2 Tx_time = (uint16)CL + (uint16)( CH << 8 );//读出计数器的值
247 2 Tx_time += TX_FULL_BIT;//加入一个位的时间
248 2 CCAP1L = (uint8)Tx_time;//放入模块1中
249 2 CCAP1H = (uint8)( Tx_time >> 8 );
250 2 CCAPM1 = TIMER_INI;//设置为定时模式
251 2 Tx_timer_en = 1;//设为1,即下次准备
252 2 }
253 1 }
254
255
256 /******************************************************************************
257 函数:Rx_enable()
258 功能:接收使能
259 说明:设置接收状态及PCA模块0低电平触发以允许使能接收
260 ******************************************************************************/
261
262 void Rx_enable(void)
263 {
264 1 Rx_state = S_RX_START_EDGE;//开始使能接收
265 1 CCAPM0 = NEG_CAP_INT;//设置为下降沿捕获
266 1 }
267
268 /******************************************************************************
269 函数:Rx_disable()
270 功能:禁止接收
271 说明:在程序开始时进行的状态初始化,禁止接收,之后通过接收使能函数开始
272 ******************************************************************************/
273
274 void Rx_disable(void)
275 {
276 1 Rx_state = S_RX_START_EDGE;//开始接收状态
277 1 CCAPM0 = DISABLED_MODE;//禁止模式
278 1 }
279
280 /******************************************************************************
281 函数:Receive()
282 功能:接收函数
283 说明:接收函数对应的模块为PCA模块0
284 ******************************************************************************/
285 void Receive(void)
286 {
287 1 if(Rx_state != S_RX_START_EDGE) //检测 起始下降沿 判断
288 1 {
289 2 if(Rx_state != S_RX_START_BIT) //检测 起始位 判断
290 2 {
291 3 if(Rx_state != S_RX_DATA_BIT ) //检测 数据位 判断
292 3 {
293 4 if( Rx_state != S_RX_STOP_BIT ) //检测 停止位 判断
294 4 {
295 5 Rx_state = S_RX_START_EDGE;//恢复初始状态
296 5 CCAPM0 = NEG_CAP_INT;//下降沿捕获
297 5 }
298 4 else
299 4 {
300 5 Rx_buffer = Rx_shift;//将接收到的数据存入变量中
301 5 CCAPM0 = NEG_CAP_INT;//恢复为下降沿捕获
302 5 Rx_state = S_RX_START_EDGE;//恢复初始状态
303 5 Rx_data_error = RXD_PIN;//可不用这句,但为了得到正确的状态加以描述
C51 COMPILER V7.06 PCA_UART_HOST 02/25/2009 10:35:51 PAGE 6
304 5 Rx_data_ready = 1;//开始准备
305 5 Send_UART(Rx_buffer);//将得到的数据发送到串口中观察结果
306 5 Display_LED();
307 5 }
308 4 }
309 3 else
310 3 { //接收数据
311 4 Rx_shift >>= 1;//接收数据,向右移动
312 4 if( RXD_PIN == 1 )//接收数据
313 4 {
314 5 Rx_shift |= 0x80;
315 5 }
316 4 else
317 4 {
318 5 Rx_shift &= 0x7f;
319 5 }
320 4 Rx_time = (uint16)CCAP0L + (uint16)( CCAP0H << 8 );
321 4 Rx_time += RX_FULL_BIT;
322 4 CCAP0L = (uint8)(Rx_time); //低8位重新放入寄存器中
323 4 CCAP0H = (uint8)( Rx_time >> 8 );//高8位重新放入寄存器中
324 4 Rx_count--; //状态递减,也就是发送位一位一位的进行
325 4 if( Rx_count == 0 )
326 4 {
327 5 Rx_state = S_RX_STOP_BIT;
328 5 }
329 4 }
330 3 }
331 2 else
332 2 { //接收起始位
333 3 if( RXD_PIN != 1 )
334 3 {
335 4 Rx_time = (uint16)CCAP0L + (uint16)( CCAP0H << 8 );
336 4 Rx_time += RX_FULL_BIT;
337 4 CCAP0L = (uint8)(Rx_time);
338 4 CCAP0H = (uint8)( Rx_time >> 8 );
339 4 Rx_state = S_RX_DATA_BIT;
340 4 Rx_count = 0x08;
341 4 }
342 3 else
343 3 {
344 4 Rx_data_error = 1;//错误状态
345 4 Rx_state = S_RX_START_BIT;
346 4 }
347 3 }
348 2 }
349 1 else
350 1 { //接收起始位初始化
351 2 Rx_time = (uint16)CCAP0L + (uint16)( CCAP0H << 8 );
352 2 Rx_time += RX_HALF_BIT;//这里延时半个位,以便之后进行采样
353 2 CCAP0L = (uint8)(Rx_time);
354 2 CCAP0H = (uint8)( Rx_time >> 8 );
355 2 CCAPM0 = TIMER_INI;
356 2 Rx_state = S_RX_START_BIT;
357 2 }
358 1 }
359
360
361 /******************************************************************************
362 函数:Transmit()
363 功能:发送函数
364 说明:发送函数对应的模块为PCA模块1
365 ******************************************************************************/
C51 COMPILER V7.06 PCA_UART_HOST 02/25/2009 10:35:51 PAGE 7
366
367 void Transmit(void)
368 {
369 1 if( Tx_state != S_TX_START_BIT ) //是否发送起始位 状态
370 1 {
371 2 if( Tx_state != S_TX_DATA_BIT) //是否发送数据位 状态
372 2 {
373 3 if( Tx_state != S_TX_STOP_BIT ) //是否发送停止位 状态
374 3 {
375 4 if( Tx_state != S_TX_STOP_END ) //是否发送结束 状态
376 4 { //不是
377 5 Tx_state = S_TX_START_BIT;
378 5 Tx_data_ready = 1;
379 5 CCAPM1 = DISABLED_MODE;
380 5 }
381 4 else
382 4 { //是
383 5 Tx_state = S_TX_START_BIT;
384 5 if( Tx_data_ready != 1 ) //是否成功发送停止位
385 5 { //没有
386 6 Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
387 6 Tx_time += TX_FULL_BIT;
388 6 CCAP1L = (uint8)Tx_time;
389 6 CCAP1H = (uint8)( Tx_time >> 8 );
390 6 }
391 5 else
392 5 { //有
393 6 CCAPM1 = DISABLED_MODE;
394 6 Tx_timer_en = 0; //使能发送定时器标志位,0为禁止
395 6 }
396 5 }
397 4 }
398 3 else
399 3 {
400 4 TXD_PIN = 1;
401 4 Tx_state = S_TX_STOP_END;
402 4 Tx_data_ready = 1;
403 4 Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
404 4 Tx_time += TX_FULL_BIT;
405 4 CCAP1L = (uint8)Tx_time;
406 4 CCAP1H = (uint8)( Tx_time >> 8 );
407 4 }
408 3 }
409 2 else
410 2 { //发送数据位
411 3 if( ( Tx_shift & 0x01) == 0x01 )
412 3 {
413 4 TXD_PIN = 1;
414 4 }
415 3 else
416 3 {
417 4 TXD_PIN = 0;
418 4 }
419 3 Tx_shift >>= 1;
420 3 Tx_count--;
421 3 if( Tx_count == 0 )
422 3 {
423 4 Tx_state = S_TX_STOP_BIT;
424 4 }
425 3 Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
426 3 Tx_time += TX_FULL_BIT;
427 3 CCAP1L = (uint8)Tx_time;
C51 COMPILER V7.06 PCA_UART_HOST 02/25/2009 10:35:51 PAGE 8
428 3 CCAP1H = (uint8)( Tx_time >> 8 );
429 3 }
430 2 }
431 1 else
432 1 { //发送起始位
433 2 TXD_PIN = 0;
434 2 Tx_state = S_TX_DATA_BIT;
435 2 Tx_count = 0x08;
436 2 Tx_shift = Tx_buffer;
437 2 Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
438 2 Tx_time += TX_FULL_BIT;
439 2 CCAP1L = (uint8)Tx_time;
440 2 CCAP1H = (uint8)( Tx_time >> 8 );
441 2 }
442 1 }
443
444 /******************************************************************************
445 函数:delay()
446 功能:延时函数
447 说明:这里采用的是软件延时 ,延时一点时间
448 ******************************************************************************/
449
450 void delay(uint16 idata In,uint16 idata Out)
451 {
452 1 uint16 idata i,j;
453 1 for( i = 0;i < In;i++ )
454 1 {
455 2 for( j = 0;j < Out;j++ )
456 2 {
457 3 ;
458 3 }
459 2 }
460 1 }
461
462 /******************************************************************************
463 函数:PCA_IRQ()
464 功能:PCA串口中断服务程序
465 说明:采用PCA作串口时,模块1作发送端,模块0作接收端
466 ******************************************************************************/
467
468 void PCA_IRQ(void) interrupt 7
469 {
470 1 if( CCF0 == 1 )//模块0作为接收端
471 1 {
472 2 CCF0 = 0;
473 2 Receive();//接收函数
474 2 }
475 1 if( CCF1 == 1 )//模块1作发送端
476 1 {
477 2 CCF1 = 0;
478 2 Transmit();//发送函数
479 2 }
480 1 }
481
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 803 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 1
C51 COMPILER V7.06 PCA_UART_HOST 02/25/2009 10:35:51 PAGE 9
IDATA SIZE = 16 4
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 + -